Что такое оркестрация?
Оркестрация — это координация взаимодействия нескольких контейнеров. В принципе, ничто не мешает создать контейнер, в котором запущены сразу все необходимые процессы, но этот подход лишен гибкости при масштабировании, изменении архитектуры, а также создает проблемы с безопасностью, т.к. в этом случае процессы никак не изолированы и могут без ограничений влиять друг на друга. Оркестрация же позволяет строить информационные системы из небольших кирпичиков-контейнеров, каждый из которых ответственен только за одну задачу, а общение осуществляется через сетевые порты и общие директории. При необходимости контейнеры в таком «оркестре» можно заменять на другие: например, чтобы проверить работу приложения на другой версии базы данных.
Установка Docker Compose
Почитать об установке Docker Compose на разные ОС можно на официальном сайте проекта: https://docs.docker.com/compose/
Настройка оркестрации
Для управления параметрами оркестризации используется конфигурационный файл, подробно описывающий как параметры запуска отдельных контейнеров, так и все связи между ними. По-умолчанию, конфиг называется docker-compose.yml и имеет подобный вид:
fpm:
build: ./fpm/
links:
- db
- mc
volumes:
- ./www:/var/www
db:
build: ./db/
volumes:
- ./db:/var/lib/mysql
ports:
- 3306:3306
mc:
build: ./mc/
ports:
- 8080:1080
nginx:
build: ./nginx/
links:
- fpm
ports:
- 80:80
- 443:443
volumes:
- ./www:/var/www
В примере представлено окружение для простого приложение на php/mysql, предназначенного для тестирования и разработки.
- build — Относительный путь до папки, содержащей Dockerfile. Позволяет заново собрать контейнер. Альтернативой ему является image, указывающий название образа. Для одного узла можно указать либо сборку, либо готовый образ — но не вместе.
- links — Прямые связи между контейнерами в связке. Например, контейнер fpm сможет обращаться к контейнеру db напрямую, используя хост «db». Использовать этот адрес можно где угодно, так как он представляет из себя запись в /etc/hosts, оставленную Docker при запуске контейнеров и указывающую на текущий контейнер db.
- volumes — Монтирование директорий хоста в файловую систему контейнера. Несколько контейнеров могут делить доступ к директории. Так, например, в примере и Nginx, и Fpm имеют доступ к корневой директории проекта.
- ports — Перенаправление портов хоста в порты контейнера. На самом деле порты не обязаны совпадать. Никто не мешает направлять порт контейнера 80 в порт хоста 8080 (или наоборот). Также можно указать сетевой интерфейс, на котором порт хоста будет «слушать». Например, 127.0.0.1:80:80.
И т.д. Параметры во многом аналогичны тем, что используются при запуске контейнера через «docker run». Подробно можно прочитать на официальном сайте.
Сборка контейнеров
# остановка контейнеров (если они уже были собраны ранее)
sudo docker-compose stop
# удаление контейнеров (если они уже были собраны ранее и остановлены)
sudo docker-compose rm
# сборка
sudo docker-compose build
Запуск контейнеров
При указании ключа «d» утилита будет запущена в фоновом режиме.
sudo docker-compose up