Статьи

Использование Docker Stack и создание файлов YAML для развертывания сервисов Swarm

Звонят колокола! Docker v1.13 вышел!

Самый распространенный вопрос, который я получаю во время моих бесед и семинаров, связанных с Docker, обычно касается Swarm and Compose.

Кто-то : Как я могу использовать Docker Compose с Docker Swarm?

Я : Ты не можешь! Вы можете конвертировать свои файлы Compose в Bundle, который не поддерживает все функции Swarm. Если вы хотите использовать Swarm в полной мере, будьте готовы к тому, что docker service create команды, которые содержат бесконечный список аргументов.

Такой ответ обычно сопровождался разочарованием. Docker Compose продемонстрировал нам преимущества указания всего в файле YAML по сравнению с попыткой запомнить все аргументы, которые мы должны передать командам docker . Это позволило нам хранить определения сервисов в репозитории, обеспечивая воспроизводимый и хорошо документированный процесс управления ими. Docker Compose заменил скрипты bash, и нам понравилось. Затем появился Docker v1.12 и поставил перед нами трудный выбор. Должны ли мы принять Swarm и отказаться от Compose? С лета 2016 года Swarm и Compose больше не были влюблены. Это был болезненный развод.

Но после почти полугода разлуки они снова вместе, и мы можем стать свидетелями их второго медового месяца. Вид… Нам не нужен двоичный файл Docker Compose для сервисов Swarm, но мы можем использовать его файлы YAML.

В Docker Engine v1.13 появилась поддержка создания файлов YAML в команде stack . В то же время, Docker Compose v1.10 представил новую версию 3 своего формата. Вместе они позволяют нам управлять нашими сервисами Swarm, используя уже знакомый формат Docker Compose YAML.

Я предполагаю, что вы уже знакомы с Docker Compose и не будете вдаваться в подробности всего, что мы можем с ним сделать. Вместо этого мы рассмотрим пример создания нескольких сервисов Swarm.

Мы рассмотрим, как создать сервис Docker Flow Proxy с помощью файлов Docker Compose и команды docker stack deploy .

Требования

В следующих примерах предполагается, что вы используете Docker v1.13 +, Docker Compose v1.10 + и Docker Machine v0.9 +.

Если вы пользователь Windows, пожалуйста, запустите все примеры из Git Bash (устанавливается через Docker Toolbox ). Также убедитесь, что ваш Git-клиент настроен для проверки кода AS-IS . В противном случае Windows может изменить возврат каретки в формат Windows.

Настройка роевого кластера

Чтобы настроить пример Swarm-кластера с помощью Docker Machine, выполните следующие команды.

Не стесняйтесь пропустить этот раздел, если у вас уже есть работающий кластер Swarm.

1
2
3
4
5
6
7
8
9
curl -o swarm-cluster.sh \
    https://raw.githubusercontent.com/
vfarcic/docker-flow-proxy/master/scripts/swarm-cluster.sh
 
chmod +x swarm-cluster.sh
 
./swarm-cluster.sh
 
docker-machine ssh node-1

Теперь мы готовы развернуть сервис docker-flow-proxy .

Создание сервисов Swarm с помощью команд стека Docker

Начнем с создания сети.

1
docker network create --driver overlay proxy

Прокси- сеть будет выделена для прокси-контейнера и сервисов, которые будут к нему подключены.

Мы будем использовать docker-compose-stack.yml из репозитория vfarcic / docker-flow-proxy для создания сервисов docker-flow-proxy и docker-flow-swarm-listener .

docker-compose-stack.yml файла docker-compose-stack.yml выглядит следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: "3"
 
services:
 
  proxy:
    image: vfarcic/docker-flow-proxy
    ports:
      - 80:80
      - 443:443
    networks:
      - proxy
    environment:
      - LISTENER_ADDRESS=swarm-listener
      - MODE=swarm
    deploy:
      replicas: 2
 
  swarm-listener:
    image: vfarcic/docker-flow-swarm-listener
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure
      - DF_NOTIFY_REMOVE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/remove
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  proxy:
    external: true

