# Docker Compose

> Инструмент для описания и запуска многоконтейнерных приложений одним YAML-файлом — сервисы, сети, тома и зависимости между ними.

Источник: https://llmdocs.ru/wiki/docker-compose/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: инструмент оркестрации контейнеров на одном хосте
- **Разработчик**: 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](https://llmdocs.ru/wiki/docker.md) и простой способ развернуть небольшой проект на одном сервере. Для кластеров из многих машин используют [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md).

## История

Инструмент появился в 2013 году под названием **Fig** в стартапе Orchard Labs; в 2014 году Docker купила компанию и переименовала Fig в Docker Compose. Первая версия была написана на [Python](https://llmdocs.ru/wiki/python.md) и вызывалась как `docker-compose`. В 2020 году формат файла выделили в открытую **Compose Specification**, которую поддерживают и другие инструменты, например Podman.[2] Вторая версия, переписанная на Go, стала плагином Docker CLI и вызывается без дефиса — `docker compose`; первая версия перестала поддерживаться в 2023 году.[4]

## Пример

Веб-приложение с базой [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md) и кэшем [Redis](https://llmdocs.ru/wiki/redis.md):

```yaml
# 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](https://llmdocs.ru/wiki/dockerfile.md), порты, [переменные окружения](https://llmdocs.ru/wiki/environment-variables.md), тома, политика перезапуска. Сервис можно масштабировать до нескольких одинаковых контейнеров.
- **Сеть** — по умолчанию Compose создаёт одну сеть на проект; можно описать несколько, чтобы изолировать, например, фронтенд от базы.
- **Том** — именованное хранилище, которое переживает пересоздание контейнеров. Данные базы должны лежать в томе, иначе исчезнут при `docker compose down`.
- **Проект** — набор ресурсов одного `compose.yaml`; имя проекта по умолчанию берётся из имени каталога и служит префиксом для контейнеров, сетей и томов.

## Команды

```bash
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](https://llmdocs.ru/wiki/kubernetes.md) или его облегчённые варианты вроде [k3s](https://llmdocs.ru/wiki/k3s.md); утилита Kompose помогает перевести `compose.yaml` в манифесты Kubernetes.

## См. также

- [Docker](https://llmdocs.ru/wiki/docker.md)
- [Dockerfile](https://llmdocs.ru/wiki/dockerfile.md)
- [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md)
- [Контейнеризация](https://llmdocs.ru/wiki/containerization.md)
- [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md)

## Источники

1. [Docker Docs — Docker Compose overview](https://docs.docker.com/compose/)
2. [Compose Specification](https://compose-spec.io/)
3. [Docker Docs — Control startup order](https://docs.docker.com/compose/how-tos/startup-order/)
4. [Docker Docs — Migrate to Compose V2](https://docs.docker.com/compose/releases/migrate/)
5. [Docker Docs — Use Compose Watch](https://docs.docker.com/compose/how-tos/file-watch/)
6. [Docker Docs — Using profiles with Compose](https://docs.docker.com/compose/how-tos/profiles/)
