Руководство по Docker Compose: Управление многоконтейнерными приложениями
Определение и управление многоконтейнерными приложениями с Docker Compose: зависимости сервисов, переменные окружения, проверки работоспособности, масштабирование и развёртывание в production. Полное руководство.
Руководство по Docker Compose: Управление многоконтейнерными приложениями
Docker Compose — инструмент, позволяющий определять и управлять несколькими Docker-контейнерами с помощью единого YAML-файла. Он незаменим для микросервисных архитектур, веб-приложений и сред разработки.
Что такое Docker Compose?
С Docker Compose вы можете:
Определять несколько сервисов в одном файле docker-compose.yml
Управлять зависимостями между сервисами
Централизованно управлять конфигурациями сетей и томов
Запускать/останавливать весь стек одной командой
Docker Compose v2 запускается командой docker compose (без дефиса) и интегрирован в Docker CLI. Старая команда docker-compose по-прежнему поддерживается.
Добавьте .env в .gitignore. Никогда не коммитьте конфиденциальную информацию в Git.
Масштабирование (--scale)
Вы можете горизонтально масштабировать сервисы с Docker Compose:
hljs bash
# Запустить сервис api с 3 экземплярами
docker compose up -d --scale api=3
# Изменить количество запущенных экземпляров
docker compose up -d --scale api=5
# Масштабировать конкретный сервис
docker compose scale api=3 worker=2
Конфигурация балансировщика нагрузки для масштабирования:
hljs yaml
services:nginx:image:nginx:alpineports:-"80:80"volumes:-./nginx.conf:/etc/nginx/nginx.conf:rodepends_on:-apiapi:build:./api# Не определяйте ports — nginx будет маршрутизироватьexpose:-"3000"environment:NODE_ENV:production
Override-файлы
Используйте override-файлы для разных окружений:
hljs yaml
# docker-compose.override.yml (разработка)services:app:build:context:.target:developmentvolumes:-.:/app-/app/node_modulesenvironment:NODE_ENV:developmentcommand:npmrundevdb:ports:-"5432:5432"# Открыть наружу в разработке
# Разработка (override применяется автоматически)
docker compose up -d
# Production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# Запустить все сервисы
docker compose up -d
# Запустить конкретный сервис
docker compose up -d api
# Следить за логами
docker compose logs -f
docker compose logs -f api
# Остановить сервисы
docker compose down
# Остановить сервисы и удалить тома
docker compose down -v
# Перезапустить сервис
docker compose restart api
# Просмотреть статус сервисов
docker compose ps
# Выполнить команду в сервисе
docker compose exec api bash
# Пересобрать образы
docker compose build --no-cache
docker compose up -d --build
# Проверить конфигурацию
docker compose config
Заключение
Docker Compose — наиболее практичный способ управления многоконтейнерными приложениями. Он обеспечивает согласованную среду от разработки до production. С override-файлами можно гибко настраивать разные окружения, а с healthcheck и depends_on — безопасно управлять зависимостями сервисов.
Часто задаваемые вопросы
Что делает команда docker compose config?
'docker compose config' показывает итоговую конфигурацию после применения всех override-файлов и переменных окружения. Полезна для отладки и проверки правильности конфигурации.
Я использую depends_on, но сервис пытается подключиться до готовности зависимости. Почему?
'depends_on' по умолчанию ждёт только запуска контейнера, а не его готовности. Используйте 'condition: service_healthy', чтобы ждать прохождения healthcheck. Также рекомендуется добавить логику повторных попыток в приложение.
Подходит ли Docker Compose для production?
Docker Compose подходит для развёртывания на одном сервере. Если нужна оркестрация на нескольких серверах, предпочтительнее Kubernetes или Docker Swarm. Docker Compose широко используется в production для приложений малого и среднего масштаба.
Как переменные из файла .env используются в docker-compose.yml?
Docker Compose автоматически читает файл .env в том же каталоге. Обращайтесь к значениям с синтаксисом '${VARIABLE_NAME}'. Например: 'image: myapp:${APP_VERSION:-latest}'. Используйте ':-' для значений по умолчанию.
Как избежать конфликтов портов при масштабировании сервисов?
Используйте 'expose' вместо 'ports' для масштабируемых сервисов. Expose открывает порт только для внутренней сети. Направляйте внешний трафик через балансировщик нагрузки (nginx, traefik). Так несколько экземпляров могут использовать один и тот же внутренний порт.
В чём разница между docker compose down и docker compose stop?
'docker compose stop' останавливает контейнеры, но не удаляет их. 'docker compose down' останавливает и удаляет контейнеры. Флаг '-v' также удаляет тома. 'stop' рекомендуется для разработки, 'down' следует использовать осторожно в production.
Создание CI/CD-пайплайнов с GitHub Actions: сборка и публикация Docker, развёртывание на сервере по SSH, автоматизация тестов, управление секретами и оптимизация рабочих процессов.
Установка Ansible, файл инвентаря, написание playbook, структура ролей, переменные, зашифрованный vault, ad-hoc команды и автоматизация конфигурации серверов. Пошаговое руководство.