Docker Compose — это незаменимый инструмент для определения и запуска многоконтейнерных приложений Docker. В то время как Docker работает с отдельными контейнерами, Compose позволяет управлять целым стеком сервисов (база данных, бэкенд, фронтенд, кэш) с помощью простого YAML-файла. Это руководство проведет вас от базовых концепций до сложных production-ориентированных сценариев, сопровождая ключевые момены видео-иллюстрациями.
Основой Compose является файл `docker-compose.yml`. В его основе лежат три ключевых секции: `services` (определение контейнеров), `networks` (настройка сети) и `volumes` (управление томами для данных). Простейший пример описывает веб-приложение и базу данных.
Пример базового `docker-compose.yml`:
version: '3.8'
services:
web:
build: . # Собрать образ из Dockerfile в текущей директории
ports:
- "8000:5000" # Проброс порта хост:контейнер
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db # Указывает зависимость от сервиса db
volumes:
- ./app:/code # Монтирование кода для разработки
db:
image: postgres:15-alpine # Использование готового образа
environment:
POSTGRES_PASSWORD: secretpassword
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data/ # Сохранение данных в том
volumes:
postgres_data: # Объявление именованного тома
Для запуска этого стека используется команда `docker-compose up` (или `docker compose up` в новых версиях). Флаг `-d` запускает сервисы в фоновом режиме. `docker-compose down` останавливает и удаляет контейнеры, сети (но по умолчанию не тома). [Видео: Демонстрация создания простого файла compose, запуска и просмотра логов через `docker-compose logs`].
Одна из самых мощных функций Compose — это работа с сетями. По умолчанию Compose создает одну общую сеть (bridge) для всех сервисов файла, и они могут обращаться друг к другу по имени сервиса (как в примере выше: `db` — это хостнейм). Это избавляет от необходимости линковать контейнеры вручную. Вы можете определить кастомные сети для лучшей изоляции, например, отдельную сеть для бэкенда и БД, и фронтенда.
Переменные окружения — ключ к конфигурированию. Никогда не хардкодите пароли или ключи в YAML-файл. Используйте файл `.env` в той же директории или передавайте переменные через окружение хоста. Compose автоматически подхватит переменные из `.env`.
Пример `.env` файла:
DB_PASSWORD=supersecret
WEB_PORT=8080
Использование в `docker-compose.yml`:
db:
image: postgres
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
web:
ports:
- "${WEB_PORT}:5000"
Для разработки бесценны volumes с bind mount, которые монтируют локальный код в контейнер, позволяя видеть изменения без пересборки образа. Для production же следует использовать только собранные образы и именованные тома для сохранения состояния. [Видео: Показ "живой" перезагрузки фронтенд-приложения при изменении файла на хосте благодаря volume].
Продвинутые сценарии включают в себя использование нескольких Compose-файлов. Это лучшая практика для управления разными средами (development, testing, production). Вы можете иметь базовый `docker-compose.yml` и переопределяющий `docker-compose.override.yml` для разработки (добавляет volumes, отладочные порты). Для production можно создать отдельный `docker-compose.prod.yml`.
Запуск с переопределением: `docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d`.
В production-файле вы можете изменить политику рестарта (`restart: always`), убрать монтирование кода, добавить более строгие настройки, использовать специфичные production-образы.
Еще один продвинутый паттерн — это управление зависимостями и порядком запуска. Хотя `depends_on` гарантирует только порядок *запуска* контейнеров, но не их *готовность*. Для проверки готовности сервиса (например, когда БД приняла подключения) используйте healthchecks в определении сервиса и условие `condition: service_healthy` в зависимостях.
Пример healthcheck для БД:
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
web:
depends_on:
db:
condition: service_healthy
Docker Compose также интегрируется с Docker Swarm (через `docker stack deploy`) для простого развертывания на кластере, хотя для сложных оркестраций предпочтительнее Kubernetes.
В заключение, Docker Compose — это мост между простотой локальной разработки и дисциплиной production-развертывания. Начиная с простого файла из двух сервисов, вы постепенно приходите к сложным, модульным конфигурациям, управляемым через переменные и несколько файлов. Это делает его идеальным инструментом для CI/CD пайплайнов, где один и тот же файл (или его производная) может использоваться для тестирования и последующего деплоя. [Видео: Обзор полного цикла: от разработки с override-файлом до сборки production-образов и деплоя с prod-файлом].
Полное руководство по Docker Compose: от основ до продвинутых сценариев с видео
Исчерпывающее руководство по Docker Compose: от создания базового YAML-файла и запуска многоконтейнерных приложений до продвинутых тем (переменные окружения, healthchecks, multiple compose files) с видео-примерами ключевых действий.
167
5
Комментарии (14)