[Python Intermediate] Урок 2. Docker и docker-compose

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Алоха!

Всё, что написано ниже, является прямым продолжением предыдущего материала, и если ты его пропустил, то многое покажется тебе непонятным или неочевидным. Поэтому я рекомендую не торопиться и соблюдать последовательность.

И ещё важный момент — если ты совсем не знаком с Docker, то прежде чем двигаться дальше, обязательно почитай про основы данной технологии, благо статей в интернете немало, например, вот. Или хотя бы ознакомься с моей памяткой (VK, Github). Просто чтобы понимать, о чём вообще речь.

Docker — это платформа контейнеризации с открытым исходным кодом, с помощью которой можно автоматизировать создание приложений, их доставку и управление. Платформа позволяет быстрее тестировать и выкладывать приложения, запускать на одной машине требуемое количество контейнеров.

Благодаря контейнеризации и использованию Docker, разработчики больше не задумываются о том, в какой среде будет функционировать их приложение и будут ли в этой в среде необходимые для тестирования опции и зависимости. Достаточно упаковать приложение со всеми зависимостями и процессами в контейнер, чтобы запускать в любых системах: Linux, Windows и macOS. Платформа Docker позволила отделить приложения от инфраструктуры. Контейнеры не зависят от базовой инфраструктуры, их можно легко перемещать между облачной и локальной инфраструктурами.

Не переживай, супер глубокое понимание технологии в рамках данного материала не потребуется. Но если всё-таки очень хочется погрузиться, то на Хабре есть перевод серии статей от Джеффа Хейла.


К сожалению, в python-мире до сих пор повсеместно применяется неизолированный запуск приложения и его инфраструктуры на личных устройствах. Боюсь, даже опытные специалисты неохотно используют контейнеризацию, хотя в действительности её плюсы неоспоримы.

Во-первых, она позволяет при локальном запуске повторить среду продакшена, что может уберечь от многих неочевидных ошибок. А во-вторых, при переезде с компа на комп или при появлении нового разработчика не придётся в сотый раз корячиться с настройкой приложения и инфраструктуры. Конфигурация производится лишь однажды и в дальнейшем просто поддерживается в актуальном состоянии.

Разумеется, «контейнерная» разработка, как и всё в нашем мире, имеет свои недостатки. Главный из них сопряжён с локальной отладкой приложения — при запуске через системный интерпретатор сделать это куда проще. Однако технологии тоже не стоят на месте, и такие популярные IDE, как PyCharm Professional и VS Code, уже способны справиться с данной задачей.

Отдельной строкой следует упомянуть ещё один нюанс: при работе с докером на чипах M1 можно напороться на трудности. Не всегда очевидные, но решаемые, и ситуация постоянно улучшается.

Тизер

Чтобы понимать, к чему мы вообще стремимся, предлагаю тебе сначала установить Docker и Docker Compose.

Затем стяни этот репозиторий. В корне проекта создай директорию secrets и положи туда два файла: event_broker_password и service_db_password. В первый файл впиши python_garden, а во второй — postgres.

Проверь, всё ли правильно получилось? (Команда cat выводит содержимое файла).

cat secrets/event_broker_password
> python_garden
cat secrets/service_db_password
> postgres

Введи в терминале из корня проекта следующую команду:

docker compose up -d

После того, как её выполнение закончится, введи:

docker compose ps

В результате у тебя должно получиться следующее:

Список запущенных контейнеров
Список запущенных контейнеров

Если ты счастливый обладатель компа с чипом M1, то смотри README.

Теперь, чтобы убедиться в правдивости напечатанных статусов, выведи логи любого сервиса при помощи команды docker compose logs <service> (имена в столбце SERVICE).

Логи консьюмера: распечатаны объекты с переменными окружения из первого урока
Логи консьюмера: распечатаны объекты с переменными окружения из первого урока

Также можешь дёрнуть апишку из предыдущего урока обычным курлом: curl http://0.0.0.0:8000.

Логи апишки: распечатан объект с переменными окружения из первого урока
Логи апишки: распечатан объект с переменными окружения из первого урока

При желании открой адрес http://0.0.0.0:8000 в браузере и убедись в наличии идентичного ответа.

Ну и напоследок небольшой бонус. Зайди на http://0.0.0.0:15672, введи в оба поля python_garden и нажми «Login».

Добро пожаловать в веб-интерфейс локального RabbitMQ! Вот так просто.

Web-интерфейс RabbitMQ
Web-интерфейс RabbitMQ

Прежде чем продолжить, давай откатимся в самое начало и удалим всё, что мы создали на данном этапе. Введи поочерёдно следующие команды:

docker compose down
docker system prune --all

Dockerfile

Знакомство с контейнеризацией мы начнём с описания докер-файла (./Dockerfile), где будут перечислены инструкции для сборки нужного нам образа.

FROM python:3.9-slim as base
LABEL maintainer="Make <russian.it@great.again>"

# Сборка зависимостей
ARG BUILD_DEPS="curl"
RUN apt-get update && apt-get install -y $BUILD_DEPS

# Установка poetry
RUN curl -sSL https://install.python-poetry.org | POETRY_VERSION=1.2.0 POETRY_HOME=/root/poetry python3 -
ENV PATH="${PATH}:/root/poetry/bin"

# Инициализация проекта
WORKDIR /opt/lesson_2
ENTRYPOINT ["./docker-entrypoint.sh"]

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Установка питонячьих библиотек
COPY poetry.lock pyproject.toml /
RUN poetry config virtualenvs.create false && \
    poetry install --no-interaction --no-ansi

# Копирование в контейнер папок и файлов.
COPY . .

Источник: https://habr.com/ru/post/694872/


Интересные статьи

Интересные статьи

Последние пару лет я помогаю клиентам нашего облака внедрять DevOps-практики и делюсь своим опытом инженера DevOps. К сожалению, вопросы про информационную безопасность в...
В этой статье мы подготовим окружение для запуска контейнеров в Windows 10 и создадим простое контейнеризированное приложение .NET Читать далее
Сегодня мне попался весьма любопытный баг: Docker for Windows не запустится, если у вас запущена панель управления драйвером Razer Synapse. Но интереснее всего то, почему так случилось… ...
Во многих инструкциях с просторов интернета описывают некий минимум действий, и как следствие минимум команд и возможностей. Я решил сделать некую подборку мало освещенных возможностей, особенно...
В «1С-Битрикс» считают: современный интернет-магазин должен быть визуально привлекательным, адаптированным для просмотра с мобильных устройств и максимально персонализированным с помощью технологии Бо...