Docker Compose: руководство по использованию и практике
Docker Compose позволяет описывать и запускать многоконтейнерные приложения на одном хосте с помощью файла docker-compose.yaml. В статье объяснено, как устроен файл YAML, какие команды чаще всего нужны, лучшие практики, ограничения и сценарии, когда выбирать альтернативы вроде Kubernetes.
Что такое Docker Compose
Docker Compose — это лёгкий инструмент оркестрации контейнеров, работающий поверх Docker Engine. Он даёт простой способ описать несколько сервисов, их тома, сети и переменные окружения в одном YAML файле и запускать их как единое приложение на одном хосте.
Определения в одну строку:
- Контейнер — изолированный процесс с файловой системой и сетевыми настройками.
- Сервис — логическая роль в приложении, запускаемая как контейнер.
- tom/volume — постоянное хранилище для данных между перезапусками.
Зачем использовать Docker Compose
- Быстро собрать локальную среду разработки для full‑stack приложения.
- Описать stack для тестов CI и интеграционных прогонов.
- Упрощённое управление зависимостями между сервисами без написания отдельного оркестрационного кода.
Важно: Compose оптимален для одного хоста и небольших production окружений. Для распределённой оркестрации подойдёт Kubernetes или Docker Swarm.
Проверка наличия Docker Compose
Docker Compose обычно идёт в составе установки Docker Desktop на macOS и Windows или как отдельный плагин для Linux. Чтобы проверить установку, выполните:
docker-compose versionКоманда вернёт версию docker-compose и сопутствующую информацию.
Если Compose отсутствует, установите Docker Engine, затем следуйте официальной инструкции установки Compose для вашей ОС.
Структура файла docker-compose.yaml
Compose использует YAML для описания конфигурации. Файл обычно называется docker-compose.yaml и находится в корне проекта.
Короткая схема:
version: '3.9'
services:
web:
build: .
ports:
- '8080:8080'
volumes:
- './data:/var/data'
database:
image: 'redis:alpine'
environment:
- 'USERNAME=yourUser'
- 'PASSWORD=p@wen'Обязательные понятия:
- version — версия формата Compose.
- services — список сервисов (каждый сервис станет контейнером или набором контейнеров).
- build — путь к Dockerfile или объект build с контекстом и dockerfile.
- image — имя образа, если не требуется локальная сборка.
- ports — маппинг портов host:container.
- volumes — связи томов между хостом и контейнером.
- environment — переменные окружения.
Советы по написанию YAML:
- Используйте относительный путь в build, чтобы конфигурация была переносимой.
- Не храните секреты в файле; используйте .env или секреты Docker для production.
- Разделяйте dev и prod конфигурации с помощью docker-compose.override.yaml или профилей.
Основные команды Docker Compose
- Сборка образов
docker-compose build- Запуск сервиса (однократный запуск с аргументом) или контейнера по имени сервиса
docker-compose run - Вывод списка образов, связанных с compose
docker-compose images- Сборка и запуск всего стека
docker-compose upДля запуска в фоне используйте опцию -d
Просмотр запущенных контейнеров
docker-compose ps- Остановка и удаление контейнеров, сетей и сетевых ресурсов, созданных compose
docker-compose down- Остановка контейнеров без удаления
docker-compose stop- Перезапуск конкретного сервиса
docker-compose restart - Просмотр логов
docker-compose logs -f Практические рекомендации и лучшие практики
Разделяйте конфигурации по окружениям
- docker-compose.yaml для общих настроек
- docker-compose.override.yaml для локальной разработки
- docker-compose.prod.yaml для production
Управление секретами
- Не помещайте пароли и ключи в YAML. Используйте внешние секреты, .env файлы, или менеджеры секретов в CI.
Мониторинг и логирование
- Пробрасывайте логи в centralised logger или в файловую систему хоста через volumes.
Сетевые практики
- Определяйте user-defined сети для изоляции трафика между сервисами.
Тестирование
- Пишите интеграционные тесты, которые поднимают compose в CI, прогоняют тесты и уничтожают окружение.
Кэширование сборки
- Используйте слои в Dockerfile для ускорения сборки и сохраняйте промежуточные образы при необходимости.
Когда Docker Compose подходит, а когда нет
Подходит когда:
- Нужна простая локальная среда разработки.
- Сервисы размещаются на одном физическом или виртуальном хосте.
- Требуется быстрое повторяемое окружение для CI.
Не подходит когда:
- Требуется масштабирование по множеству хостов.
- Нужны сложные политики сетевой безопасности и авто‑масштабирование.
- Требуется сильная интеграция с облачными контроллерами развёртывания.
В таких случаях рассматривайте Kubernetes или управляемые сервисы вроде AWS ECS, GKE, EKS.
Альтернативные подходы
- Docker Swarm — встроенная в Docker система оркестрации с простым API и меньшей кривой обучения, чем Kubernetes.
- Kubernetes — промышленный стандарт для распределённой оркестрации, мощный, но сложный.
- Nomad — лёгкий оркестратор от HashiCorp, хорошо подходит для мультиподов и смешанных рабочих нагрузок.
Мини методология: от кода к среде за 5 шагов
- Написать Dockerfile для каждого сервиса.
- Создать docker-compose.yaml с сервисами, томами и сетями.
- Протестировать локально: docker-compose up и проверка логов.
- Интегрировать в CI: поднимать compose, запускать тесты, удалять стек.
- Для production: вынести секреты, использовать образ в registry и CI/CD для развёртывания.
Шаблоны и чек-листы
Чек-лист разработчика перед пушем в репозиторий:
- Dockerfile собирается без предупреждений
- docker-compose up запускает стэк в режиме dev
- Тома корректно монтируются и не перезаписывают важные данные
- Не хранится никаких секретов в YAML
- Логи читаемы и направлены в нужное место
Чек-лист оператора перед релизом в production:
- Все образы проверены и подписаны
- Секреты вынесены в manager/secret store
- Политики рестартов и ограничений ресурсов заданы
- Есть план отката и инструкции для ручной остановки
Пример playbook: поднять приложение и откатить
SOP чтобы быстро поднять приложение локально:
- Клонировать репозиторий и перейти в папку проекта.
- Проверить наличие .env и заполнить необходимые переменные.
- Выполнить docker-compose build.
- Выполнить docker-compose up -d.
- Проверить состояние docker-compose ps и логи.
Откат/отключение:
- docker-compose down –volumes –remove-orphans
- Проверить, что не осталось нежеланных контейнеров и томов.
Критерии приёмки
Система считается корректно развернутой, если:
- Все сервисы находятся в статусе Up в docker-compose ps.
- Основные endpoint’ы приложения возвращают ожидаемые ответы.
- Логи не содержат критических ошибок в течение 5 минут после старта.
- Резервные тома доступны и содержат ожидаемые данные.
Командные сниппеты и примеры
Примеры для повседневных операций:
- Запустить и пересобрать образы при изменениях
docker-compose up --build -d- Просмотреть логи в реальном времени
docker-compose logs -f- Масштабировать экземпляры сервиса (для сервисов, поддерживающих масштабирование)
docker-compose up -d --scale web=3- Принудительно пересоздать контейнеры без кэша
docker-compose build --no-cache && docker-compose up -d --force-recreateМентальные модели и эвристики
- Разделяй конфигурацию и секреты: конфигурация в YAML, секреты в store.
- Один сервис — одна ответственность. Если сервис делает много вещей, подумайте о декомпозиции.
- Локальное поведение должно максимально приближаться к тестовому окружению, но без хранения секретов прямо в репозитории.
Decision flowchart для выбора между Compose и Kubernetes
flowchart TD
A[Нужно оркестрация контейнеров?] --> B{Один хост или много?}
B -->|Один хост| C[Docker Compose]
B -->|Несколько хостов или облако| D{Требуется автоуправление и масштабирование?}
D -->|Да| E[Kubernetes]
D -->|Нет, нужна простота| F[Docker Swarm или управляемый сервис]Короткий глоссарий
- Compose — инструмент для определения и запуска многоконтейнерных приложений.
- Image — слепок файловой системы и метаданных, из которого создают контейнер.
- Volume — постоянное хранилище данных для контейнера.
- Network — логическая сеть, связывающая контейнеры между собой.
Безопасность и конфиденциальность
- Не храните секреты в docker-compose.yaml в виде plain text.
- Ограничивайте привилегии контейнеров и используйте non-root пользователя внутри контейнера.
- При необходимости применяйте политики контроля доступа на уровне хоста и registry.
Совместимость и миграция
- Большинство конфигураций версии 3.x совместимы между собой, но проверяйте доступность функций в вашей версии Docker Engine.
- Для перехода на Kubernetes рассмотрите инструменты конвертации, но планируйте ручную проверку сетевых политик и секретов.
Когда Docker Compose может провалиться
- При потребности динамически масштабировать базу данных на несколько узлов.
- Когда требуется сложный балансировщик нагрузки между хостами.
- Для распределённых транзакций и требовательных SLA лучше выбрать более зрелую систему оркестрации.
Заключение
Docker Compose остаётся мощным инструментом для разработки, тестирования и лёгких production-стеков. Он прост в изучении и позволяет быстро описывать многоконтейнерные приложения. При росте требований по надёжности, масштабированию и сетевой безопасности следует рассмотреть миграцию на более сложные решения.
Важно: начинайте с простого и эволюционируйте архитектуру по мере роста нагрузки и числа хостов.
Ключевые шаги для старта: подготовить Dockerfile, написать docker-compose.yaml, протестировать локально и интегрировать в CI.
Похожие материалы
6 внешних батарей и зарядных для ноутбука
Как умножать в Excel — полное руководство
Instagram Cutouts: создать стикер из фото
Изменить виртуальную память в Windows 11
Создание базы данных в Microsoft Access — руководство