Гайды

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. Минимальный пример

yaml
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: {}
bash
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 проверьте версию спецификации).

yaml
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