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-инженера, делая работу с контейнерами предсказуемой и эффективной.
Полное руководство по Docker Compose: от основ до продвинутых сценариев с видео
Исчерпывающее руководство по Docker Compose: от создания базового файла YAML и основных команд до продвинутых тем, таких как multi-file конфигурация для production, управление секретами, сети и интеграция в CI/CD. Руководство сопровождается видео-примерами.
167
5
Комментарии (14)