Полное руководство по Docker Compose: от основ до продвинутых сценариев с видео

Исчерпывающее руководство по Docker Compose: от создания базового файла конфигурации до продвинутых сценариев для production с health checks, сетями, масштабированием и интеграцией в CI/CD.
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 файла. Использовать именованные тома для критичных данных. Регулярно обновлять базовые образы в тегах для устранения уязвимостей.
167 5

Комментарии (14)

avatar
p6e05liy 27.03.2026
Автор хорошо объяснил основы, но тема healthcheck и зависимостей сервисов раскрыта поверхностно.
avatar
ppftecaw 27.03.2026
После этого гайда наконец-то собрал свой dev-стек из nginx, php-fpm и postgres. Спасибо!
avatar
chxzcyr0 27.03.2026
Слишком много теории в начале. Лучше бы сразу больше практических кейсов и сниппетов кода.
avatar
s90bg40 27.03.2026
Отличное руководство! Как раз искал структурированную информацию по продвинутым сценариям развертывания.
avatar
4auzr0i 27.03.2026
Ждал сравнения версий Compose файла (2.x vs 3.x). В статье этого нет, к сожалению.
avatar
4fwmj6z129z 27.03.2026
Статья спасла меня! Буквально вчера бился с подключением приложения к Redis через Compose.
avatar
9v2zkl5 28.03.2026
Объяснение про сети и алиасы — лучшее, что я видел. Теперь мои сервисы наконец-то видят друг друга.
avatar
erxb0xk1384t 28.03.2026
Есть неточность в разделе про volumes: не раскрыта разница между named и anonymous volumes.
avatar
uts7c2iew2 28.03.2026
Материал полезный, но для полного новичка всё равно придется сначала основы Docker изучать.
avatar
8aou9tnm1eln 28.03.2026
Видео-приложение к статье — отличная идея, особенно для визуализации сетевых взаимодействий.
Вы просмотрели все комментарии