Гид по технологиям

Docker Compose: быстрое руководство по настройке, командам и примерами

6 min read DevOps Обновлено 23 Dec 2025
Docker Compose: быстрый старт и команды
Docker Compose: быстрый старт и команды

Логотип Docker: синий кит, несущий блоки на спине, на чёрном фоне с золотыми надписями

Что такое Docker Compose?

Docker Compose — это простой инструмент оркестрации контейнеров, построенный на основе Docker Engine. Он позволяет запускать и управлять набором взаимосвязанных контейнеров через единый YAML-файл конфигурации. Compose чаще всего применяют для локальной разработки, тестирования интеграций и небольших продакшен-развертываний.

Краткое определение: Docker Compose — файл-ориентированный менеджер сервисов, который работает поверх Docker Engine.

Почему он полезен:

  • Упрощает запуск многосервисных приложений (например, веб-приложение + база данных + кеш).
  • Снижает количество конфигураций, которые нужно запоминать и запускать вручную.
  • Подходит для CI, локальной отладки и быстрых прототипов.

Важно: Docker Compose не заменяет крупные системы оркестрации (например, Kubernetes) для распределённых кластеров.

Установка и проверка наличия Docker Compose

Docker Compose идёт в комплекте с Docker Desktop на macOS и Windows. На Linux он может быть установлен как отдельный пакет или как плагин docker-compose.

Проверьте установку командой:

docker-compose version

Если команда вернёт версию и сборку — Compose установлен. Если нет — установите Docker Engine и затем следуйте официальной инструкции для вашей ОС.

Команда и результат проверки версии docker-compose

Структура docker-compose.yaml — ключевые секции

Файл называется обычно docker-compose.yaml или docker-compose.yml и размещается в корне проекта. Он описывает сервисы, тома, сети и настройки сборки.

Минимальная схема:

version: '3.9'
services:
  web:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - "/home:/away"
  database:
    image: "redis:alpine"
    environment:
      - "USERNAME=yourUser"
      - "PASSWORD=p@wen"

Разбор полей:

  • version: версия синтаксиса Compose (совместимость с Docker Engine). Рекомендуется ‘3.8’ или выше для современных функций.
  • services: набор сервисов (контейнеров) вашего приложения.
    • build: путь к Dockerfile или объект build с контекстом и параметрами.
    • image: имя образа (если не собираете локально).
    • ports: проброс портов в формате “хост:контейнер“.
    • volumes: примонтированные тома или директории.
    • environment: переменные окружения.
    • depends_on: порядок зависимостей между сервисами (не эквивалент готовности сервиса).
  • networks: определение пользовательских сетей.
  • volumes: объявленные тома для устойчивого хранения данных.

Совет: для конфиденциальных данных используйте переменные окружения из .env или ключи секретов, а не хардкод в YAML.

Пример полного файла для простого приложения

version: '3.9'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    image: myapp:latest
    ports:
      - "8080:8080"
    volumes:
      - ./src:/app/src
    environment:
      - "NODE_ENV=development"
    depends_on:
      - redis

  redis:
    image: redis:alpine
    volumes:
      - redis-data:/data

volumes:
  redis-data:
    driver: local

networks:
  default:
    driver: bridge

Пояснение: web собирается из текущей директории, пробрасывает код для локальной разработки. Redis хранит данные в томе redis-data.

Основные команды docker-compose — шпаргалка

  • Сборка образов:
docker-compose build
  • Запуск сервисов (build + run):
docker-compose up

Добавьте -d для запуска в фоновом режиме:

docker-compose up -d
  • Остановка и удаление контейнеров, сетей и томов (опционально):
docker-compose down
  • Показать запущенные контейнеры:
docker-compose ps
  • Запустить одну команду в сервисе:
docker-compose run --rm web python manage.py migrate
  • Посмотреть логи:
docker-compose logs -f web
  • Список образов, описанных в файле:
docker-compose images
  • Остановка без удаления:
docker-compose stop

Важно: команда down по умолчанию удаляет контейнеры, сети и мосты, но не тома без флага –volumes.

Когда Docker Compose работает хорошо, а когда не подходит

Подходит когда:

  • Локальная разработка и тестирование.
  • Небольшие продакшен-сценарии на одиночном хосте.
  • Быстрые интеграционные тесты в CI.

Не подходит когда:

  • Нужно горизонтальное масштабирование в кластере (несколько хостов).
  • Требуется сложная автоматическая балансировка, самовосстановление и rolling обновления на уровне кластера.

Альтернативы:

  • Kubernetes — для распределённых кластеров и сложной оркестрации.
  • Docker Swarm — встроенная оркестрация Docker, проще чем Kubernetes, но менее распространена.

