Docker Compose: быстрое руководство по настройке, командам и примерами

Что такое Docker Compose?
Docker Compose — это простой инструмент оркестрации контейнеров, построенный на основе Docker Engine. Он позволяет запускать и управлять набором взаимосвязанных контейнеров через единый YAML-файл конфигурации. Compose чаще всего применяют для локальной разработки, тестирования интеграций и небольших продакшен-развертываний.
Краткое определение: Docker Compose — файл-ориентированный менеджер сервисов, который работает поверх Docker Engine.
Почему он полезен:
- Упрощает запуск многосервисных приложений (например, веб-приложение + база данных + кеш).
- Снижает количество конфигураций, которые нужно запоминать и запускать вручную.
- Подходит для CI, локальной отладки и быстрых прототипов.
Важно: Docker Compose не заменяет крупные системы оркестрации (например, Kubernetes) для распределённых кластеров.
Установка и проверка наличия Docker Compose
Docker Compose идёт в комплекте с Docker Desktop на macOS и Windows. На Linux он может быть установлен как отдельный пакет или как плагин docker-compose.
Проверьте установку командой:
docker-compose versionЕсли команда вернёт версию и сборку — Compose установлен. Если нет — установите Docker Engine и затем следуйте официальной инструкции для вашей ОС.
Структура docker-compose.yaml — ключевые секции
Файл называется обычно docker-compose.yaml или docker-compose.yml и размещается в корне проекта. Он описывает сервисы, тома, сети и настройки сборки.
Минимальная схема:
version: '3.9'
services:
web:
build: .
ports:
- "8080:8080"
volumes:
- "/home:/away"
database:
image: "redis:alpine"
environment:
- "USERNAME=yourUser"
- "PASSWORD=p@wen"Разбор полей:
- version: версия синтаксиса Compose (совместимость с Docker Engine). Рекомендуется ‘3.8’ или выше для современных функций.
- services: набор сервисов (контейнеров) вашего приложения.
- build: путь к Dockerfile или объект build с контекстом и параметрами.
- image: имя образа (если не собираете локально).
- ports: проброс портов в формате “хост:контейнер“.
- volumes: примонтированные тома или директории.
- environment: переменные окружения.
- depends_on: порядок зависимостей между сервисами (не эквивалент готовности сервиса).
- networks: определение пользовательских сетей.
- volumes: объявленные тома для устойчивого хранения данных.
Совет: для конфиденциальных данных используйте переменные окружения из .env или ключи секретов, а не хардкод в YAML.
Пример полного файла для простого приложения
version: '3.9'
services:
web:
build:
context: .
dockerfile: Dockerfile
image: myapp:latest
ports:
- "8080:8080"
volumes:
- ./src:/app/src
environment:
- "NODE_ENV=development"
depends_on:
- redis
redis:
image: redis:alpine
volumes:
- redis-data:/data
volumes:
redis-data:
driver: local
networks:
default:
driver: bridgeПояснение: web собирается из текущей директории, пробрасывает код для локальной разработки. Redis хранит данные в томе redis-data.
Основные команды docker-compose — шпаргалка
- Сборка образов:
docker-compose build- Запуск сервисов (build + run):
docker-compose upДобавьте -d для запуска в фоновом режиме:
docker-compose up -d- Остановка и удаление контейнеров, сетей и томов (опционально):
docker-compose down- Показать запущенные контейнеры:
docker-compose ps- Запустить одну команду в сервисе:
docker-compose run --rm web python manage.py migrate- Посмотреть логи:
docker-compose logs -f web- Список образов, описанных в файле:
docker-compose images- Остановка без удаления:
docker-compose stopВажно: команда down по умолчанию удаляет контейнеры, сети и мосты, но не тома без флага –volumes.
Когда Docker Compose работает хорошо, а когда не подходит
Подходит когда:
- Локальная разработка и тестирование.
- Небольшие продакшен-сценарии на одиночном хосте.
- Быстрые интеграционные тесты в CI.
Не подходит когда:
- Нужно горизонтальное масштабирование в кластере (несколько хостов).
- Требуется сложная автоматическая балансировка, самовосстановление и rolling обновления на уровне кластера.
Альтернативы:
- Kubernetes — для распределённых кластеров и сложной оркестрации.
- Docker Swarm — встроенная оркестрация Docker, проще чем Kubernetes, но менее распространена.
Лучшие практики и безопасность
- Разделяйте окружения: используйте разные docker-compose файлов для dev и prod (например, docker-compose.override.yml).
- Храните секреты в менеджерах секретов (Vault, Docker Secrets в Swarm) или в CI, не в YAML.
- Не пробрасывайте корневые директории хоста в контейнер (опасно для безопасности).
- Указывайте конкретные версии образов, не используйте latest в продакшене.
- Ограничивайте ресурсы: используйте deploy.resources или ресурсы Docker Engine для контроля CPU/памяти (работает в некоторых режимах).
- Минимизируйте права контейнеров: user в Dockerfile, read-only тома, no-new-privileges.
Короткая проверка безопасности (SANS-подход): минимальные права, за пределы контейнера только необходимые порты, отдельные тома для данных.
Отладка и типичные проблемы
- Контейнер зависает при старте: проверьте логи через docker-compose logs
- Сервис считает, что зависимость запущена, но не готова: depends_on не ждёт готовности; добавьте healthcheck и проверку в приложении.
- Порт занят на хосте: проверьте, нет ли локальных процессов на том же порту.
- Ошибки файловых путей на Windows: используйте относительные пути и проверьте формат путей (\ vs /).
Пример healthcheck в docker-compose:
services:
db:
image: postgres:13
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5Роль-ориентированные чек-листы
Для разработчика:
- Проверить локальный docker-compose up -d
- Убедиться, что код в volume смонтирован и hot-reload работает
- Логи доступны: docker-compose logs -f
Для инженера DevOps:
- Настроить CI, который запускает docker-compose build + up для тестов
- Хранить секреты вне YAML
- Создать production-ready docker-compose с ограничениями ресурсов
Для QA:
- Прогнать интеграционные тесты в окружении, собранном через docker-compose
- Использовать чистые тома для воспроизводимости тестов
Критерии приёмки
- Все сервисы стартуют без ошибок: docker-compose up завершает запуск, логи не содержат ошибок.
- Сервисы взаимодействуют по описанным портам и сетям.
- После docker-compose down все временные контейнеры удалены; при необходимости данные сохраняются в томах.
- Автоматизированные тесты проходят в окружении, созданном Compose.
Ментальные модели и советы по переходу на Kubernetes
Ментальная модель: Compose — это набор деклараций «что» запускать на одном хосте; Kubernetes — декларация «как» и «где» запускать на кластере.
Если вы растёте из Compose в Kubernetes:
- Сначала разбейте приложение на независимые сервисы с понятными контрактами.
- Переходите на манифесты Kubernetes, Helm-чарты или Kompose (конвертер docker-compose в k8s-манифесты) аккуратно и поэтапно.
Шаблоны и примеры
Чек-лист для простого CI (пример):
- checkout
- docker-compose -f docker-compose.ci.yml build –parallel
- docker-compose -f docker-compose.ci.yml up -d
- run тесты
- docker-compose -f docker-compose.ci.yml down –volumes
Мини-методология разработки:
- Опишите сервисы и зависимости в docker-compose.yaml
- Создайте Dockerfile для каждого сервиса
- Локально тестируйте через docker-compose up
- Интегрируйте сборку в CI
- При масштабировании оцените переход на k8s
Полезная шпаргалка команд (cheat sheet)
- build: docker-compose build
- up (foreground): docker-compose up
- up (background): docker-compose up -d
- down: docker-compose down
- stop: docker-compose stop
- ps: docker-compose ps
- logs: docker-compose logs -f
- run one-off: docker-compose run –rm
Краткий глоссарий (1 строка)
- Сервис — контейнер, описанный в docker-compose.yaml; образ — результат сборки или готовый Docker-образ; том — постоянное хранилище данных вне контейнера.
Итог
Docker Compose — мощный и простой инструмент для управления многосервисными приложениями на одном хосте. Он ускоряет локальную разработку и тестирование, но имеет ограничения при масштабировании на кластеры. Применяйте best practices по безопасности, используйте healthcheck для надёжности и отделяйте конфиденциальные данные от общей конфигурации.
Важно: начинайте с простого docker-compose.yaml и эволюционируйте конфигурацию по мере роста приложения.
Краткая сводка:
- Описывайте сервисы в docker-compose.yaml
- Используйте docker-compose up/down/build/ps/logs
- Секреты — вне YAML
- Если нужно масштабирование и кластер — смотрите в сторону Kubernetes
Похожие материалы
Создать плейлист на SoundCloud — пошагово
Исправить Code 10: устройство не запускается
Snapchat Memories: руководство по использованию
Текстовые поля в Word — вставка, рисование, формат
Удалённый доступ к Windows с Mac