Звонят колокола! 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.shchmod +x swarm-cluster.sh./swarm-cluster.shdocker-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.ymldocker 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 PORTSproxy_proxy.1 vfarcic/docker-flow-proxy:latest node-2 Running Running 2 minutes agoproxy_swarm-listener.1 vfarcic/docker-flow-swarm-listener:latest node-1 Running Running 2 minutes agoproxy_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: - defaultnetworks: 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.ymldocker stack deploy \ -c docker-compose-go-demo.yml go-demodocker 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 PORTSgo-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 agogo-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 OKDate: Thu, 19 Jan 2017 23:57:05 GMTContent-Length: 14Content-Type: text/plain; charset=utf-8hello, 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
|
exitdocker-machine rm -f node-1 node-2 node-3 |
Если вам понравилась эта статья, вас может заинтересовать book. В отличие от предыдущего заголовка серии ( ), в котором подробно рассматриваются некоторые из последних практик и инструментов DevOps, эта книга полностью посвящена Docker Swarm, а также процессам и инструментам нам может понадобиться создавать, тестировать, развертывать и отслеживать службы, работающие внутри кластера.
Книга все еще находится в стадии разработки. Вы можете получить копию из LeanPub . Он также доступен в виде Если вы загрузите его сейчас, прежде чем он будет полностью завершен, вы будете получать частые обновления с новыми главами и исправлениями. Что еще более важно, вы сможете повлиять на направление книги, отправив мне свой отзыв.
Я выбираю бережливый подход к изданию книг, потому что считаю, что ранняя обратная связь — лучший способ создать отличный продукт. Пожалуйста, помогите мне сделать эту книгу справочной для всех, кто хочет принять Docker Swarm для кластерной оркестровки и планирования.
| Ссылка: | Использование стека докеров и создание файлов YAML для развертывания сервисов Swarm от нашего партнера по JCG Виктора Фарчича в блоге по технологиям . |