Формат написан в версии 3 (обязательно для docker stack deploy ).

Он содержит две службы; proxy и swarm-listener . Так как эта статья не предназначена для того, чтобы научить вас использовать прокси, я не буду вдаваться в значение каждого аргумента.

По сравнению с предыдущими версиями Compose, большинство новых аргументов определены в deploy . Вы можете рассматривать этот раздел как заполнитель для специфических для Swarm аргументов. В этом случае мы указываем, что proxy служба должна иметь две реплики, в то время как служба swarm-listener должна быть ограничена ролями менеджера. Все остальное, определенное для этих двух сервисов, использует тот же формат, что и в более ранних версиях Compose.

Внизу файла YAML находится список сетей, на которые ссылаются services . Если служба не указывает ни одну из них, сеть по default будет создана автоматически. В этом случае мы выбрали ручное создание сети, поскольку службы из других стеков должны иметь возможность обмениваться данными с прокси. Поэтому мы создали сеть вручную и определили ее как external в файле YAML.

Давайте создадим стек на основе файла YAML, который мы исследовали.

1
2
3
4
5
curl -o docker-compose-stack.yml \
    https://raw.githubusercontent.com/
vfarcic/docker-flow-proxy/master/docker-compose-stack.yml
 
docker stack deploy -c docker-compose-stack.yml proxy

Первая команда загрузила Compose-файл docker-compose-stack.yml из хранилища vfarcic / docker-flow-proxy . Вторая команда создала сервисы, которые формируют стек.

Задачи стека можно увидеть с помощью команды stack ps .

1
docker stack ps proxy

Вывод выглядит следующим образом (для краткости идентификаторы удалены).

1
2
3
4
NAME                   IMAGE                                     NODE   DESIRED STATE CURRENT STATE         ERROR  PORTS
proxy_proxy.1          vfarcic/docker-flow-proxy:latest          node-2 Running       Running 2 minutes ago
proxy_swarm-listener.1 vfarcic/docker-flow-swarm-listener:latest node-1 Running       Running 2 minutes ago
proxy_proxy.2          vfarcic/docker-flow-proxy:latest          node-3 Running       Running 2 minutes ago

Мы запустили две копии proxy (для обеспечения высокой доступности в случае сбоя) и одну из swarm-listener .

Развертывание большего количества стеков

Давайте развернем другой стек.

На этот раз мы будем использовать стек Docker, определенный в файле Compose docker-compose-stack.yml, который находится в репозитории vfarcic / go-demo . Это так.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3'
 
services:
 
  main:
    image: vfarcic/go-demo
    environment:
      - DB=db
    networks:
      - proxy
      - default
    deploy:
      replicas: 3
      labels:
        - com.df.notify=true
        - com.df.distribute=true
        - com.df.servicePath=/demo
        - com.df.port=8080
 
  db:
    image: mongo
    networks:
      - default
 
networks:
  default:
    external: false
  proxy:
    external: true

Стек определяет две службы ( main и db ). Они будут связываться друг с другом через сеть по default которая будет автоматически создаваться стеком (нет необходимости в команде docker network create ). Поскольку main сервисом является API, он должен быть доступен через прокси, поэтому мы также подключаем сеть proxy .

Важно отметить, что мы использовали раздел deploy чтобы определить специфичные для Swarm аргументы. В этом случае main сервис определяет, что должно быть три реплики и несколько меток. Как и в предыдущем стеке, мы не будем вдаваться в детали каждого сервиса. Если вы хотите более подробно изучить метки, используемые в main сервисе, посетите учебник « Запуск прокси-сервера потока Docker в режиме Swarm с автоматической перенастройкой» .

Давайте развернем стек.

1
2
3
4
5
6
7
8
curl -o docker-compose-go-demo.yml \
    https://raw.githubusercontent.com/
