Docker Compose

Материал из llmdocs — справочник разработчика
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.

См. также

Источники

  1. Docker Docs — Docker Compose overview
  2. Compose Specification
  3. Docker Docs — Control startup order
  4. Docker Docs — Migrate to Compose V2
  5. Docker Docs — Use Compose Watch
  6. Docker Docs — Using profiles with Compose