Что такое Docker Compose и для чего он нужен?

«Что такое Docker Compose и для чего он нужен?» — вопрос из категории DevOps, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. Вместо запуска каждого контейнера отдельной командой docker run с множеством флагов, вы описываете всю сервисную архитектуру (контейнеры, сети, тома) в декларативном YAML-файле (docker-compose.yml) и управляете ею простыми командами.

Основная цель: Упрощение оркестрации нескольких взаимосвязанных контейнеров для разработки, тестирования и staging-окружений.

Типичный пример docker-compose.yml для веб-приложения:

version: '3.8'

services:
  # Сервис 1: Веб-приложение на ASP.NET Core
  webapi:
    build: . # Собрать образ из Dockerfile в текущей директории
    container_name: my-app-api
    ports:
      - "5000:80" # Проброс порта host:container
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ConnectionStrings__Database=Host=db;Database=AppDb;Username=postgres;Password=secret
    depends_on:
      - db # Запускать только после запуска сервиса 'db'
    volumes:
      - ./logs:/app/logs # Монтирование директории для логов

  # Сервис 2: База данных PostgreSQL
  db:
    image: postgres:15-alpine # Использовать готовый образ из реестра
    container_name: my-app-database
    environment:
      POSTGRES_DB: AppDb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: secret
    volumes:
      - postgres_data:/var/lib/postgresql/data # Постоянное хранилище для данных БД

  # Сервис 3: Клиентское приложение (например, React)
  frontend:
    image: nginx:alpine
    container_name: my-app-frontend
    ports:
      - "3000:80"
    volumes:
      - ./frontend/build:/usr/share/nginx/html:ro

# Определение томов для хранения данных
volumes:
  postgres_data:

Ключевые команды Docker Compose:

  • docker-compose up — собрать образы (если нужно), создать и запустить все сервисы.
  • docker-compose up -d — запустить в фоновом режиме (detached).
  • docker-compose down — остановить и удалить контейнеры, сети.
  • docker-compose ps — показать статус запущенных сервисов.
  • docker-compose logs -f [service_name] — просмотр логов в реальном времени.
  • docker-compose exec [service_name] [command] — выполнить команду внутри запущенного контейнера.

Преимущества:

  • Однокомандное развертывание: Вся инфраструктура приложения описывается в одном файле и запускается одной командой.
  • Изоляция окружения: Гарантирует, что у всех разработчиков идентичное окружение (версии СУБД, кэшей и т.д.).
  • Упрощение конфигурации: Легко описывать сети между контейнерами, общие тома, переменные окружения.

Ограничения: Docker Compose предназначен в первую очередь для работы на одном хосте. Для управления контейнерами в кластерном продакшн-окружении с автоматическим масштабированием и отказоустойчивостью используются оркестраторы, такие как Kubernetes или Docker Swarm.