• Docker: оркестрация

    orchestration

    Что такое оркестрация?

    Оркестрация — это координация взаимодействия нескольких контейнеров. В принципе, ничто не мешает создать контейнер, в котором запущены сразу все необходимые процессы, но этот подход лишен гибкости при масштабировании, изменении архитектуры, а также создает проблемы с безопасностью, т.к. в этом случае процессы никак не изолированы и могут без ограничений влиять друг на друга. Оркестрация же позволяет строить информационные системы из небольших кирпичиков-контейнеров, каждый из которых ответственен только за одну задачу, а общение осуществляется через сетевые порты и общие директории. При необходимости контейнеры в таком «оркестре» можно заменять на другие: например, чтобы проверить работу приложения на другой версии базы данных.

    Установка 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