Введение в автоматизацию с Docker Compose
Автоматизация процессов разработки становится ключевым фактором успеха в современном программировании. Инструмент Docker Compose (документация доступна на docs.docker.com/compose/) предлагает простой способ настройки и запуска сред разработки с использованием контейнеров Docker. Он использует файлы в формате YAML (YAML Ain’t Markup Language), чтобы описывать конфигурацию групп контейнеров, что позволяет минимизировать ручной труд, избежать ошибок и повторного написания кода. Хотя простые приложения, такие как наш текущий пример, могут не раскрыть всех преимуществ Compose, сложные проекты быстро демонстрируют его ценность, упрощая управление контейнерами, их запуск, обновление и остановку.
Что такое Docker Compose и зачем он нужен?
Docker Compose — это инструмент, который автоматизирует управление несколькими контейнерами как единым приложением. Он особенно полезен при работе с микросервисной архитектурой, где требуется синхронизация нескольких сервисов. Вместо выполнения длинных команд docker run вручную, вы определяете все параметры в одном файле YAML, а Compose берет на себя запуск и конфигурацию. Это снижает вероятность ошибок и ускоряет разработку, особенно когда проект включает базы данных, веб-серверы и другие зависимости.
Если Docker установлен через Docker Toolbox (на macOS или Windows), Compose обычно уже доступен. В противном случае установите его, следуя инструкциям на docs.docker.com/compose/install. В этой статье используется версия 1.4.0, но основная функциональность поддерживается с версии 1.2 и выше.
Настройка базового проекта с Compose
Возьмем наш существующий проект identidock и добавим автоматизацию с помощью Compose. В корневом каталоге identidock создадим файл docker-compose.yml со следующим содержимым:
identidock:
build: .
ports:
- "5000:5000"
environment:
ENV: DEV
volumes:
- ./app:/app
- identidock: Имя сервиса (контейнера). В одном YAML-файле можно определить несколько сервисов.
- build: .: Указывает, что образ создается из
Dockerfileв текущем каталоге. - ports: — «5000:5000»: Аналог флага
-pвdocker run, связывает порт 5000 контейнера с портом 5000 хоста. - environment: ENV: DEV: Устанавливает переменную окружения
ENVкакDEVдля запуска Flask в режиме разработки. - volumes: — ./app:/app: Монтирует подкаталог
appхоста в/appконтейнера для быстрого редактирования кода.
Этот файл заменяет предыдущие команды docker run и упрощает управление проектом.
Запуск и тестирование приложения
Запустите приложение с помощью команды:
$ docker-compose up
Creating identidock_identidock_1...
Attaching to identidock_identidock_1
identidock_1 | Running Development Server
identidock_1 | * Running on http://0.0.0.0:5000/
identidock_1 | * Restarting with reloader
Эта команда создает и запускает контейнер, отображая логи в текущем времени. Проверьте работу сервера в новом терминале:
$ curl localhost:5000
Hello Docker!
Для остановки используйте Ctrl+C. Для фонового режима добавьте флаг -d: docker-compose up -d.
Переключение между режимами разработки и эксплуатации
Чтобы переключиться на эксплуатационный режим с uWSGI, отредактируйте docker-compose.yml, изменив ports и environment:
identidock:
build: .
ports:
- "9090:9090"
- "9191:9191"
environment:
ENV: PROD
volumes:
- ./app:/app
Здесь порт 9090 используется для HTTP, а 9191 — для статистики uWSGI. Переменная ENV: PROD активирует эксплуатационный режим. После изменения выполните:
$ docker-compose up -d
$ curl localhost:9090
Hello Docker!
Альтернативно, создайте отдельный файл, например docker-compose-prod.yml, и используйте docker-compose -f docker-compose-prod.yml up -d.
Основные команды Docker Compose
Compose предоставляет набор команд для управления контейнерами. Вот основные из них:
- up: Запускает все сервисы из YAML-файла. С флагом
-dработает в фоновом режиме. - build: Пересоздает образы из
Dockerfile. Используется при обновлении кода. - ps: Показывает состояние контейнеров.
- run: Выполняет одноразовую команду в контейнере (без создания портов по умолчанию).
- logs: Выводит логи всех контейнеров с цветной подсветкой.
- stop: Останавливает контейнеры без удаления.
- rm: Удаляет остановленные контейнеры (с флагом
-vудаляет тома).
Типичный рабочий процесс: docker-compose up -d для запуска, docker-compose logs и ps для мониторинга, docker-compose build и up -d при изменении кода. Для принудительного пересоздания используйте --force-recreate.
Расширенные возможности и лучшие практики
Compose поддерживает дополнительные параметры, такие как depends_on для определения зависимостей между сервисами и networks для настройки сетей. Пример с зависимостью базы данных:
version: '2'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- ./app:/app
depends_on:
- db
db:
image: postgres:9.4
environment:
POSTGRES_DB: mydb
Рекомендуется хранить конфигурацию в отдельном файле .env для переменных окружения:
ENV=DEV
PORT=5000
Импортируйте его с env_file: .env в docker-compose.yml. Это улучшает переносимость и безопасность.
Управление обновлениями и отладка
При изменении кода выполните docker-compose build, затем docker-compose up -d. Если данные в томах (например, базы данных) должны сохраняться, убедитесь, что тома монтируются корректно. Для отладки используйте docker-compose logs и добавьте логирование в код, как показано ранее.
Заключение
Docker Compose упрощает автоматизацию разработки, делая управление контейнерами интуитивным и эффективным. Мы настроили простой веб-сервер, добавили переключение режимов и изучили ключевые команды. Этот подход готов к расширению для сложных проектов.
Отзывы