Шпаргалка по Docker Compose — самые полезные команды с примерами
Кстати, docker-compose отличается от docker compose...
Вот шпаргалка по Docker Compose с прокомментированными примерами, чтобы быстро освоить файлы и команды Compose.
Это руководство является частью Инструменты разработчика: Полное руководство по современным рабочим процессам разработки.
Предварительные требования
Docker Engine должен быть установлен перед использованием Compose. На Ubuntu следуйте инструкции Установка Docker на Ubuntu для выбора подходящего метода установки и настройки плагина docker compose.

Справочник по файлу Compose: docker-compose.yml
Базовая структура:
version: '3' # Версия формата файла Compose
services:
web:
image: nginx:latest
ports:
- "8080:80" # Порт хоста 8080:Порт контейнера 80
db:
image: postgres
environment: # Переменные окружения
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Сетевая сеть
appnet:
driver: bridge
volumes: # Именованный том
db_data:
- services: Каждый контейнер в вашем приложении с несколькими контейнерами. В примере выше у нас есть две службы:
webиdb. Для операций с отдельными контейнерами смотрите Шпаргалку по Docker. - networks & volumes: Определение изолированных сетей и постоянного хранилища - здесь у нас есть сеть
appnetи томdb_data.
Примеры
Одиночная служба с маппингом портов
services:
app:
build: .
ports:
- "8000:80" # Порт хоста 8000:Порт контейнера 80
Открывает приложение на порту хоста 8000 и собирает его из Dockerfile в текущей директории.
Несколько служб с общим томом и пользовательской сетью
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
Web и DB в одной сети; DB использует постоянный именованный том - db_data.
Использование контекста сборки и пути к Dockerfile
Вы можете собрать docker image по запросу из указанного в docker-compose.yml Dockerfile.
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
Обмен данными между службами
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
Обе службы имеют доступ к одному и тому же тому (для статических файлов или обмена данными) - shared_data.
Продвинутые опции файла Compose
- environment: Установка переменных ENV для контейнеров.
- depends_on: Контроль порядка запуска служб.
- deploy.replicas: Масштабирование службы в режиме Swarm.
Пример:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
Запускает 3 экземпляра web; контролирует только порядок запуска (не готовность).
Основные команды Docker Compose
| Команда | Описание | Пример использования |
|---|---|---|
docker-compose up |
Создаёт и запускает контейнеры | docker-compose up |
docker-compose up -d |
Запуск в фоновом режиме | docker-compose up -d |
docker-compose exec |
Выполнение команды в запущенном контейнере | docker-compose exec web bash |
docker-compose build |
Сборка/пересборка образов | docker-compose build |
docker-compose down |
Остановка и удаление контейнеров, сетей, томов и образов | docker-compose down |
docker-compose logs -f |
Просмотр и следование журналам | docker-compose logs -f |
docker-compose ps |
Список запущенных контейнеров | docker-compose ps |
docker-compose run |
Выполнение однократных команд (обходит команду в файле Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
Остановка запущенных контейнеров (можно перезапустить с помощью start) |
docker-compose stop |
docker-compose restart |
Перезапуск служб | docker-compose restart web |
docker-compose pull |
Загрузка образов служб | docker-compose pull |
docker-compose rm |
Удаление остановленных контейнеров служб | docker-compose rm web |
docker-compose config |
Валидация и просмотр файла Compose | docker-compose config |
docker-compose up --scale web=3 |
Запуск нескольких экземпляров службы | docker-compose up --scale web=3 |
Частые паттерны Compose
-
Базы данных с постоянными данными
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:Данные БД сохраняются в томе
mysql_dataпри перезапуске контейнеров. -
Связывание (Bind mount) кода для разработки
services: app: build: . volumes: - .:/appРедактируйте код на хосте в реальном времени, изменения автоматически отражаются в контейнере.
Полезные флаги
-d: Фоновый режим (запуск в фоне).--build: Принудительная пересборка образов перед запуском.--force-recreate: Пересоздать контейнеры даже если они не менялись.--remove-orphans: Удалить контейнеры, не определенные в файле Compose.
Определение и настройка служб
Вы можете определить и настроить службы, сети и тома в Docker Compose, используя файл docker-compose.yml, который централизует все потребности вашей конфигурации приложения и оркестрации.
- Services определяются под ключом
services. - Каждая служба представляет конфигурацию контейнера, где вы можете установить:
- Image: Выбор образа из Docker Hub или другого реестра.
- Ports: Маппинг портов контейнера на порты хоста.
- Переменные окружения: Передача значений конфигурации.
- Volumes: Сохранение данных или обмен файлами/папками с хостом или другими службами.
- Networks: Контроль того, к каким сетям служба может получить доступ.
Пример:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Порт хоста 8080:Порт контейнера 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- Здесь служба
webиспользует образ nginx, устанавливает переменную окружения, подключает том, открывает порт 80 как 8080 на хосте и подключается к сетиfrontend. Службаdbделает что-то подобное для PostgreSQL.
Настройка сетей
- Networks контролируют, какие службы могут взаимодействовать. Compose создает сетью по умолчанию, но вы можете определить дополнительные, указать пользовательские драйверы, установить параметры и определить, какая служба подключается к какой сети для детальной изоляции.
- Определите сети на верхнем уровне под
networksи перечислите, к каким сетям должна подключаться служба, с помощью ключаnetworksна уровне службы.
Пример:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- Подключение сетей к службам:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- Эта конфигурация позволяет службе
appполучать доступ как к пользователям в сетиfrontend, так и в сетиbackend, тогда какdbдоступен только внутриbackend.
Настройка томов
- Volumes определяются под ключом верхнего уровня
volumes. Подключайте их к контейнерам, используя ключvolumesпод службой. - Тома могут быть именованными, использовать пользовательские драйверы и разделяться между несколькими службами для сохранения и обмена данными.
Пример:
volumes:
web_data: # Именованный том для контента web
db_data: # Именованный том для базы данных
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- В этом примере
web_dataсохраняется и доступно любому контейнеру, который его монтирует.db_dataгарантирует, что данные базы данных не будут потеряны при пересоздании контейнера. - Вы можете определить bind-mounts с пользовательскими параметрами драйвера для сложных случаев:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Эта конфигурация настраивает bind-mount с пути хоста
/data/db_dataвнутрь контейнера.
Сводка лучших практик:
- Используйте имя службы в качестве DNS-имени хоста для межсервисной коммуникации.
- Подключайте службы к нескольким сетям по необходимости для управления доступом.
- Используйте именованные тома для постоянного хранилища и обмена данными.
- Определяйте всё с помощью YAML, что обеспечивает версионирование и легкость сценариев развёртывания.
- Для управления контейнерами и визуализации рассмотрите Установку Portainer на Linux.
Несколько файлов compose
Для организации сложных многокомпонентных установок в Docker Compose вы можете использовать несколько файлов compose и файлы переопределения, что позволяет создавать модульные, специфичные для окружения и масштабируемые конфигурации. Вот как это работает:
- Структура базового и файла переопределения
- Создайте базовый файл (
compose.yamlилиdocker-compose.yml), содержащий все общие, значения по умолчанию определения служб. - Добавьте файлы переопределения для специфичных окружений (например,
docker-compose.override.yml,docker-compose.dev.yml,docker-compose.prod.yml).
Пример структуры файлов:
/project-directory
|-- docker-compose.yml # Базовая конфигурация
|-- docker-compose.override.yml # Локальные/для разработки переопределения (применяются автоматически)
|-- docker-compose.prod.yml # Переопределения для продакшена
|-- docker-compose.test.yml # Переопределения для тестов (при необходимости)
Базовая конфигурация определяет основные службы, а каждое переопределение настраивает параметры для конкретного окружения или случая.
- Как работают переопределения файлов
- Слияние (Merging): Когда вы запускаете
docker compose up, Docker Compose сливает базовый файл с любыми переопределениями по порядку; последующие файлы переопределяют, расширяют или добавляют настройки из предыдущих файлов. - Переопределение полей: Если служба или поле определены в нескольких файлах, используется значение из последнего указанного файла. Новые поля добавляются.
Пример слияния:
docker-compose.yml:services: web: image: myapp ports: - "8000:80"docker-compose.override.yml:services: web: environment: - DEBUG=true- Результат: Служба
webиспользует как базовый образ и порт, так и переопределенную переменную окруженияDEBUG.
- Использование команд для нескольких файлов
- Поведение по умолчанию: Если присутствует, Docker Compose автоматически загружает
docker-compose.override.ymlвместе сdocker-compose.ymlпри выполнении любой команды. - Ручное указание файлов: Используйте флаги
-f, чтобы контролировать, какие файлы сливаются и в каком порядке:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- Это игнорирует переопределение по умолчанию и использует настройки, специфичные для продакшена.
- Практические стратегии организации
- Разделение окружений: Используйте одно переопределение на окружение: dev, test, prod и т.д.
- Микросервисы и команды: Разбейте конфигурацию на отдельные файлы для разных служб или команд и комбинируйте по необходимости.
- Функциональные переключатели (Feature toggles): Дополнительные файлы могут вводить или удалять опциональные службы или конфигурацию для временных нужд (например,
compose.debug.ymlдля дополнительного логирования).
- Преимущества
- Ясность: Держит отдельные файлы маленькими и сфокусированными.
- Масштабируемость: Легко добавлять новые службы, окружения или настройки.
- Поддерживаемость: Меняйте или просматривайте только соответствующие секции для данного развёртывания.
- Пример: Переключение окружений
Разработка:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Продакшен:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Каждое окружение получает только необходимую для него конфигурацию, а вся общая конфигурация находится в базовом файле.
Организация сложных установок Compose с использованием нескольких файлов - и использование системы переопределения/слияния - обеспечивает модульность, настройку под конкретное окружение и легкую масштабируемость для крупных многокомпонентных приложений Docker.
Для продакшен-развёртывания на едином хосте Linux — запуск при загрузке, чистое завершение работы, обновления и ротация логов — см. Запуск Docker Compose как службы Linux с systemd. Для сравнения с Podman Quadlet, см. Podman Quadlet против Docker Compose для служб Linux.