Skip to content

🧠 Docker Compose — Вики для души

Документация по полям docker-compose.yml, которая отвечает не только на «что это?», но и «а влияет ли порядок?», «а нужно ли это вообще?». Всё по-человечески.


💼 services

Главный раздел — тут описываются все контейнеры твоего приложения.

services:
  app:
    image: myapp:latest
    ports:
      - "5000:5000"

Каждый ключ (app, db, web и т.д.) — это отдельный контейнер.


🔄 build

build:
  context: ./папка
  dockerfile: Dockerfile.custom  # необязательно
  args:
    BUILD_ENV: production
Что делает? Собирает образ из Dockerfile в context
Переопределяет image:? ✅ Да
Зависит от порядка? ❌ Нет
Когда нужен? Когда у тебя кастомный код / билд

Если есть и build:, и image:, то образ будет собран и назван как указано в image:.


📦 image

image: nginx:latest
Что делает? Указывает имя образа (использует, или сохранит под этим именем, если есть build:)
Порядок важен? ❌ Нет
Работает с build:? ✅ Да, если есть — будет билд с этим тегом

🚪 ports

ports:
  - "8080:80"
Что делает? Пробрасывает порт хост:контейнер
Порядок важен? ❌ Нет
Множественные порты? ✅ Да

🗂 volumes

volumes:
  - ./data:/app/data
  - db-data:/var/lib/postgresql/data
Что делает? Примонтирует директорию/том внутрь контейнера
Порядок важен? ❌ Нет
Поддерживает и именованные, и bind-монты? ✅ Да

🌍 environment

environment:
  ENV: production
  DEBUG: true
Что делает? Передаёт переменные окружения в контейнер
Формат? ключ: значение или - КЛЮЧ=ЗНАЧЕНИЕ
Порядок важен? ❌ Нет

🤝 depends_on

depends_on:
  - db
  - redis
Что делает? Запускает контейнер только после зависимых
Гарантирует, что сервис будет готов? ❌ Нет, только запущен
Порядок важен? ✅ Да (по очереди)

⚠️ Используй healthcheck, если хочешь быть уверен, что сервис готов к работе


🔗 networks

networks:
  - frontend
Что делает? Подключает контейнер к указанной сети
Порядок важен? ❌ Нет
Если не указано? Docker создаст projectname_default сеть

📦 volumes (вне services)

volumes:
  db-data:
    external: true
Что делает? Объявляет том — или создаёт, или использует внешний
Нужно ли указывать здесь, если используешь в service? ✅ Да

🌐 networks (вне services)

networks:
  frontend:
    external: true
Что делает? Объявляет пользовательскую сеть
Если не указана? Создаётся default сеть автоматически

🔁 restart

restart: unless-stopped
Что делает? Задаёт политику автозапуска контейнера
Порядок важен? ❌ Нет

Опции:

  • no (по умолчанию)
  • always
  • on-failure
  • unless-stopped

📋 Итого: что важно, а что — пофигу

Поле Важно ли оно? Влияет ли порядок?
build ✅ Да ❌ Нет
image ✅ Да ❌ Нет
ports ✅ Да ❌ Нет
volumes ✅ Да ❌ Нет
depends_on ✅ Да ✅ Да (очередность)
networks ✅ Да ❌ Нет
restart ✅ Иногда ❌ Нет