Главная/Docker Compose/Обзор

Раздел 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 и откуда они берутся.

Предварительные знания

Материалы

  1. Основы Compose
    Что такое Compose Specification и почему version больше не нужен. Структура compose.yaml. Имя проекта и как оно влияет на имена сетей, volumes и containers. Команды жизненного цикла: up, down, ps, logs, exec, restart, build, pull. Флаги -d, --build, --remove-orphans, -v.

  2. Справочник по 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. Для каждого атрибута — назначение и типичная ошибка.

  3. Networks и volumes
    Сеть по умолчанию и её имя. Объявление собственных networks, изоляция групп сервисов, aliases. Named volumes на уровне проекта, external volumes, bind mounts в Compose. Что удаляет down, а что нет.

  4. Healthchecks и зависимости
    Синтаксис healthcheck и все его параметры. Условия depends_on: service_started, service_healthy, service_completed_successfully, флаги restart и required. Почему приложение всё равно должно уметь переживать недоступность зависимости. Паттерн миграций как отдельного сервиса с service_completed_successfully.

  5. Environment и secrets
    Файл .env и interpolation, приоритет источников переменных, env_file против environment. Значения по умолчанию и обязательные переменные. Compose secrets и configs: как они попадают в container и чем отличаются от переменных окружения. Что нельзя класть в compose.yaml.

  6. Несколько файлов и profiles
    Механизм слияния Compose-файлов, compose.override.yaml, флаг -f и порядок применения. Правила слияния списков и словарей. Profiles для опциональных сервисов. Anchors и extends для устранения дублирования. Организация dev, test и prod конфигураций.

  7. Практический stack
    Полностью рабочая система: FastAPI, PostgreSQL, Redis, background worker, сервис миграций. Healthchecks у каждого компонента, две изолированные сети, named volumes, resource limits. Пошаговый разбор файла и проверка каждого требования.

  8. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → 07 → exercises.

Урок 04 — ключевой. Урок 02 справочный: прочитайте по диагонали и возвращайтесь к нему по мере необходимости.

Рабочие примеры

ПримерКаталогУрок
Полный stackresources/examples/compose-stack/07
Worker на Redisresources/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.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Написать compose.yaml для стека из четырёх сервисов с нуля, без копирования.
  2. Объяснить, почему depends_on: [db] не спасает от ошибки подключения при старте.
  3. Назвать имена сети и volume, которые создаст Compose для проекта myapp.
  4. Объяснить, что удаляет docker compose down и что нужно добавить для удаления данных.
  5. Настроить одинаковый стек для разработки и production, не дублируя конфигурацию.
  6. Найти в чужом compose.yaml три проблемы: отсутствие healthcheck, секрет в открытом виде, отсутствие изоляции сетей.

Проверьте себя: Quiz 09 и Checkpoint 2.

Что дальше

Система описана и запускается. Следующий раздел превращает её в удобное рабочее окружение: hot reload, отладка, миграции, автоматизация рутины.

Навигация

Диаграмма: стек Compose

← Предыдущий раздел: Docker Networking
Вернуться к главному оглавлению
Следующий раздел: Development workflow →

Markdown на GitHub ↗