Новый Swarm, входящий в состав Docker 1.12+, является огромным улучшением по сравнению со старым управлением и расписанием. Больше нет необходимости запускать отдельный набор контейнеров Swarm (он входит в состав Docker Engine), стратегии аварийного переключения становятся намного надежнее, обнаружение служб запекается, новая сеть работает как очаровательная программа и так далее. Список возможностей и улучшений довольно большой. Если у вас не было возможности попробовать его, ознакомьтесь с разделом Введение в Docker Swarm и Интеграция прокси с Docker Swarm .
В этих статьях мы использовали команды для запуска сервисов Docker внутри кластера Swarm. Если вы похожи на меня, вы, вероятно, привыкли к простоте, которую обеспечивает Docker Compose. Вместо того, чтобы пытаться запомнить команды со всеми аргументами, необходимыми для запуска служб, вы, вероятно, указали все как файлы Docker Compose и запустили контейнеры с помощью простой команды docker-compose up -d
. В конце концов, это намного удобнее, чем docker service create
за которым следует бесконечное количество аргументов. Мой мозг не способен запомнить их все.
Когда я начал «играть» с новым Swarm, у меня было первое впечатление, что это здорово , а затем я не хочу запоминать разные аргументы для всех моих услуг . Я хочу, чтобы мои файлы Compose вернулись в игру.
Одним из существенных изменений является то, что управление контейнерами изменилось с клиента ( Docker Compose ) на сторону сервера ( Docker Service ). В результате Docker Compose устарел (по крайней мере, когда контейнеры развертываются с использованием Docker Service ). Это останется предпочтительным способом запуска контейнеров в среде с одним сервером, но не намного. Итак, что нам делать со всеми этими файлами docker-compose.yml, которые мы создали?
Хорошей новостью является то, что мы можем использовать Distributed Application Bundles или dab-файлы в качестве замены аргументов командной строки службы Docker. Плохая новость заключается в том, что… давайте оставим их до конца и сначала исследуем хорошие части.
Начнем с создания демонстрационного кластера Swarm, состоящего из компьютеров Docker.
Настройка среды
В следующих примерах предполагается, что у вас установлена версия Docker Machine v0.8 +, включающая Docker Engine v1.12 +. Самый простой способ получить их — через Docker Toolbox .
Если вы пользователь Windows, пожалуйста, запустите все примеры из Git Bash (устанавливается через Docker Toolbox ).
Я не буду вдаваться в подробности настройки среды. Это то же самое, что описано в статье « Введение в Docker Swarm» . Мы настроим три узла, чтобы они сформировали кластер Swarm.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
docker-machine create -d virtualbox node-1 docker-machine create -d virtualbox node-2 docker-machine create -d virtualbox node-3 eval $(docker-machine env node-1) docker swarm init \ --advertise-addr $(docker-machine ip node-1) \ --listen-addr $(docker-machine ip node-1):2377 TOKEN=$(docker swarm join -token -q worker) eval $(docker-machine env node-2) docker swarm join --token $TOKEN $(docker-machine ip node-1):2377 eval $(docker-machine env node-3) docker swarm join --token $TOKEN $(docker-machine ip node-1):2377 |
Теперь, когда у нас есть кластер Swarm, мы можем развернуть сервис, используя dab- файл.
Развертывание служб с использованием распределенных пакетов приложений (DAB)
Вместо создания сетей и сервисов Docker, указав бесконечное количество аргументов, мы будем использовать dab-файл . Думайте об этом как о Swarm-эквиваленте Docker Compose. Под Swarm я имею в виду docker swarm
, docker service
и другие вкусности, которые пришли с версией 1.12+ (не старый Swarm, работающий как отдельный контейнер).
Вместо того, чтобы пытаться выяснить детали нового формата для определения сервисов, мы создадим его из файла docker-compose.yml .
Начнем с проверки кода демо-сервиса.
1
2
3
4
5
|
git clone https: //github .com /vfarcic/go-demo .git cd go-demo cat docker-compose.yml |
Последняя команда выводит определение проекта Docker Compose . Это так.
01
02
03
04
05
06
07
08
09
10
11
|
version: '2' services: app: image: vfarcic /go-demo ports: - 8080 db: image: mongo |
Как видите, это очень простой проект. Он состоит из двух сервисов. Служба приложения — это бэкэнд, который предоставляет API. Он использует второй сервис ( дБ ) для хранения и извлечения данных. Цель приложения предоставляет порт 8080, который будет служить точкой входа в его API.
Преобразование этого определения Docker Compose в пакет является двухэтапным процессом. Сначала нам нужно вытащить изображения. Создание пакета оценит их и вместе с содержимым файла docker-compose.yml выведет dab- файл.
Давайте попробуем это.
1
2
3
4
5
|
eval $(docker-machine env node-1) docker-compose pull docker-compose bundle |
Теперь, когда процесс завершен, давайте посмотрим на результат.
1
|
cat godemo.dab |
Вывод следующий.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
{ "Services" : { "app" : { "Image" : "vfarcic/go-demo@sha256:f7436796b1cd6812ba63ea82c6523a5164ae7f8a3c05daa9e4ac4bd78341d709" , "Networks" : [ "default" ], "Ports" : [ { "Port" : 8080, "Protocol" : "tcp" } ] }, "db" : { "Image" : "mongo@sha256:e599c71179c2bbe0eab56a7809d4a8d42ddcb625b32a7a665dc35bf5d3b0f7c4" , "Networks" : [ "default" ] } }, "Version" : "0.1" } |
Файл godemo.dab, который мы только что создали, довольно прост. Он состоит из двух служб, которые соответствуют службам из файла docker-compose.yml . Каждый из них определяет изображение, которое определяется с помощью хэшей тех, что мы вытащили. За изображениями следует сеть по умолчанию, которая окружает службы и порты, которые должны быть открыты.
Есть, по крайней мере, две проблемы с этим выводом. Прежде всего, нет необходимости открывать какие-либо порты. Вместо этого у нас должен быть обратный прокси-сервер, который перенаправит все запросы к сервису. Новая сеть Docker Swarm упрощает интеграцию с прокси, и мы должны это использовать. Пожалуйста, прочитайте статью « Интеграция прокси с Docker Swarm» для получения дополнительной информации о роли прокси внутри кластера Swarm.
Вторая проблема заключается в том, что мы не указали никаких ограничений. Развертывание неограниченных служб в кластере может быстро обернуться катастрофой.
Лучшее, но все же очень простое определение Compose можно увидеть в файле docker-compose-swarm.yml . Его содержание заключается в следующем.
01
02
03
04
05
06
07
08
09
10
11
|
version: '2' services: app: image: vfarcic /go-demo mem_limit: 250m db: image: mongo mem_limit: 500m |
Как видите, мы удалили порт и добавили ограничение mem_limit . Тем не менее, это очень простой файл Compose.
Давайте создадим новый вывод пакета.
1
|
docker-compose -f docker-compose-swarm.yml bundle |
Вывод команды bundle
выглядит следующим образом.
1
2
3
|
WARNING: Unsupported key 'mem_limit' in services.app - ignoring WARNING: Unsupported key 'mem_limit' in services.db - ignoring Wrote bundle to godemo.dab |
Теперь мы подходим к первым плохим новостям. Текущий формат пакета очень ограничен. Мы можем использовать его для очень простых сценариев. Как только мы указываем что-то более сложное, мы сталкиваемся с предупреждением. В этом случае ограничение памяти было проигнорировано.
Оставим это ограничение в стороне (пока) и попробуем развернуть новый пакет.
1
|
docker deploy godemo |
Вывод команды deploy
выглядит следующим образом.
1
2
3
4
|
Loading bundle from godemo.dab Creating network godemo_default Creating service godemo_app Creating service godemo_db |
И сеть, и сервис созданы. Мы можем подтвердить это, перечислив все услуги.
1
|
docker stack ps godemo |
Вы должны увидеть, что стек состоит из двух сервисов, каждый из которых развернут где-то внутри кластера из трех узлов, а текущее состояние настроено на работу . Если это состояние, пожалуйста, подождите несколько секунд, пока контейнеры не будут извлечены, и повторите команду.
Тем не менее, мы все еще сталкиваемся с отсутствующими функциями. Наш предел памяти был проигнорирован, и нам еще предстоит создать внешний сетевой прокси-сервер и подключить к нему службу приложения .
Мы можем исправить эти недостатки, выполнив команду service update
. Например, мы можем создать прокси- сеть вручную и добавить в нее контейнер. Мы также можем использовать команду service update
для установки предела памяти. Однако, если мы начнем делать все это, нам, вероятно, будет лучше без пакета в первую очередь.
Что делать сейчас?
Прежде чем вы уйдете и полностью выбросите пакет , обратите внимание, что он находится в экспериментальной стадии. Это был только вкус того, что должно прийти. Мы можем ожидать значительных улучшений и полной поддержки всех функций Swarm.
Вопрос в том, что делать сегодня. Мы можем выбрать несколько путей. Один из них — дождаться выхода пакета из экспериментальной стадии и (надеюсь) поддержать все функции, которые может предложить Docker Swarm. Другой подход заключается в использовании проекта Whaleprint . Он выглядит как смесь DAB- файла с дополнительными функциями (например, ограничениями) и подходом, который использует Terraform . Это очень перспективный проект. Но, так же как и пакет , он все еще находится в зачаточном состоянии.
Я надеюсь, что эта статья дала вам представление о том, как движется новый Рой. Пакет находится в стадии разработки, и мы можем ожидать, что он станет надежной альтернативой развертыванию служб в кластере. Пожалуйста, не расстраивайтесь из-за отсутствия функций, но думайте об этом как о планах на будущее.
На данный момент я рекомендую вам внимательно следить за пакетом распределенных приложений и ждать, пока он созреет. А пока управляйте кластером Swarm с помощью команд или попробуйте проект Whaleprint .
Следующий будет посвящен развертыванию без простоев с Docker Swarm .
Ссылка: | Распределенные комплекты приложений (Tour Around Docker 1.12 Series) от нашего партнера по JCG Виктора Фарчича в блоге технологических бесед . |