Средний ~25 мин чтения

Docker Compose: многоконтейнерные приложения

Урок 4 из 6 в курсе Docker для разработчика

Docker Compose: многоконтейнерные приложения

Docker Compose позволяет описать и запустить несколько связанных контейнеров одной командой через YAML-файл

Почему это важно: реальные приложения состоят из нескольких сервисов. Compose стандартизирует локальную разработку: вся команда работает в одинаковом окружении

Главная идея

docker-compose.yml описывает сервисы, их зависимости, тома и сети. docker compose up поднимает всё окружение за секунды

Как это выглядит на практике

  1. Создаём docker-compose.yml с сервисами: app (Rails), db (PostgreSQL), redis (Redis).
  2. services.app.depends_on: [db, redis] — Compose запускает зависимости первыми.
  3. services.db.volumes: [postgres_data:/var/lib/postgresql/data] — постоянное хранение данных.
  4. docker compose up --build — сборка и запуск всех сервисов.
  5. docker compose logs -f app — логи конкретного сервиса в реальном времени.

Что происходит под капотом

  • Compose создаёт изолированную Docker-сеть для проекта; сервисы доступны по именам (db, redis).
  • depends_on контролирует порядок запуска, но не ждёт готовности сервиса (только старт контейнера).
  • docker compose down --volumes удаляет контейнеры и все тома — для полной очистки.
  • Compose автоматически подгружает .env файл из текущей директории для подстановки переменных.
  • docker compose exec app rails console — запуск команды внутри работающего сервиса.

Типичные ошибки и заблуждения

  • Ошибка: depends_on гарантирует, что БД готова принимать соединения. Нет — только что контейнер запущен. Нужен healthcheck.
  • Ошибка: Compose только для разработки. docker compose работает в продакшене для небольших сервисов.
  • Ошибка: порты сервисов нужно всегда маппить в ports. Внутри сети Compose сервисы общаются без маппинга.
  • Ошибка: docker-compose.yml и docker compose — разные инструменты. docker-compose — отдельная утилита v1; docker compose (без дефиса) — встроенный плагин v2.

Ключевые выводы

  • docker-compose.yml — единственный источник правды об окружении проекта.
  • Сервисы внутри Compose-сети обращаются друг к другу по именам сервисов.
  • depends_on + healthcheck = правильное ожидание готовности зависимостей.
  • docker compose down --volumes очищает данные; осторожно в продакшене.

Термины урока

Service: один контейнер в Compose-конфигурации (app, db, redis).
Network: виртуальная сеть Compose; сервисы видят друг друга по именам.
depends_on: порядок запуска сервисов.
healthcheck: проверка готовности контейнера (SELECT 1 для PostgreSQL).
docker compose up --build: пересобрать и запустить все сервисы.

Связь с работой backend-разработчика

docker-compose.yml должен быть в каждом backend-проекте. README с 'docker compose up' вместо страницы инструкций по настройке — это стандарт хорошего проекта.

Мини-разбор реальной ситуации

Новый разработчик присоединяется к проекту. Без Compose: 2 часа настройки PostgreSQL, Redis, правки конфигов. С Compose: git clone → docker compose up → приложение работает на localhost за 3 минуты. Compose-файл — документация окружения, выраженная в коде.

Что запомнить

  • Один docker-compose.yml описывает всё локальное окружение.
  • Сервисы внутри сети Compose видят друг друга по именам: host=db.
  • depends_on + healthcheck обеспечивают правильный порядок старта.

Итог

Docker Compose — незаменимый инструмент для локальной разработки. Он превращает сложную настройку окружения в одну команду.