Шпаргалка Docker Compose - Самые полезные команды с примерами
Кстати, docker-compose отличается от docker compose...
Вот шпаргалка по Docker Compose с аннотированными примерами, чтобы помочь вам быстро освоить файлы и команды 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
. - 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:
Веб и БД находятся в одной сети; БД использует сохраненный именованный том - db_data
.
Использование контекста сборки и пути к Dockerfile
Вы можете собрать docker образ по требованию из указанного в 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: Установка переменных окружения для контейнеров.
- depends_on: Управление порядком запуска сервисов.
- deploy.replicas: Масштабирование сервиса в режиме Swarm.
Пример:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
Запускает 3 экземпляра веб-инстансов; управляет только порядком запуска (не готовностью).
Основные команды 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
между перезапусками контейнеров. -
Привязка кода для разработки
services: app: build: . volumes: - .:/app
Редактирование кода на хосте с автоматическим отражением в контейнере.
Полезные флаги
-d
: Режим отсоединения (запуск в фоне).--build
: Принудительная пересборка образов перед запуском.--force-recreate
: Пересоздание контейнеров даже если они не изменились.--remove-orphans
: Удаление контейнеров, не определенных в файле Compose.
Определение и настройка сервисов
Вы можете определять и настраивать сервисы, сети и тома в Docker Compose, используя файл docker-compose.yml
, который централизует всю конфигурацию и оркестрацию вашего приложения.
- Сервисы определяются под ключом
services
. - Каждый сервис представляет конфигурацию контейнера, где можно установить:
- Изображение: Выбор образа из Docker Hub или другого реестра.
- Порты: Отображение портов контейнера на порты хоста.
- Переменные окружения: Передача значений конфигурации.
- Томы: Сохранение данных или обмен файлами/папками с хостом или другими сервисами.
- Сетевые настройки: Управление доступом к сетям.
Пример:
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
гарантирует, что данные базы не теряются при пересоздании контейнера. - Вы можете определять привязки с пользовательскими параметрами драйвера для сложных случаев:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Эта конфигурация настраивает привязку от хостового пути
/data/db_data
в контейнер.
Сводка лучших практик:
- Используйте имя сервиса в качестве DNS-хоста для межсервисного взаимодействия.
- Подключайте сервисы к нескольким сетям по мере необходимости для управления доступом.
- Используйте именованные тома для постоянного хранения и обмена данными.
- Определяйте все с помощью YAML, что позволяет использовать контроль версий и простые сценарии развертывания.
Множественные файлы 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 # Локальные/dev переопределения (применяются автоматически)
|-- docker-compose.prod.yml # Переопределения для продакшена
|-- docker-compose.test.yml # Переопределения для тестирования (если нужно)
Базовая конфигурация определяет основные сервисы, а каждое переопределение настраивает параметры для конкретной среды или случая.
- Как работают переопределения файлов
- Объединение: При запуске
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 и т.д.
- Микросервисы и команды: Разделите конфигурацию на отдельные файлы для разных сервисов или команд и объединяйте по мере необходимости.
- Функциональные переключатели: Дополнительные файлы могут включать или удалять необязательные сервисы или конфигурации для временных нужд (например,
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.