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

Ответ

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.

Ответ 18+ 🔞

А, Docker Compose, ну это ж просто сказка для тех, кто устал, как собака, вручную городить эти docker run с кучей флагов, которые хуже китайской грамоты! Представь, у тебя там веб-сервер, база, кэш, и всё это должно друг с другом болтать. Так вот, Compose — это твой личный дирижёр для этого цирка.

Если по-простому: это такая штука, чтобы описать всю свою банду контейнеров в одном YAML-файлике (это docker-compose.yml), а потом одним пинком под зад всё это поднять. Идеально для разработки, когда тестишь локально, или для каких-то стендов.

Смотри, как это обычно выглядит, на примере простенького приложения:

version: '3.8'

services:
  # Сервис 1: Наше API, допустим, на .NET
  webapi:
    build: . # Собираем образ прямо тут из Dockerfile
    container_name: my-app-api
    ports:
      - "5000:80" # Пробрасываем порт с компа в контейнер
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ConnectionStrings__Database=Host=db;Database=AppDb;Username=postgres;Password=secret
    depends_on:
      - db # Говорим: "Слушай, стартуй только после того, как база хоть запустится"
    volumes:
      - ./logs:/app/logs # Цепляем папку с логами, чтобы на хосте смотреть

  # Сервис 2: База данных, Postgres
  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: Фронтенд, ну пусть будет nginx со статикой
  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 up — главная команда! Соберёт, создаст и запустит всё, что описано. Весь оркестр заиграет.
  • docker-compose up -d — то же самое, но в фоне, чтобы консоль не засирать.
  • docker-compose down — волшебная кнопка "СТОП". Останавливает и сносит все контейнеры, сети. Чистота.
  • docker-compose ps — типа "кто живой?", показывает статус твоих сервисов.
  • docker-compose logs -f [имя_сервиса] — подписываешься на лог, как в телегу. -f — это чтобы в реальном времени летело, очень удобно, когда что-то падает.
  • docker-compose exec [имя_сервиса] [команда] — залезть внутрь работающего контейнера и что-то сделать. Например, в базу подключиться.

Чем это, блядь, так хорошо?

  • Одна команда вместо сотни. Не надо вспоминать, какие там флаги к postgres писать. Написал файл раз — и вся команда может работать в абсолютно одинаковом окружении. Никаких "а у меня на машине работает".
  • Всё связано и изолировано. Контейнеры между собой в своей сети общаются, а снаружи не торчат лишнего.
  • Конфиг как документ. Глянул в YAML — и сразу понятно, из чего приложение состоит.

Но есть и ложка дёгтя, ёпта: Compose — это по сути для одной машины. Для продакшна, где нужно кластер, масштабирование и высокая доступность, это не катит. Тут уже нужны большие пацаны вроде Kubernetes или Docker Swarm. А Compose — это твой надёжный инструмент для локальной разработки, чтобы не сойти с ума.