Зачем нужен Docker Compose

Почему ручной запуск нескольких контейнеров неудобен и как Compose решает эту проблему.

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

Боль ручного запуска

Реальное приложение — это редко один контейнер. Обычно есть бэкенд, база данных, иногда кэш и веб-сервер. Запускать их вручную утомительно: для каждого нужно помнить флаги, сеть, тома, порядок. Пример всего из двух сервисов:

docker network create app-net

docker run -d --name db --network app-net \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data postgres:16

docker run -d --name api --network app-net \
  -p 8000:8000 -e DATABASE_URL=postgresql://postgres:secret@db:5432/postgres \
  my-app:1.0

Это нужно помнить и повторять каждый раз. А если сервисов пять? Команды разрастаются, ошибки неизбежны.

Решение: описать стек в файле

Compose позволяет описать весь набор сервисов, их сети, тома и переменные в одном файле compose.yaml. После этого весь стек поднимается одной командой:

docker compose up -d

Та же конфигурация, что выше, превращается в декларативный файл, который хранится в репозитории и читается как документация к запуску проекта.

docker compose, а не docker-compose

Современный Compose встроен в Docker как подкоманда — пишут docker compose (через пробел, версия v2). Старый отдельный бинарник docker-compose (через дефис) считается устаревшим. В этом курсе используем актуальный вариант.

Что даёт Compose

  • Одна команда поднимает и останавливает весь стек.
  • Декларативность: конфигурация в файле, а не в памяти.
  • Автоматическая сеть: Compose сам создаёт общую сеть, сервисы видят друг друга по имени.
  • Воспроизводимость: любой разработчик поднимет тот же стек.

Итог

  • Ручной запуск нескольких контейнеров громоздок и подвержен ошибкам.
  • Compose описывает весь стек в compose.yaml и поднимает его одной командой.
  • Актуальная команда — docker compose (v2), а не устаревший docker-compose.
Проверьте себя
1. Какую задачу решает Docker Compose?
AУскоряет сборку одиночного образа
BОписывает и запускает многоконтейнерное приложение из одного файла
CЗаменяет Docker Hub
DШифрует данные в томах
2. Какая форма команды актуальна в современном Docker?
Adocker-compose (через дефис)
Bdocker compose (через пробел, версия v2)
Ccompose-docker
Ddocker run compose
Поддержать проект