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 up --build -d
Убеждаемся, что нужные нам контейнеры созданы и запущены!
Рекомендую использовать для большинства пользователей текущая стабильная версию. Например, потому что в последних версиях 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 произошли некоторые изменения. В версии 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