Докер Композ
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 инструмент:
- Считывает конфигурацию из файла
docker-compose.yml(по умолчанию) или другого указанного файла. - Создаёт сети и тома, если они не существуют.
- Загружает образы контейнеров из реестров (например, Docker Hub) или собирает их из Dockerfile.
- Запускает контейнеры в определённом порядке, учитывая зависимости.
- Настраивает сетевые связи между контейнерами.
Основные возможности
Управление жизненным циклом приложения
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 →