vfarcic/go-demo/master/docker-compose-stack.yml
 
docker stack deploy \
    -c docker-compose-go-demo.yml go-demo
 
docker stack ps go-demo

Мы загрузили определение стека, выполнили команду stack deploy которая создала службы, и выполнили команду stack ps которая перечисляет задачи, которые принадлежат стеку go-demo . Вывод выглядит следующим образом (для краткости идентификаторы удалены).

1
2
3
4
5
6
7
8
NAME           IMAGE                  NODE    DESIRED STATE CURRENT STATE          ERROR PORTS
go-demo_main.1 vfarcic/go-demo:latest node-2 Running        Running 7 seconds ago
...
go-demo_db.1   mongo:latest           node-2 Running        Running 21 seconds ago
go-demo_main.2 vfarcic/go-demo:latest node-2 Running        Running 19 seconds ago
...
go-demo_main.3 vfarcic/go-demo:latest node-2 Running        Running 20 seconds ago
...

Поскольку база данных Mongo намного больше main службы, ее извлечение занимает больше времени, что приводит к нескольким сбоям. Сервис go-demo предназначен для сбоя, если он не может подключиться к своей базе данных. Когда служба db запущена, main служба перестает работать, и мы увидим три реплики с текущим состоянием Running .

Через несколько секунд служба swarm-listener обнаружит main службу из стека go-demo и отправит proxy запрос на перенастройку. Мы можем увидеть результат, отправив HTTP-запрос на прокси.

1
curl -i "localhost/demo/hello"

Вывод следующий.

1
2
3
4
5
6
HTTP/1.1 200 OK
Date: Thu, 19 Jan 2017 23:57:05 GMT
Content-Length: 14
Content-Type: text/plain; charset=utf-8
 
hello, world!

Прокси-сервер был переконфигурирован и перенаправляет все запросы с базовым путем /demo в main сервис из стека go-demo .

Более подробное использование прокси-сервера см. В примерах из руководства « Запуск прокси-сервера потока Docker в режиме Swarm с автоматической перенастройкой» или в документации по конфигурации и использованию .

Укладывать или не укладывать

Стек Docker — отличное дополнение к Swarm Mode. Нам не нужно иметь дело с командами docker service create Docker, которые, как правило, имеют бесконечный список аргументов. С сервисами, указанными в файлах Compose YAML, мы можем заменить эти длинные команды простым docker stack deploy . Если эти файлы YAML хранятся в репозиториях кода, мы можем применять те же методы для развертывания служб, что и для любой другой области разработки программного обеспечения. Мы можем отслеживать изменения, делать обзоры кода, делиться с другими и так далее.

Добавление команды stack Docker и ее способность использовать файлы Compose является очень полезным дополнением к экосистеме Docker.

уборка

Пожалуйста, удалите виртуальные машины Docker Machine, которые мы создали. Вам могут понадобиться эти ресурсы для некоторых других задач.

1
2
3
exit
 
docker-machine rm -f node-1 node-2 node-3

Если вам понравилась эта статья, вас может заинтересовать book. В отличие от предыдущего заголовка серии ( ), в котором подробно рассматриваются некоторые из последних практик и инструментов DevOps, эта книга полностью посвящена Docker Swarm, а также процессам и инструментам нам может понадобиться создавать, тестировать, развертывать и отслеживать службы, работающие внутри кластера.

Книга все еще находится в стадии разработки. Вы можете получить копию из LeanPub . Он также доступен в виде Если вы загрузите его сейчас, прежде чем он будет полностью завершен, вы будете получать частые обновления с новыми главами и исправлениями. Что еще более важно, вы сможете повлиять на направление книги, отправив мне свой отзыв.

Я выбираю бережливый подход к изданию книг, потому что считаю, что ранняя обратная связь — лучший способ создать отличный продукт. Пожалуйста, помогите мне сделать эту книгу справочной для всех, кто хочет принять Docker Swarm для кластерной оркестровки и планирования.