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

Исчерпывающее руководство по Docker Compose: от создания базового файла YAML и основных команд до продвинутых тем, таких как multi-file конфигурация для production, управление секретами, сети и интеграция в CI/CD. Руководство сопровождается видео-примерами.
Docker Compose — это незаменимый инструмент для определения и запуска многоконтейнерных приложений Docker. Он позволяет описать весь стек вашего приложения (веб-сервер, база данных, кэш, очередь сообщений) в одном декларативном YAML-файле и управлять им одной командой. Это руководство проведет вас от базовых концепций до сложных production-ориентированных сценариев, сопровождая ключевые момены видео-иллюстрациями.

В основе Compose лежит файл `docker-compose.yml`. Это человекочитаемый файл, где вы описываете сервисы, сети и тома, необходимые для работы вашего приложения. Простейший пример — приложение, состоящее из веб-сервиса на Node.js и базы данных PostgreSQL.

Базовый пример `docker-compose.yml`:
```
version: '3.8'
services:
 web:
 build: .
 ports:
 - "3000:3000"
 environment:
 - NODE_ENV=development
 - DATABASE_URL=postgres://user:pass@db:5432/mydb
 depends_on:
 - db
 volumes:
 - .:/app
 - /app/node_modules

 db:
 image: postgres:15-alpine
 environment:
 POSTGRES_USER: user
 POSTGRES_PASSWORD: pass
 POSTGRES_DB: mydb
 volumes:
 - postgres_data:/var/lib/postgresql/data

volumes:
 postgres_data:
```
В этом примере определены два сервиса. Сервис `web` собирается из Dockerfile в текущей директории, его порт 3000 публикуется на хост, задаются переменные окружения, указывается зависимость от сервиса `db` и монтируются volumes для кода и модулей. Сервис `db` использует готовый образ PostgreSQL, задает свои переменные окружения и сохраняет данные в именованном томе `postgres_data`, чтобы они сохранялись между перезапусками контейнеров.

Основные команды для работы с Compose интуитивно понятны. `docker-compose up` (или `docker compose up` в новых версиях) создает и запускает все сервисы. Флаг `-d` запускает их в фоновом режиме (detached). `docker-compose down` останавливает и удаляет контейнеры, сети, но не тома (чтобы удалить и тома, используйте `-v`). `docker-compose ps` показывает статус контейнеров, `docker-compose logs -f [service]` выводит и следует за логими конкретного сервиса. `docker-compose exec db psql -U user mydb` позволяет выполнить команду внутри уже работающего контейнера (в данном случае, подключиться к PostgreSQL).

Для разработки ключевую роль играют volumes и bind mounts. Bind mount (как `.:/app` в примере) синхронизирует директорию на хосте с директорией в контейнере. Это позволяет вносить изменения в код на локальной машине и сразу видеть их в работающем контейнере без пересборки образа — идеально для разработки. Именованные тома (как `postgres_data`) управляются Docker и являются предпочтительным способом хранения постоянных данных (данные БД, загруженные файлы).

В production-сценариях одного файла `docker-compose.yml` часто недостаточно. Здесь на помощь приходит расширение конфигурации с помощью ключевого слова `extends` или, что более современно, использование нескольких файлов. Вы можете разделить конфигурацию для разработки (`docker-compose.yml`) и для продакшена (`docker-compose.prod.yml`). Продакшен-файл может переопределять образы (использовать конкретные теги, а не `latest`), убирать mount'ы для исходного кода, добавлять секреты, настройки здоровья (healthcheck) и политики перезапуска (restart: unless-stopped).

