Docker Compose¶
Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений в среде Docker. Он позволяет описать конфигурацию сервисов, сетей и томов в едином YAML-файле (обычно docker-compose.yml), после чего развернуть и управлять всеми компонентами приложения одной командой. Docker Compose является частью экосистемы Docker и предназначен для упрощения работы со сложными приложениями, состоящими из нескольких взаимосвязанных контейнеров.
¶История
Docker Compose изначально был разработан как сторонний проект под названием Fig компанией Orchard Laboratories в 2013 году. Fig предоставлял простой способ оркестрации контейнеров с использованием YAML-файла. В 2014 году Docker Inc. приобрела Orchard Laboratories, и проект был переименован в Docker Compose. Первая версия Compose (v1) была интегрирована в экосистему Docker как отдельный инструмент, устанавливаемый через pip или загружаемый как бинарный файл.
С развитием Docker Compose претерпел значительные изменения. В 2020 году вышла версия Compose v2, которая была переписана на языке Go и интегрирована непосредственно в клиент Docker (docker compose). Это позволило избавиться от необходимости установки отдельного пакета и ускорило выполнение команд. Начиная с Docker Desktop и Docker Engine версии 20.10+, docker compose является встроенной командой.
¶Основные понятия
¶Сервисы (Services)
Сервис — это логическая единица приложения, представляющая собой один или несколько контейнеров, созданных из одного образа. Каждый сервис описывает, какой образ использовать, какие порты открывать, какие переменные окружения задавать и как он взаимодействует с другими сервисами.
¶Сети (Networks)
Docker Compose автоматически создаёт изолированную сеть для приложения, в которой все сервисы могут общаться друг с другом по именам сервисов (DNS-резолвинг). Пользователь может определить собственные сети с различными драйверами (bridge, overlay, macvlan) и настройками.
¶Тома (Volumes)
Тома используются для сохранения данных, создаваемых контейнерами, и для обмена данными между контейнерами и хост-системой. Compose позволяет определять именованные тома и монтировать их в контейнеры.
¶Проект (Project)
Проект — это совокупность сервисов, сетей и томов, определённых в одном файле docker-compose.yml. Каждый проект имеет уникальное имя (по умолчанию — имя директории, в которой находится файл), что позволяет запускать несколько изолированных экземпляров одного и того же приложения на одном хосте.
¶Файл конфигурации docker-compose.yml
Файл конфигурации пишется в формате YAML. Основные секции:
version(устарело в Compose v2) — указывает версию схемы файла.services— определяет список сервисов.networks— определяет пользовательские сети.volumes— определяет именованные тома.configs— для передачи конфигурационных файлов.secrets— для управления секретами.
Пример минимального файла для веб-приложения с веб-сервером и базой данных:
```yaml services: web: image: nginx:latest ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db: image: postgres:15 environment: POSTGRES_PASSWORD: example volumes:
- pgdata:/var/lib/postgresql/data
volumes: pgdata: ```
¶Основные команды
Docker Compose предоставляет набор команд для управления жизненным циклом приложения:
docker compose up— создаёт и запускает все сервисы. С флагом-dработает в фоновом режиме.docker compose down— останавливает и удаляет контейнеры, сети и, при необходимости, тома.docker compose ps— показывает состояние контейнеров проекта.docker compose logs— выводит логи всех сервисов или конкретного сервиса.docker compose exec— выполняет команду внутри работающего контейнера.docker compose build— собирает образы для сервисов, если указана директиваbuild.docker compose pull— загружает образы, указанные в конфигурации.docker compose restart— перезапускает сервисы.
¶Классификация и варианты использования
¶По среде применения
- Локальная разработка — наиболее распространённый сценарий. Compose позволяет разработчику быстро поднять всё окружение (БД, кэш, очереди) на своей машине.
- Тестирование — в CI/CD пайплайнах Compose используется для запуска интеграционных тестов в изолированном окружении.
- Односерверные продакшн-среды — на небольших проектах или при стартапе Compose может применяться для развёртывания на одном сервере, если нет необходимости в полноценной оркестрации (Kubernetes, Docker Swarm).
¶По структуре приложения
- Веб-приложение + база данных — классическая связка (например, nginx + PHP-FPM + MySQL).
- Микросервисная архитектура — несколько независимых сервисов, общающихся по API (например, сервис аутентификации, сервис заказов, сервис уведомлений).
- Набор утилит — например, связка из самого приложения, Redis для кэширования, Elasticsearch для поиска и Kibana для визуализации.
¶Преимущества и недостатки
¶Преимущества
- Простота — для запуска сложного приложения достаточно одной команды.
- Воспроизводимость — конфигурация хранится в репозитории, что гарантирует одинаковое окружение у всех разработчиков.
- Изоляция — каждый проект работает в своей сети и не конфликтует с другими.
- Гибкость — возможность переопределять параметры через переменные окружения и файлы
.env. - Интеграция с Docker — полная совместимость с существующими образами и инструментами.
¶Недостатки
- Ограниченная оркестрация — Compose не поддерживает автоматическое масштабирование, балансировку нагрузки, распределённое хранение и самовосстановление в полном объёме.
- Одноузловая архитектура — по умолчанию Compose работает на одном хосте. Для кластерного развёртывания требуется Docker Swarm или Kubernetes.
- Сложность при большом количестве сервисов — файл конфигурации может стать слишком большим и трудночитаемым.
¶Сравнение с другими инструментами
| Инструмент | Назначение | Уровень сложности | Масштабируемость |
|---|---|---|---|
| Docker Compose | Многоконтейнерные приложения на одном хосте | Низкий | Низкая |
| Docker Swarm | Кластеризация Docker на нескольких хостах | Средний | Средняя |
| Kubernetes | Полноценная оркестрация контейнеров | Высокий | Высокая |
| Podman Compose | Альтернатива Compose для Podman | Средний | Средняя |
¶Интересные факты
- Docker Compose поддерживает профили (
profiles), позволяющие включать или отключать группы сервисов при запуске. Например, можно определить профильdevс инструментами отладки и профильprodбез них. - Файл
docker-compose.ymlможет включать в себя другие файлы с помощью директивыinclude, что позволяет разбивать большие конфигурации на модули. - Compose v2 полностью обратно совместим с синтаксисом Compose v1, но рекомендуется использовать новую версию для лучшей производительности.
- Существует проект
compose-spec(Compose Specification), который стандартизирует формат файла для использования в различных инструментах, включая Docker, Podman и другие.
¶Источники
- Официальная документация Docker Compose (docs.docker.com/compose)
- Docker Compose Specification (compose-spec.io)
- Статья «The Story of Docker Compose» — блог Docker Inc.
- Документация Docker Engine и Docker Desktop
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

