Docker Compose
| Тип | инструмент оркестрации контейнеров на одном хосте |
|---|---|
| Разработчик | Docker, Inc. |
| Предшественник | Fig (Orchard Labs, 2013) |
| Текущая версия | Compose V2 — плагин docker compose на Go (с 2022) |
| Формат | YAML, Compose Specification |
| Файл по умолчанию | compose.yaml |
| Лицензия | Apache 2.0 |
Docker Compose — инструмент для описания и запуска приложений из нескольких контейнеров. Вместо длинных команд docker run для каждого сервиса всё приложение — веб-сервер, база данных, кэш, фоновые обработчики — описывается в одном YAML-файле compose.yaml и поднимается одной командой docker compose up. Compose создаёт общую сеть, в которой сервисы находят друг друга по именам, тома для данных и следит за порядком запуска.[1]
Compose — стандартный способ локальной разработки с Docker и простой способ развернуть небольшой проект на одном сервере. Для кластеров из многих машин используют Kubernetes.
История
Инструмент появился в 2013 году под названием Fig в стартапе Orchard Labs; в 2014 году Docker купила компанию и переименовала Fig в Docker Compose. Первая версия была написана на Python и вызывалась как docker-compose. В 2020 году формат файла выделили в открытую Compose Specification, которую поддерживают и другие инструменты, например Podman.[2] Вторая версия, переписанная на Go, стала плагином Docker CLI и вызывается без дефиса — docker compose; первая версия перестала поддерживаться в 2023 году.[4]
Пример
Веб-приложение с базой PostgreSQL и кэшем Redis:
# compose.yaml
services:
web:
build: . # собрать образ по Dockerfile в этом каталоге
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://app:secret@db:5432/app
REDIS_URL: redis://cache:6379/0
depends_on:
db:
condition: service_healthy # ждать, пока база реально готова
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:18
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
interval: 5s
retries: 10
cache:
image: redis:8-alpine
volumes:
pgdata:
Сервис web обращается к базе по имени db, а к кэшу — по имени cache: Compose регистрирует имена сервисов во внутреннем DNS своей сети. Порт базы наружу не опубликован, поэтому она доступна только другим контейнерам проекта.
Основные понятия
- Сервис — описание контейнера: образ или инструкция сборки по Dockerfile, порты, переменные окружения, тома, политика перезапуска. Сервис можно масштабировать до нескольких одинаковых контейнеров.
- Сеть — по умолчанию Compose создаёт одну сеть на проект; можно описать несколько, чтобы изолировать, например, фронтенд от базы.
- Том — именованное хранилище, которое переживает пересоздание контейнеров. Данные базы должны лежать в томе, иначе исчезнут при
docker compose down. - Проект — набор ресурсов одного
compose.yaml; имя проекта по умолчанию берётся из имени каталога и служит префиксом для контейнеров, сетей и томов.
Команды
docker compose up -d # собрать при необходимости и запустить в фоне
docker compose ps # состояние сервисов
docker compose logs -f web # логи сервиса
docker compose exec db psql -U app # команда внутри работающего контейнера
docker compose run --rm web pytest # разовая задача в новом контейнере
docker compose up -d --build web # пересобрать и перезапустить один сервис
docker compose pull && docker compose up -d # обновить образы
docker compose down # остановить и удалить контейнеры и сети
docker compose down -v # то же вместе с томами — данные будут потеряны
docker compose config # итоговая конфигурация после подстановок
Порядок запуска
depends_on сам по себе гарантирует только порядок старта контейнеров, но не готовность приложения внутри: база может ещё инициализироваться, когда веб-сервис уже пытается подключиться. Условие condition: service_healthy вместе с healthcheck у зависимости заставляет Compose ждать реальной готовности.[3] Приложению всё равно полезно уметь повторять подключение — в продакшене зависимости тоже бывают недоступны.
Возможности для разработки
- Переменные и файл
.env. Значения вида${POSTGRES_PASSWORD}подставляются из окружения или файла.envрядом сcompose.yaml; секреты не нужно хранить в самом файле. - Несколько файлов.
compose.override.yamlавтоматически накладывается поверх основного — удобно для локальных настроек; другие файлы подключаются флагом-f. - Профили. Сервисы с
profiles: [debug]запускаются только по запросу (docker compose --profile debug up) — например, админка базы или инструменты отладки.[6] - Watch. Режим
docker compose watchсинхронизирует изменённые файлы в контейнер или пересобирает образ при изменении зависимостей, заменяя ручной перезапуск.[5]
Compose в продакшене
На одном сервере Compose вполне подходит для небольших проектов: restart: unless-stopped поднимет контейнеры после перезагрузки, а обновление сводится к pull и up -d. Ограничения — нет распределения по нескольким машинам, обновлений без простоя и автоматического восстановления на другом узле. Когда это становится важным, переходят на Kubernetes или его облегчённые варианты вроде k3s; утилита Kompose помогает перевести compose.yaml в манифесты Kubernetes.