Docker Compose — это инструмент, который превращает управление многоконтейнерными приложениями из рутины в простой и декларативный процесс. Если Docker помогает упаковать одно приложение, то Compose позволяет описать и запустить целый стек взаимосвязанных сервисов (веб-сервер, база данных, кэш, очередь) одной командой. Это руководство проведет вас от написания первого `docker-compose.yml` до оптимизации сложных продакшен-сценариев.
Основы: синтаксис и структура файла Compose. Файл `docker-compose.yml` описывает сервисы, сети и тома в формате YAML. Каждый сервис соответствует одному контейнеру (или нескольким в случае масштабирования). Рассмотрим базовый пример для веб-приложения на Node.js с базой данных PostgreSQL.
Пример базового docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
volumes:
- .:/app
- /app/node_modules
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Ключевые директивы: `build` указывает на Dockerfile для сборки образа, `image` использует готовый образ из реестра. `ports` мапит порты контейнера на хост. `environment` задает переменные окружения. `depends_on` определяет порядок запуска (но не гарантирует готовность БД, для этого нужны healthchecks). `volumes` используются для сохранения данных (том `postgres_data`) и монтирования кода для разработки.
Управление жизненным циклом приложения. Основные команды Compose интуитивно понятны. `docker-compose up` создает и запускает все сервисы. Флаг `-d` запускает в фоновом режиме (detached). `docker-compose down` останавливает и удаляет контейнеры, сети (по умолчанию сохраняет тома). `docker-compose ps` показывает статус контейнеров. `docker-compose logs -f [service]` выводит и следует за логими конкретного сервиса. `docker-compose exec db psql -U user mydb` позволяет выполнить команду внутри запущенного контейнера (например, подключиться к БД). Для разработки особенно полезен `docker-compose up --build`, который пересобирает образы перед запуском.
Продвинутые сценарии: настройка, сети и health checks. В production-сценариях важно обеспечить отказоустойчивость и конфигурируемость. Используйте несколько файлов Compose: базовый `docker-compose.yml`, переопределения для разработки `docker-compose.override.yml` (добавляет монтирование кода, отладочные порты) и отдельный `docker-compose.prod.yml` для продакшена (настройки безопасности, специфичные volumes). Запуск: `docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d`.
Пример продвинутой конфигурации с health check, сетями и .env:
Файл `.env` (не коммитится):
POSTGRES_PASSWORD=secure_password_123
WEB_PORT=8080
Файл `docker-compose.prod.yml`:
version: '3.8'
services:
web:
build:
context: .
target: production
ports:
- "${WEB_PORT}:3000"
environment:
NODE_ENV: production
DATABASE_URL: postgresql://user:${POSTGRES_PASSWORD}@db:5432/mydb
depends_on:
db:
condition: service_healthy
networks:
- backend
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- web
networks:
- backend
restart: unless-stopped
networks:
backend:
driver: bridge
volumes:
postgres_data:
Здесь используются переменные из `.env` файла, health check для БД (ожидание готовности), изолированная сеть `backend`, политика перезапуска `restart: unless-stopped` и добавлен сервис nginx в качестве reverse proxy.
Масштабирование и оркестрация. Docker Compose позволяет масштабировать сервисы: `docker-compose up --scale web=3`. Однако для полноценного управления кластером, балансировки нагрузки и обеспечения высокой доступности в production лучше использовать оркестратор, такой как Docker Swarm или Kubernetes. Compose файлы можно конвертировать в формат Kubernetes с помощью `docker-compose convert`. В Docker Swarm вы можете использовать файл `docker-compose.yml` практически напрямую, развернув стек командой `docker stack deploy -c docker-compose.yml myapp`.
Интеграция в CI/CD и лучшие практики. Включайте `docker-compose` в ваш пайплайн для тестирования. Пример этапа в GitLab CI:
test:
stage: test
script:
- docker-compose up -d
- docker-compose exec web npm test
- docker-compose down
Лучшие практики: никогда не хранить секреты прямо в compose-файле (используйте `.env` или Docker Secrets в Swarm). Минимизировать образы, используя multi-stage builds и указывая `target` в конфигурации. Явно задавать версию Compose файла. Использовать именованные тома для критичных данных. Регулярно обновлять базовые образы в тегах для устранения уязвимостей.
Полное руководство по Docker Compose: от основ до продвинутых сценариев с видео
Исчерпывающее руководство по Docker Compose: от создания базового файла конфигурации до продвинутых сценариев для production с health checks, сетями, масштабированием и интеграцией в CI/CD.
167
5
Комментарии (14)