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

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

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

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

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

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

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

  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. Как работают переопределения файлов
  • Слияние (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.
  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 и т.д.
  • Микросервисы и команды: Разбейте конфигурацию на отдельные файлы для разных служб или команд и комбинируйте по необходимости.
  • Функциональные переключатели (Feature toggles): Дополнительные файлы могут вводить или удалять опциональные службы или конфигурацию для временных нужд (например, 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. Для сравнения с Podman Quadlet, см. Podman Quadlet против Docker Compose для служб Linux.

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

Подписаться

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