Звонят колокола! 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 для кластерной оркестровки и планирования.
Ссылка: | Использование стека докеров и создание файлов YAML для развертывания сервисов Swarm от нашего партнера по JCG Виктора Фарчича в блоге по технологиям . |