Раздел 9. Docker Compose
Compose переводит систему из набора команд в описание. Вместо четырёх длинных docker run с флагами сетей, volumes и переменных окружения — один файл compose.yaml, который можно версионировать, читать и воспроизводить.
Compose не добавляет новых возможностей поверх Docker Engine: всё, что он делает, можно сделать вручную. Его ценность в другом — конфигурация становится артефактом, а не устной договорённостью. Именно поэтому раздел идёт после storage и networking: без понимания механизмов Compose превращается в набор непонятных YAML-ключей.
Отдельная тема раздела — depends_on. Он определяет порядок запуска, но не готовность. База данных, принявшая старт, ещё не принимает соединения. Приложение, стартовавшее «после» неё, всё равно упадёт. Правильное решение требует healthcheck и условия готовности — и это разбирается подробно.
Цели обучения
После раздела учащийся сможет:
- написать
compose.yamlпо актуальной Compose Specification, не используя устаревший ключversion; - описать service: image или build, command, environment, ports, volumes, networks;
- объяснить, как Compose именует проект, сети и containers, и как это изменить;
- настроить healthcheck и зависимость по готовности через
depends_onс условием; - объяснить, почему
depends_onбез условия не гарантирует работоспособность; - управлять конфигурацией через env files,
environment, interpolation и secrets; - разделять окружения через несколько Compose-файлов,
overrideи profiles; - задавать resource limits и restart policy на уровне Compose;
- использовать anchors и
extendsдля устранения дублирования; - работать с lifecycle-командами:
up,down,logs,exec,ps,restart,build; - объяснить, что такое orphan containers и откуда они берутся.
Предварительные знания
- Раздел 07. Storage — volumes и bind mounts;
- Раздел 08. Networking — user-defined networks и DNS;
- Раздел 06. Python внутри Container — примеры используют FastAPI и worker;
- базовое понимание синтаксиса YAML.
Материалы
-
Основы Compose
Что такое Compose Specification и почемуversionбольше не нужен. Структураcompose.yaml. Имя проекта и как оно влияет на имена сетей, volumes и containers. Команды жизненного цикла:up,down,ps,logs,exec,restart,build,pull. Флаги-d,--build,--remove-orphans,-v. -
Справочник по services
Основные атрибуты service:image,build,command,entrypoint,environment,env_file,ports,expose,volumes,working_dir,user,restart,stop_grace_period,stop_signal,init,labels,pull_policy. Ресурсы черезdeploy.resourcesи короткие формыcpus,mem_limit. Для каждого атрибута — назначение и типичная ошибка. -
Networks и volumes
Сеть по умолчанию и её имя. Объявление собственных networks, изоляция групп сервисов, aliases. Named volumes на уровне проекта, external volumes, bind mounts в Compose. Что удаляетdown, а что нет. -
Healthchecks и зависимости
Синтаксисhealthcheckи все его параметры. Условияdepends_on:service_started,service_healthy,service_completed_successfully, флагиrestartиrequired. Почему приложение всё равно должно уметь переживать недоступность зависимости. Паттерн миграций как отдельного сервиса сservice_completed_successfully. -
Environment и secrets
Файл.envи interpolation, приоритет источников переменных,env_fileпротивenvironment. Значения по умолчанию и обязательные переменные. Compose secrets и configs: как они попадают в container и чем отличаются от переменных окружения. Что нельзя класть вcompose.yaml. -
Несколько файлов и profiles
Механизм слияния Compose-файлов,compose.override.yaml, флаг-fи порядок применения. Правила слияния списков и словарей. Profiles для опциональных сервисов. Anchors иextendsдля устранения дублирования. Организация dev, test и prod конфигураций. -
Практический stack
Полностью рабочая система: FastAPI, PostgreSQL, Redis, background worker, сервис миграций. Healthchecks у каждого компонента, две изолированные сети, named volumes, resource limits. Пошаговый разбор файла и проверка каждого требования. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → 07 → exercises.
Урок 04 — ключевой. Урок 02 справочный: прочитайте по диагонали и возвращайтесь к нему по мере необходимости.
Рабочие примеры
| Пример | Каталог | Урок |
|---|---|---|
| Полный stack | resources/examples/compose-stack/ | 07 |
| Worker на Redis | resources/examples/worker-redis/ | 04, 07 |
Практические задания
| № | Задание | Тип |
|---|---|---|
| 1 | Перевести две команды docker run в compose.yaml и проверить эквивалентность | обяз. |
| 2 | Добавить healthcheck к PostgreSQL и зависимость service_healthy для приложения | обяз. |
| 3 | Доказать логами, что без условия готовности приложение стартует раньше базы | обяз. |
| 4 | Разделить сервисы на две сети так, чтобы база была недоступна извне web-сети | обяз. |
| 5 | Вынести миграции в отдельный сервис с service_completed_successfully | обяз. |
| 6 | Настроить dev и prod конфигурации через два Compose-файла | доп. |
| 7 | Добавить опциональный сервис под profile и запустить его только явно | доп. |
| 8 | Задать resource limits и проверить их через docker stats | доп. |
| 9 | После docker compose down -v пропали данные PostgreSQL. Объяснить и предложить процедуру | диаг. |
| 10 | Сократить дублирование в compose.yaml с шестью похожими сервисами через anchors | ★ |
Полные формулировки — в exercises.md.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Написать
compose.yamlдля стека из четырёх сервисов с нуля, без копирования. - Объяснить, почему
depends_on: [db]не спасает от ошибки подключения при старте. - Назвать имена сети и volume, которые создаст Compose для проекта
myapp. - Объяснить, что удаляет
docker compose downи что нужно добавить для удаления данных. - Настроить одинаковый стек для разработки и production, не дублируя конфигурацию.
- Найти в чужом
compose.yamlтри проблемы: отсутствие healthcheck, секрет в открытом виде, отсутствие изоляции сетей.
Проверьте себя: Quiz 09 и Checkpoint 2.
Что дальше
Система описана и запускается. Следующий раздел превращает её в удобное рабочее окружение: hot reload, отладка, миграции, автоматизация рутины.
Навигация
← Предыдущий раздел: Docker Networking
Вернуться к главному оглавлению
Следующий раздел: Development workflow →