Оркестровка контейнеров: Простой кластер Docker Compose

Docker Compose представляет собой инструмент, который значительно упрощает разработку и управление многоконтейнерными Docker-приложениями. От создания изолированных сред до автоматизации развертывания. Docker-compose не входит в единый пакет поставки Docker и устанавливается отдельно. Для сборки кластера контейнеров используется управляющий файл docker-compose.yml. Файл docker-compose.yml записан не в декларативном ini-стиле как docker-файлы, а в древовидном YAML.

Установим Compose автономно. Последнюю версию релиза compose смотрим на Github.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Проверим работает или нет

# docker-compose -v
Docker Compose version v2.6.0

По сути дела это «пакетный менеджер» для Docker, как, к примеру, composer для PHP. Пользоваться им несложно:

  • Описываем конфигурацию контейнеров для нашего проекта в файле docker-compose.yaml
  • Собираем проект, используя команду
docker-compose up --build -d

Убеждаемся, что нужные нам контейнеры созданы и запущены!

Какую версию Docker Compose использовать?

Рекомендую использовать для большинства пользователей текущая стабильная версию. Например, потому что в последних версиях Docker Compose была удалена функция "рекомендации по конфигурации". Это было сделано из-за того, что рекомендации могли быть неточными или вводить в заблуждение в некоторых случаях. Текущая стабильная версия: 1.29.2 (выпущена в 2021).

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Docker Compose vs Stack

В связи с последними релизами в мире Docker произошли некоторые изменения. В версии 1.12 в Docker Engine был интегрирован режим Swarm, в связи с чем появилось несколько новых инструментов. Среди прочего, теперь появилась возможность использовать Compose-файлы docker-compose.yml (API версии 3 и выше) для создания стеков контейнеров Docker без необходимости устанавливать инструмент Docker Compose. Теперь для этого есть команда docker stack, и она очень похожа на docker-compose.

В самом начале файла docker-compose.yml обычно присутствует строка version: '2' или version: '3'. Это и есть версия API Docker Compose!

Если планируете использовать Docker stack / Docker Swarm, вам нужна версия 3 и выше, более старые технология Swarm не понимает.

На сегодняшний день Docker Compose имеет 3 основные версии API (v1, v2 и v3). В зависимости от используемой версии вам могут быть доступны (или недоступны) некоторые полезные функции и возможности. Если вы не видите строки с явно заданной версии API, это означает что в вашем случае используется самая первая версия (v1). Эта версия уже признана устаревшей и больше не рекомендуется к использованию.

Простая рекомендация - использовать самую последнюю (актуальную) версию. На официальном сайте всегда можно просмотреть матрицу совместимости, чтобы узнать, совместима ли ваша версия API с конкретной бинарной версией docker-compose.

По началу даже в не очень сложном Docker-compose.yml можно наделать ошибок, которые на глаз не видны, поэтому перед запуском сборки проекта — проверьте код, каким-нибудь YAML-валидатором, например yamllint.

# Версия API
version: "3"
# Определяем список сервисов — services
# Эти сервисы будут частью нашего приложения
services:
 
  app: # Имя сервиса
    build:
      # Контекст для сборки образа,
      # в данном случае, текущая директория
      context: .
      # Имя Docker-файла из которого будет собран образ
      dockerfile: Dockerfile
      # Команда, которая будет выполнена после старта сервиса
    command: make start
    ports: # Проброс портов
      - "3000:8000"
    # Перечисляем тома (volumes)
    # Они будут подключены к файловой системе сервиса
    # Например, все что находится в . мы увидим в директории /app
    volumes:
      # Текущая директория пробрасывается в директорию /app внутри контейнера
      # Путь внутри контейнера (после двоеточия) обязательно должен быть абсолютным
      - ".:/app"
      - "/tmp:/tmp"
    # Сервис будет запущен, только после старта db
    depends_on:
      - db
 
  db:
    # Имя образа. Здесь мы используем базу данных Postgres
    image: postgres:latest
    environment:
      # А так задаются переменные окружения
      POSTGRES_PASSWORD: password
    volumes:
      - pgdata:/var/lib/postgresql/data
 
  volumes:
    pgdata:

Находясь в корневом каталоге проекта вызовем команду, которая соберет образы, запустит контейнеры:

docker-compose up -d

Отдельного внимания заслуживает запуск контейнера docker compose. Так, после смены настроек в файле docker-compose.yml (например, проброс порта) изменения не выполняются автоматически. Вдобавок, команда restart также не поможет и потребуется выполнить пересборку контейнера, применив для этого команду build. Другими словами, он будет заново создан.

Решить эту задачу можно немножко по разному, но эффект будет один и тот же:

docker-compose up -d --no-deps --build

Можно сразу применить изменения и запустить

docker compose down
docker compose up -d

или одной командой

docker compose up -d --force-recreate

Собирает сервисы, описанные в конфигурационных файлах

docker compose build

Запускает собранные сервисы

docker compose up

Запуск контейнеров на фоне с флагом -d

docker compose up -d

Если какой-то из сервисов завершит работу, то остальные будут остановлены автоматически

docker compose up --abort-on-container-exit

Запустит сервис application и выполнит внутри команду make install

docker compose run application make install

Запустить сервис и подключиться к нему с помощью bash

docker compose run application bash

С флагом –rm запускаемые контейнеры будут автоматически удаляться

docker compose run --rm application bash

Останавливает и удаляет все сервисы, которые были запущены с помощью up

docker compose down

Останавливает, но не удаляет сервисы, запущенные с помощью up. Их можно запустить снова с помощью docker-compose start

docker compose stop
PQ VPS сервера в 28+ странах.