Гайды
Docker Compose: многоконтейнерные приложения
compose.yaml, сеть и тома, профили и override, healthcheck depends_on и секреты.
~9 мин чтения
Docker Compose: многоконтейнерные приложения
Docker Compose (v2: docker compose) описывает несколько сервисов, сети и тома в compose.yaml. Удобно для локальной разработки и небольших деплоев. Основы образов — Docker: контейнеризация; сеть и тома — Docker: сеть и volumes; для кластерного прода — Kubernetes: Pods, Deployments и Services и документация Kubernetes.
1. Минимальный пример
services:
api:
build: ./api
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://app:app@db:5432/app
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: app
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata: {}
docker compose up -d
docker compose logs -f api
docker compose down
2. Сеть
По умолчанию сервисы резолвят друг друга по имени сервиса (db, api) в одной user-defined сети.
3. Профили и override
profiles: [dev] — сервис не стартует без --profile dev.
Файл compose.override.yaml (gitignored) для локальных портов/томов.
4. Здоровье зависимостей
depends_on не ждёт готовности БД. Используйте healthcheck на db и condition: service_healthy (в актуальном синтаксисе Compose проверьте версию спецификации).
services:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 5s
timeout: 3s
retries: 10
api:
depends_on:
db:
condition: service_healthy
5. Секреты
secrets: для файлов; в prod лучше внешний vault + mount, не plaintext в repo.
6. init и одноразовые задачи
Сервис с restart: "no" и depends_on можно использовать для миграций (alembic upgrade) перед стартом API; в Compose v2 также смотрите на profiles чтобы не гонять init в каждом up.
7. Watch и разработка
docker compose watch (поддерживается в новых версиях) синхронизирует исходники в контейнер без ручного rebuild — ускоряет цикл разработки; для продакшена по-прежнему immutable образы.
env_file: .env.local держит секреты вне git; в CI подставляйте --env-file или переменные окружения раннера. Блок deploy.resources (лимиты CPU/RAM) применяется в Docker Swarm; на обычном docker compose смотрите mem_limit/cpus в сервисе для простого ограничения.
8. Чек-лист
- Явные теги образов, не плавающий
latestв проде. - Лимиты ресурсов — по актуальной доке Compose для вашего режима (Swarm vs локальный Docker).
- Один compose на окружение или шаблонизация (envsubst / Helm позже).
-
name:у томов, если нужен предсказуемый volume на хосте. - Документировать порты, которые не должны публиковаться наружу.
Дальше: Multi-stage · Деплой FastAPI · тег Docker