Урок 04. Multistage Dockerfile, Docker Compose

📁 Блок: Docker ⏱️ Время изучения: ~70 мин 🎯 Сложность: Средняя
#multistage #docker-compose #multi-container #build-optimization #networks #depends_on

⚡ Кратко: Multistage Dockerfile и Docker Compose

Multistage build — несколько секций FROM в одном Dockerfile. Первые стадии собирают/компилируют, финальная — копирует только нужные артефакты. Результат: образ в 3–10 раз меньше без инструментов сборки.

  • FROM … AS build — именованная стадия сборки; COPY --from=build — копировать артефакт из стадии в финальный образ
  • Docker Compose — YAML-файл docker-compose.yml, описывающий несколько сервисов, сети и тома; запуск одной командой docker compose up
  • Ключевые поля: services, build, image, ports, volumes, environment, depends_on, networks
  • Типы сетей: bridge (изоляция, по умолчанию), host (сеть хоста), none (без сети)
  • healthcheck + depends_on: condition: service_healthy — ждать готовности БД, не просто запуска контейнера

Топ-3 ошибки: 1) Не именовать стадию (AS build) — нельзя сослаться в COPY --from. 2) Использовать устаревший ключ version: в compose-файле — он игнорируется и порождает предупреждения. 3) Полагаться только на depends_on без healthcheck — контейнер «запущен», но БД ещё не готова к подключениям.

📖 О чём этот урок

В предыдущем уроке мы научились писать Dockerfile и запускать одиночные контейнеры. Теперь сделаем два шага вперёд:

  1. Multistage build — как уменьшить финальный образ, убрав из него всё лишнее: компиляторы, тестовые зависимости, инструменты сборки.
  2. Docker Compose — как описать и запустить целое приложение из нескольких сервисов (web + db + cache) одной командой, не вводя вручную десятки флагов docker run.

Оба инструмента решают реальные продакшн-проблемы: раздутые образы с уязвимостями и неудобный ручной запуск связанных контейнеров.

Что изучим

  • Принцип Multi Stage build: зачем нужен, как работает
  • Синтаксис: FROM … AS, COPY --from=
  • Практика: сравнение размера образов с multistage и без
  • Docker Compose v2: структура YAML-файла, ключевые поля
  • Сети в Docker Compose: bridge, host, none
  • Зависимости сервисов: depends_on и healthcheck
  • Команды docker compose (v2, без дефиса)
  • Реальные примеры: MediaWiki + MariaDB, WordPress + MySQL

📚 Что повторить перед изучением

  • ← Урок 03: Dockerfile, nginx и БД в Docker — написание Dockerfile, слои, COPY, RUN, CMD, volumes
  • Понятие слоёв образа и кеширования при сборке
  • Команды: docker build, docker run -p -v -e, docker images
  • Базовый YAML: отступы, ключ: значение, списки со знаком -

🎯 Что изучать дальше