Открыть сервис

Докер Композ

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

История

Docker Compose был разработан компанией Docker Inc. как эволюция более раннего инструмента fig, созданного сторонним разработчиком Орлом Хенри (Orr Henzel). В 2014 году Docker Inc. приобрела проект fig и переименовала его в Docker Compose. Первая версия инструмента (v1) была написана на Python и использовала формат docker-compose.yml версии 1. В 2017 году с выходом Docker Compose v2 инструмент был переписан на Go и интегрирован непосредственно в клиент Docker (docker compose как подкоманда), что повысило производительность и стабильность. В 2020 году Docker Inc. объявила о переходе на Compose Specification — единый стандарт описания конфигурации, который поддерживается не только Docker Compose, но и другими инструментами оркестрации (например, Podman, Portainer). Начиная с Docker Desktop 3.0 и Docker Engine 20.10, docker compose (v2) стал встроенным и рекомендуется к использованию вместо устаревшей версии docker-compose (v1).

Архитектура и принцип работы

Docker Compose работает на основе декларативного описания приложения. Пользователь создаёт файл docker-compose.yml, в котором определяет:

  • Сервисы (services) — контейнеры, из которых состоит приложение (например, веб-сервер, база данных, кэш).
  • Сети (networks) — виртуальные сети для изоляции и взаимодействия контейнеров.
  • Тома (volumes) — постоянные хранилища данных для контейнеров.
  • Переменные окружения (environment) — настройки, передаваемые в контейнеры.
  • Зависимости (depends_on) — порядок запуска сервисов.

При выполнении команды docker compose up инструмент:

  1. Считывает конфигурацию из файла docker-compose.yml (по умолчанию) или другого указанного файла.
  2. Создаёт сети и тома, если они не существуют.
  3. Загружает образы контейнеров из реестров (например, Docker Hub) или собирает их из Dockerfile.
  4. Запускает контейнеры в определённом порядке, учитывая зависимости.
  5. Настраивает сетевые связи между контейнерами.

Основные возможности

Управление жизненным циклом приложения

Docker Compose предоставляет команды для запуска (up), остановки (stop), перезапуска (restart), удаления (down) и просмотра логов (logs) всех сервисов приложения. Команда docker compose down также удаляет созданные сети и тома (если не указано иное).

Масштабирование

С помощью параметра --scale или директивы replicas в конфигурации можно запускать несколько экземпляров одного сервиса. Например, docker compose up --scale web=3 запустит три контейнера веб-сервера. Однако для полноценного балансирования нагрузки и управления репликами в продакшене обычно используются более мощные оркестраторы, такие как Docker Swarm или Kubernetes.

Переменные окружения и файлы конфигурации

Docker Compose поддерживает использование переменных окружения, которые можно задавать в файле .env или передавать через командную строку. Это позволяет адаптировать конфигурацию под разные окружения (разработка, тестирование, продакшн) без изменения основного файла.

Сборка образов

Если для сервиса указан путь к Dockerfile, Docker Compose может автоматически собрать образ перед запуском контейнера. Это полезно для приложений, которые требуют кастомной сборки.

Сети и изоляция

По умолчанию Docker Compose создаёт отдельную сеть для каждого проекта, что обеспечивает изоляцию между разными приложениями. Можно также определять пользовательские сети с различными драйверами (bridge, overlay, macvlan).

Пример конфигурации

Ниже приведён типичный пример файла docker-compose.yml для веб-приложения с базой данных PostgreSQL:

```yaml version: '3.8'

services: web: build: . ports:

  • "8000:8000"

depends_on:

  • db

environment:

  • DATABASE_URL=postgres://user:password@db:5432/mydb

db: image: postgres:13 environment:

  • POSTGRES_USER=user
  • POSTGRES_PASSWORD=password
  • POSTGRES_DB=mydb

volumes:

  • postgres_data:/var/lib/postgresql/data

volumes: postgres_data: ```

В этом примере сервис web собирается из Dockerfile в текущей директории, а сервис db использует готовый образ PostgreSQL. Том postgres_data обеспечивает сохранность данных базы данных при перезапуске контейнера.

Применение

Локальная разработка

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

Тестирование

В CI/CD-пайплайнах Docker Compose используется для создания изолированных тестовых сред. Например, можно запустить приложение и его зависимости, выполнить интеграционные тесты, а затем удалить все контейнеры одной командой.

Демонстрация и прототипирование

Для быстрой демонстрации продукта или создания прототипа Docker Compose позволяет развернуть всё приложение одной командой, что упрощает передачу проекта другим разработчикам или заказчикам.

Образовательные цели

Docker Compose часто используется в учебных курсах и документации для демонстрации работы многоконтейнерных приложений без необходимости настройки сложной инфраструктуры.

Ограничения

Docker Compose не предназначен для управления крупными распределёнными системами в продакшене. Его основные ограничения:

  • Отсутствие автоматического восстановления — при сбое контейнера Docker Compose не перезапускает его автоматически (хотя можно настроить политику рестарта через restart: always).
  • Нет встроенного балансирования нагрузки — масштабирование сервисов не сопровождается автоматическим распределением трафика.
  • Ограниченная поддержка кластеризации — Docker Compose работает на одном хосте (или в одном Docker Swarm-кластере, но с ограничениями).
  • Нет мониторинга и логирования — инструмент не предоставляет встроенных средств для сбора метрик или централизованного логирования.

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

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

Существуют инструменты, решающие схожие задачи:

  • Docker Swarm — встроенный в Docker инструмент для кластеризации и оркестрации, поддерживает аналогичный формат docker-compose.yml.
  • Kubernetes — более мощная и сложная система оркестрации, поддерживающая развёртывание, масштабирование и управление контейнерами в кластере.
  • Podman Compose — аналог Docker Compose для Podman, совместимый с Compose Specification.
  • Nomadоркестратор от HashiCorp, поддерживающий запуск контейнеров и других типов задач.

Интересные факты

  • Docker Compose изначально назывался fig и был написан на Ruby. После приобретения Docker Inc. переписала его на Python, а затем на Go.
  • Формат docker-compose.yml версии 1 не поддерживал сети и тома — они появились в версии 2.
  • В 2023 году Docker Inc. объявила о прекращении поддержки docker-compose (v1) и рекомендовала использовать docker compose (v2).
  • Docker Compose поддерживает профили (profiles), позволяющие включать или отключать определённые сервисы в зависимости от окружения.

Источники

  • Docker Inc. — официальная документация Docker Compose
  • Compose Specification — спецификация формата
  • Docker Blog — история развития Docker Compose
  • Opensource.com — сравнение Docker Compose и Kubernetes

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →