Шпаргалка по Docker Compose — самые полезные команды с примерами
Кстати, docker-compose отличается от docker compose...
Вот шпаргалка по Docker Compose с аннотированными примерами, которая поможет вам быстро освоить файлы Compose и команды.
Это руководство является частью раздела Инструменты разработчика: Полное руководство по современным workflow разработки.
Предварительные требования
Перед использованием Compose необходимо установить Docker Engine. На 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-образ по требованию из Dockerfile, указанного в docker-compose.yml.
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-монтирование кода для разработки
services: app: build: . volumes: - .:/appРедактирование кода на хосте в реальном времени с автоматическим отражением изменений в контейнере.
Полезные флаги
-d: Режим отсоединения (запуск в фоне).--build: Принудительная пересборка образов перед запуском.--force-recreate: Пересоздание контейнеров даже при отсутствии изменений.--remove-orphans: Удаление контейнеров, не определенных в файле Compose.
Определение и настройка служб
Вы можете определять и настраивать службы, сети и томы в Docker Compose, используя файл docker-compose.yml, который централизует все конфигурации и оркестрацию вашего приложения.
- Службы определяются под ключом
services. - Каждая служба представляет конфигурацию контейнера, где вы можете задать:
- Image: Выбор образа из Docker Hub или другого реестра.
- Ports: Маппинг портов контейнера на порты хоста.
- Environment variables: Передача значений конфигурации.
- 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.
Настройка сетей
- Сети контролируют, какие службы могут взаимодействовать. 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:
web_data: # Именованный том для веб-контента
db_data: # Именованный том для базы данных
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- В этом примере
web_dataсохраняется и доступен любому контейнеру, который его монтирует.db_dataгарантирует, что данные базы данных не будут потеряны при пересоздании контейнера. - Вы можете определить bind-монтирования с пользовательскими опциями драйвера для сложных случаев:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Эта конфигурация устанавливает bind-монтирование из пути хоста
/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 # Переопределения для тестов (если нужны)
Базовая конфигурация определяет основные службы, в то время как каждое переопределение настраивает параметры для конкретного окружения или случая.
- Как работают файлы переопределения
- Объединение: При запуске
docker compose upDocker 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 и т.д.
- Микросервисы и команды: Разбивайте конфигурацию на отдельные файлы для разных служб или команд и комбинируйте по мере необходимости.
- Переключатели функций: Дополнительные файлы могут добавлять или удалять опциональные службы или конфигурацию для временных потребностей (например,
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.