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

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

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

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

  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  # Локальные/dev переопределения (применяются автоматически)
|-- 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.

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