Лучшие практики и безопасность

  1. Разделяйте окружения: используйте разные docker-compose файлов для dev и prod (например, docker-compose.override.yml).
  2. Храните секреты в менеджерах секретов (Vault, Docker Secrets в Swarm) или в CI, не в YAML.
  3. Не пробрасывайте корневые директории хоста в контейнер (опасно для безопасности).
  4. Указывайте конкретные версии образов, не используйте latest в продакшене.
  5. Ограничивайте ресурсы: используйте deploy.resources или ресурсы Docker Engine для контроля CPU/памяти (работает в некоторых режимах).
  6. Минимизируйте права контейнеров: user в Dockerfile, read-only тома, no-new-privileges.

Короткая проверка безопасности (SANS-подход): минимальные права, за пределы контейнера только необходимые порты, отдельные тома для данных.

Отладка и типичные проблемы

  • Контейнер зависает при старте: проверьте логи через docker-compose logs
  • Сервис считает, что зависимость запущена, но не готова: depends_on не ждёт готовности; добавьте healthcheck и проверку в приложении.
  • Порт занят на хосте: проверьте, нет ли локальных процессов на том же порту.
  • Ошибки файловых путей на Windows: используйте относительные пути и проверьте формат путей (\ vs /).

Пример healthcheck в docker-compose:

services:
  db:
    image: postgres:13
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5

Роль-ориентированные чек-листы

Для разработчика:

  • Проверить локальный docker-compose up -d
  • Убедиться, что код в volume смонтирован и hot-reload работает
  • Логи доступны: docker-compose logs -f

Для инженера DevOps:

  • Настроить CI, который запускает docker-compose build + up для тестов
  • Хранить секреты вне YAML
  • Создать production-ready docker-compose с ограничениями ресурсов

Для QA:

  • Прогнать интеграционные тесты в окружении, собранном через docker-compose
  • Использовать чистые тома для воспроизводимости тестов

Критерии приёмки

  • Все сервисы стартуют без ошибок: docker-compose up завершает запуск, логи не содержат ошибок.
  • Сервисы взаимодействуют по описанным портам и сетям.
  • После docker-compose down все временные контейнеры удалены; при необходимости данные сохраняются в томах.
  • Автоматизированные тесты проходят в окружении, созданном Compose.

Ментальные модели и советы по переходу на Kubernetes

Ментальная модель: Compose — это набор деклараций «что» запускать на одном хосте; Kubernetes — декларация «как» и «где» запускать на кластере.

Если вы растёте из Compose в Kubernetes:

  • Сначала разбейте приложение на независимые сервисы с понятными контрактами.
  • Переходите на манифесты Kubernetes, Helm-чарты или Kompose (конвертер docker-compose в k8s-манифесты) аккуратно и поэтапно.

Шаблоны и примеры

Чек-лист для простого CI (пример):

  1. checkout
  2. docker-compose -f docker-compose.ci.yml build –parallel
  3. docker-compose -f docker-compose.ci.yml up -d
  4. run тесты
  5. docker-compose -f docker-compose.ci.yml down –volumes

Мини-методология разработки:

  1. Опишите сервисы и зависимости в docker-compose.yaml
  2. Создайте Dockerfile для каждого сервиса
  3. Локально тестируйте через docker-compose up
  4. Интегрируйте сборку в CI
  5. При масштабировании оцените переход на k8s

Полезная шпаргалка команд (cheat sheet)

  • build: docker-compose build
  • up (foreground): docker-compose up
  • up (background): docker-compose up -d
  • down: docker-compose down
  • stop: docker-compose stop
  • ps: docker-compose ps
  • logs: docker-compose logs -f
  • run one-off: docker-compose run –rm

Иконки команд docker-compose и их описание

Краткий глоссарий (1 строка)

  • Сервис — контейнер, описанный в docker-compose.yaml; образ — результат сборки или готовый Docker-образ; том — постоянное хранилище данных вне контейнера.

Итог

Docker Compose — мощный и простой инструмент для управления многосервисными приложениями на одном хосте. Он ускоряет локальную разработку и тестирование, но имеет ограничения при масштабировании на кластеры. Применяйте best practices по безопасности, используйте healthcheck для надёжности и отделяйте конфиденциальные данные от общей конфигурации.

Важно: начинайте с простого docker-compose.yaml и эволюционируйте конфигурацию по мере роста приложения.

Краткая сводка:

  • Описывайте сервисы в docker-compose.yaml
  • Используйте docker-compose up/down/build/ps/logs
  • Секреты — вне YAML
  • Если нужно масштабирование и кластер — смотрите в сторону Kubernetes
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Создать плейлист на SoundCloud — пошагово
Музыка

Создать плейлист на SoundCloud — пошагово

Исправить Code 10: устройство не запускается
Техника

Исправить Code 10: устройство не запускается

Snapchat Memories: руководство по использованию
соцсети

Snapchat Memories: руководство по использованию

Текстовые поля в Word — вставка, рисование, формат
Microsoft Word

Текстовые поля в Word — вставка, рисование, формат

Удалённый доступ к Windows с Mac
Инструкции

Удалённый доступ к Windows с Mac

Как быстро выделять блоки в Word
Microsoft Word

Как быстро выделять блоки в Word