Как Docker Compose упрощает управление многоконтейнерными приложениями

«Как Docker Compose упрощает управление многоконтейнерными приложениями» — вопрос из категории Devops, который задают на 23% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основная идея — вместо ручного запуска каждого контейнера с множеством флагов (docker run ...), вы описываете всю конфигурацию в файле docker-compose.yml.

Ключевые преимущества:

  • Единая конфигурация: Все сервисы, сети, тома и переменные окружения описаны в одном файле.
  • Изолированное окружение: Compose автоматически создает общую сеть для всех сервисов, позволяя им взаимодействовать друг с другом по именам (например, сервис web может обратиться к сервису db).
  • Простота управления: Весь стек запускается одной командой (docker-compose up) и останавливается другой (docker-compose down).
  • Воспроизводимость: Гарантирует, что окружение для разработки, тестирования и продакшена будет идентичным.

Пример docker-compose.yml для веб-приложения:

version: '3.8'

services:
  # Сервис веб-сервера
  web:
    image: nginx:latest
    ports:
      - "8080:80" # Проброс порта 8080 хоста на порт 80 контейнера
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app # Запустится после сервиса 'app'

  # Сервис приложения (например, Python/Node.js)
  app:
    build: . # Собрать образ из Dockerfile в текущей директории
    volumes:
      - .:/app
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mydatabase

  # Сервис базы данных
  db:
    image: postgres:13
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydatabase
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data: # Именованный том для сохранения данных БД