Шпаргалка по Docker Compose — самые полезные команды с примерами

Кстати, docker-compose отличается от docker compose...

Содержимое страницы

Вот шпаргалка по Docker Compose с аннотированными примерами, которая поможет вам быстро освоить файлы Compose и команды.

Это руководство является частью раздела Инструменты разработчика: Полное руководство по современным workflow разработки.

Предварительные требования

Перед использованием Compose необходимо установить Docker Engine. На Ubuntu следуйте инструкциям из руководства Установка Docker на Ubuntu, чтобы выбрать правильный метод установки и настроить плагин docker compose.

docker-compose schema

Справочник по файлу 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 и файлы переопределения, что позволяет создавать модульные, зависящие от окружения и масштабируемые конфигурации. Вот как это работает:

  1. Структура базового и файла переопределения
  • Создайте базовый файл (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      # Переопределения для тестов (если нужны)

Базовая конфигурация определяет основные службы, в то время как каждое переопределение настраивает параметры для конкретного окружения или случая.

  1. Как работают файлы переопределения
  • Объединение: При запуске 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.
  1. Использование команд для нескольких файлов
  • Поведение по умолчанию: Если присутствует, Docker Compose автоматически загружает docker-compose.override.yml вместе с docker-compose.yml при запуске любой команды.
  • Ручное указание файлов: Используйте флаги -f для контроля того, какие файлы объединяются и в каком порядке:
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
    
    • Это игнорирует переопределение по умолчанию и использует настройки для продакшена.
  1. Практические стратегии организации
  • Разделение по окружениям: Используйте одно переопределение на окружение: dev, test, prod и т.д.
  • Микросервисы и команды: Разбивайте конфигурацию на отдельные файлы для разных служб или команд и комбинируйте по мере необходимости.
  • Переключатели функций: Дополнительные файлы могут добавлять или удалять опциональные службы или конфигурацию для временных потребностей (например, compose.debug.yml для расширенного логирования).
  1. Преимущества
  • Ясность: Держит отдельные файлы небольшими и сфокусированными.
  • Масштабируемость: Легко добавлять новые службы, окружения или настройки.
  • Сопоставимость: Меняйте или просматривайте только релевантные разделы для данного развертывания.
  1. Пример: Переключение окружений

Разработка:

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.

Полезные ссылки

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.