Пример использования нескольких файлов для production:
```
# docker-compose.prod.yml
version: '3.8'
services:
 web:
 image: myregistry/myapp:1.5.0 # Используем конкретный тег из реестра
 ports:
 - "80:3000"
 environment:
 NODE_ENV: production
 # Убираем bind mount для кода
 # volumes:
 #  - .:/app
 restart: unless-stopped
 healthcheck:
 test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
 interval: 30s
 timeout: 10s
 retries: 3
 deploy: # Используется с Docker Swarm
 replicas: 2

 db:
 image: postgres:15-alpine
 environment:
 POSTGRES_PASSWORD_FILE: /run/secrets/db_password # Использование секретов
 secrets:
 - db_password
 restart: unless-stopped

secrets:
 db_password:
 file: ./secrets/db_password.txt
```
Запуск такой конфигурации осуществляется командой: `docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d`. Docker Compose объединит конфигурации, при этом значения из `prod.yml` переопределят базовые.

Для управления чувствительными данными (пароли, API-ключи) никогда не используйте plain-text переменные в файлах. Вместо этого используйте секреты Docker (Docker Secrets), которые лучше всего работают в режиме Swarm, или внешние файлы с переменными окружения (`env_file`). Для локальной разработки можно использовать файл `.env` в корне проекта, который автоматически подхватывается Compose и не должен попадать в систему контроля версий.

Сетевые возможности Compose позволяют создавать изолированные сети для группы сервисов. По умолчанию все сервисы в одном файле Compose подключаются к одной сети и могут находить друг друга по имени сервиса (как `db` в примере выше). Вы можете создавать собственные сети с определенными драйверами (bridge, overlay) для более сложных сценариев.

Хотя Docker Compose изначально создавался для разработки и тестирования, его можно использовать и для развертывания на единственном сервере (single-host deployment) в production. Для оркестрации кластеров из нескольких хостов (multi-host) используется Docker Swarm mode, который понимает файлы Compose (с добавлением секции `deploy`), или же Kubernetes, для которого файлы Compose можно конвертировать с помощью утилит вроде `kompose`.

Интеграция с CI/CD — это мощный шаг к автоматизации. Ваш `docker-compose.yml` может быть использован в пайплайне для запуска интеграционных тестов: поднять полный стек приложения, выполнить тесты и корректно завершить работу. Это гарантирует, что сервисы корректно взаимодействуют друг с другом в среде, максимально приближенной к продакшену.

Освоив Docker Compose, вы получаете в руки унифицированный, версионируемый и переносимый способ описания всей инфраструктуры вашего приложения. От локальной разработки до staging-среды и простых продакшен-развертываний, Compose значительно упрощает жизнь разработчика и DevOps-инженера, делая работу с контейнерами предсказуемой и эффективной.
167 5

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

avatar
gghrmz 27.03.2026
Наконец-то понял, зачем нужен Compose, а не просто Dockerfile. Спасибо за доступное объяснение основ!
avatar
sy8hfue2p 27.03.2026
Мне кажется, раздел про сети (networks) в Compose раскрыт слишком поверхностно. Хотелось бы больше деталей.
avatar
jst3t0vzo3 27.03.2026
Материал подаётся структурированно. От простого к сложному — именно то, что нужно для изучения.
avatar
eqczh2 27.03.2026
Отличное руководство! Как раз искал структурированную информацию по продвинутым сценариям. Жду раздел про volumes.
avatar
m9v9xoxwefma 27.03.2026
Очень жду часть про оптимизацию сборки и кэширование. Это больная тема в CI/CD пайплайнах.
avatar
2wfex652rudm 27.03.2026
Спасибо за видео-иллюстрации! Особенно полезно для визуалов, когда показывают работу команд в терминале.
avatar
ashdf4arcgm 28.03.2026
Не согласен, что Compose незаменим. Для простых проектов можно обойтись скриптами, это быстрее.
avatar
06m1euvph1 28.03.2026
Для продакшена всё равно нужен оркестратор вроде Swarm или K8s. Compose — только для разработки, имхо.
avatar
4use47w756ju 28.03.2026
Автор, добавьте, пожалуйста, сравнение с Kubernetes в контексте оркестрации. Когда что выбирать?
avatar
rj3xosp 28.03.2026
Статья хороша, но не хватает конкретных примеров файлов docker-compose для разных фреймворков (Django, Laravel).
Вы просмотрели все комментарии