Docker: Оркестровка многоконтейнерных приложений с помощью Swarm и Compose

С помощью контейнерной платформы Docker вы можете быстро, удобно и эффективно распределять приложения по сети в виде задач. Все, что вам нужно, — это менеджер кластеров Swarm, который с версии 1.12.0 включен в «Режим Swarm», являющийся встроенным компонентом движка Docker и, таким образом, частью основного программного обеспечения контейнерной платформы. Docker Swarm позволяет масштабировать контейнерные приложения, эксплуатируя их в любом количестве экземпляров на любом количестве узлов в вашей сети. С другой стороны, если вы хотите запустить многоконтейнерное приложение в кластере, который в Docker называется «стек», вам понадобится инструмент Docker Compose. Здесь мы объясним основные концепции оркестровки Docker с помощью Swarm и Compose и проиллюстрируем их реализацию на примерах кода.

Docker Swarm

Swarm — это программное обеспечение от разработчика Docker, которое объединяет любое количество хостов Docker в кластер и обеспечивает централизованное управление кластером, а также оркестровку контейнеров. До версии Docker 1.11 Swarm должен был быть реализован как отдельный инструмент. Однако новые версии контейнерной платформы поддерживают встроенный режим swarm. Менеджер кластеров доступен каждому пользователю Docker при установке движка Docker.

В основе Docker Swarm лежит архитектура «ведущий-ведомый». Каждый кластер Docker состоит как минимум из одного менеджера и любого количества рабочих узлов. В то время как менеджер роя отвечает за управление кластерами и делегирование задач, рабочие узлы роя берут на себя выполнение. Таким образом, контейнерные приложения разделяются на несколько рабочих узлов как так называемые «Сервисы».

В терминологии Docker термин «Сервис» обозначает абстрактную структуру для определения задач, которые должны выполняться в кластере. Каждый сервис соответствует набору отдельных задач, каждая из которых обрабатывается в отдельном контейнере на одном из узлов кластера. При создании сервиса вы указываете, на каком образе контейнера он основан и какие команды выполняются в контейнере. Docker Swarm поддерживает два режима определения служб роя: вы выбираете между реплицированными и глобальными службами.

  • Реплицированные службы: Реплицированный сервис — это задача, которая выполняется на определенном пользователем количестве репликаций. Каждая репликация представляет собой экземпляр контейнера Docker, определенного в службе. Тиражируемые сервисы можно масштабировать, позволяя пользователям создавать дополнительные реплики. Например, веб-сервер, такой как NGINX, можно масштабировать по мере необходимости с помощью отдельной командной строки на 2, 4 или 100 экземпляров.
  • Глобальные службы: Если служба запущена в глобальном режиме, каждый доступный узел в кластере запускает задачу для соответствующей службы. Если в кластер добавляется новый узел, менеджер роя немедленно назначает ему задачу для глобальной службы. Глобальные службы подходят, например, для приложений мониторинга или антивирусных программ.

Центральной областью применения Docker Swarm является распределение нагрузки. В режиме роя Docker имеет встроенные функции балансировки нагрузки. Например, если вы запускаете веб-сервер NGINX с 4 экземплярами, Docker интеллектуально распределит входящие запросы между доступными экземплярами веб-сервера.

Docker Compose

Docker Compose позволяет определять многоконтейнерные приложения — или «стеки» — и запускать их либо на отдельном узле Docker, либо в кластере. Инструмент предоставляет команды командной строки для управления всем жизненным циклом приложений.

Docker определяет стеки как группы взаимосвязанных сервисов, которые имеют общие программные зависимости, оркеструются и масштабируются вместе. Стек Docker позволяет определить различные функции приложения в центральном файле — docker-compose.yml — и запустить его оттуда, запустить его вместе в изолированной среде выполнения и управлять им централизованно.

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

Если вы используете контейнерную платформу Docker в составе настольных установок Docker for Mac или Docker for Windows, то Docker Compose уже входит в набор функций. То же самое относится и к инструментарию Docker, который доступен для старых систем Mac или Windows. Если вы используете Docker либо на Linux, либо на Windows Server 2016, то потребуется ручная установка инструмента.

Установка Compose-Installation unter Linux

Откройте терминал и выполните следующую команду, чтобы загрузить бинарные файлы Compose из репозитория GitHub:

sudo curl -L https://github.com/docker/compose/releases/download/1.18  
.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Разрешите всем пользователям запускать двоичные файлы:

sudo chmod +x /usr/local/bin/docker-compose

Чтобы проверить, правильно ли был установлен инструмент, выполните следующую команду:

docker-compose -version

Если установка прошла успешно, вы получите номер версии инструмента в качестве вывода терминала.

Установка Compose на Windows Server 2016 (только Docker EE для Windows)

Запустите PowerShell от имени администратора и выполните следующую команду, чтобы начать загрузку бинарных файлов Compose из репозитория GitHub:

Invoke-WebRequest 
"https://github.com/docker/compose/releases/download/1.18.0/docker-compose-
Windows-x86_64.exe" -UseBasicParsing -OutFile
$Env:ProgramFilesdockerdocker-compose.exe

Запустите исполняемый файл для установки Docker Compose.

Примечание

Дополнительную информацию об инструментах Docker, таких как Swarm и Compose, можно найти в нашей статье об экосистеме Docker.

Учебник: Docker Swarm и Compose в использовании

Для работы многоконтейнерных приложений в кластере с помощью Docker вам понадобится swarm — кластер движков Docker в режиме swarm, а также инструмент Docker Compose.

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

Совет

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

Часть 1: Docker в режиме роя

Под роем понимается любое количество движков Docker в режиме роя. Каждый движок Docker запускается на отдельном узле и объединяется в кластер.

Создание кластера Docker включает в себя три этапа:

  1. Подготовить узлы Docker
  2. Инициализировать рой
  3. Интегрировать узлы Docker в рой.
Примечание

В качестве альтернативы можно объединить в рой отдельный движок Docker в локальной среде разработки. Такой рой называется роем на одном узле.

Шаг 1: Подготовьте узлы Docker

Для подготовки узлов Docker рекомендуется использовать инструмент инициализации Docker Machine. Это упрощает реализацию узлов Docker (также называемых «Dockerized hosts», виртуальные узлы, включающие движок Docker). С помощью Docker Machine можно подготовить учетные записи для вашего роя на любом количестве инфраструктур и удаленно управлять ими.

Плагины драйверов для Docker Machine предоставляются различными облачными платформами. Это позволяет свести усилия, необходимые для создания хостов Docker у таких провайдеров, как Amazon Web Services (AWS) или Digital Ocean, к простой строке кода.

Используйте следующий код для создания хоста Docker (здесь: docker-sandbox) в инфраструктуре Digital Ocean.

$ docker-machine create --driver digitalocean --digitalocean-access-token xxxxx docker-sandbox

Создайте хост Docker в AWS (здесь: aws-sandbox) с помощью следующей команды:

$ docker-machine create --driver amazonec2 --amazonec2-access-key AKI******* --amazonec2-secret-key 8T93C******* aws-sandbox
Примечание

Символы xxxxx и ****** служат для ввода индивидуальных кодов доступа или ключей, которые вы сгенерируете в своей учетной записи пользователя рассматриваемой службы.

Шаг 2: Инициализация роя

Если вы подготовили необходимое количество виртуальных узлов для вашего роя, вы можете управлять ими через Docker Machine и объединить их в кластер с помощью Docker Swarm. Сначала получите доступ к узлу, который вы хотите использовать в качестве менеджера роя. Docker Machine предоставляет следующую команду для создания SSH-шифрованного соединения с узлом Docker.

docker-machine ssh MACHINE-NAME
Примечание

Замените место MACHINE-NAME на имя узла Docker, к которому вы хотите получить доступ.

Если соединение с нужным узлом установлено, используйте следующую команду для инициализации роя.

docker swarm init [OPTIONS]

Команда docker swarm init — с опциями, если необходимо (см. документацию) — определяет выбранный в данный момент узел в качестве менеджера роя и создает два случайных токена: токен менеджера и токен рабочего.

Swarm initialized: current node (1ia0jlt0ylmnfofyfj2n71w0z) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join 
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p 
10.0.2.15:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Команда docker swarm init генерирует вывод терминала, содержащий всю информацию, необходимую для добавления дополнительных учетных записей в рой.

Примечание

Как правило, команда docker swarm init используется с флагом —advertise-addr. Это указывает, какой IP-адрес должен использоваться для доступа к API и оверлейной сети. Если IP-адрес не задан явно, Docker автоматически проверяет, под каким IP-адресом доступна выбранная система, и выбирает этот адрес. Если узел имеет более одного IP-адреса, то необходимо установить соответствующий флаг. Пока больше ничего не введено, Docker использует порт 2377.

Шаг 3: Интегрируйте узлы Docker в рой

После инициализации роя с выбранным узлом в качестве менеджера роя добавьте любое количество узлов в качестве менеджеров или рабочих. Используйте команду docker swarm join в сочетании с соответствующим токеном.

3.1 Добавление рабочих узлов: Если вы хотите добавить рабочий узел в свой рой, зайдите на соответствующий узел через docker-machine и выполните следующую команду:

docker swarm join [OPTIONS] HOST:PORT

Обязательным компонентом команды docker swarm join является флаг —token, который содержит токен для доступа к кластеру.

docker swarm join 
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-6cng4m8lhlrdfuq9jgzznre1p 
10.0.2.15:2377

В данном примере команда содержит сгенерированный ранее токен worker, а также IP-адрес, под которым доступен менеджер роя.

Если у вас нет под рукой соответствующего токена, вы можете определить его с помощью команды docker swarm join-token worker.

3.2 Добавьте главный узел: Если вы хотите добавить в рой еще один узел менеджера, сначала определите токен менеджера. Затем выполните команду docker swarm join-token manager на учетной записи менеджера, на которой был инициализирован рой, и следуйте инструкциям на терминале.

Docker генерирует токен менеджера, который может быть запущен в сочетании с командой docker swarm join и определенным вами IP-адресом на любом количестве узлов Docker, чтобы интегрировать его в рой в качестве менеджера.

$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:

docker swarm join 
--token SWMTKN-1-511cy9taxx5w47n80vopivx6ii6cjpi71vfncqhcfcawxfcb14-ed2ct6pg5rc6vp8bj46t08d0i 
10.0.2.15:2377

3.3 Обзор всех узлов в рое: Обзор всех узлов, интегрированных в ваш рой, можно получить с помощью команды управления docker node ls на одном из ваших узлов-менеджеров.

ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER
jhy7ur9hvzvwd4o1pl8veqms3    worker2   Ready   Active
jukrzzii3azdnub9jia04onc5    worker1   Ready   Active
1ia0jlt0ylmnfofyfj2n71w0z *  osboxes   Ready   Active        Leader

В обзоре узлы менеджера помечены как Leader.

Примечание

Если вы хотите удалить узел из роя, войдите в соответствующий узел и выполните команду docker swarm leave. Если узел является менеджером роя, вы должны принудительно выполнить команду с помощью флага —force.

Часть 2: Запуск многоконтейнерного приложения в кластере

В первой части нашего учебника по Docker мы предоставили Docker-хосту Docker Machine и скомпилировали его в режиме swarm как кластер. Теперь мы покажем вам, как определить различные сервисы как компактные мультиконтейнерные приложения с помощью Docker Compose и запустить их в кластере.

Подготовка мультиконтейнерных приложений в кластере включает пять шагов:

  1. Создание локального реестра Docker
  2. Определение многоконтейнерного приложения как стека
  3. Протестируйте многоконтейнерное приложение с помощью Compose
  4. Загрузить образ в реестр

Шаг 1: Запустите локальный реестр Docker в качестве службы

Поскольку рой Docker состоит из любого количества движков Docker, приложения могут быть запущены в кластере только в том случае, если все задействованные движки Docker имеют доступ к образу приложения. Для этого необходим центральный сервис, позволяющий управлять образами и подготавливать их в кластере. Такая служба называется реестром.

Примечание

Образ — это компактное, исполняемое подобие приложения. Помимо кода приложения, он также включает все зависимости (среды выполнения, библиотеки, переменные среды и конфигурационные файлы), которые необходимы Docker для запуска соответствующего приложения в качестве контейнера. Это означает, что каждый контейнер представляет собой экземпляр образа для выполнения.

1.1 Запустите реестр как службу в кластере: Используйте команду docker service create следующим образом, чтобы запустить локальный сервер реестра в качестве службы в кластере.

docker service create --name registry --publish 5000:5000 registry:2

Команда указывает Docker на запуск службы с именем registry, которая прослушивает порт 5000. Первое значение после флага —publish указывает порт хоста, а второе — порт контейнера. Сервис основан на image registry:2, который содержит реализацию HTTP API V2 реестра Docker и может быть получен бесплатно через хаб Docker.

1.2 Проверьте состояние службы реестра: Используйте команду docker service ls для проверки состояния службы реестра, которую вы только что запустили.

$ sudo docker service ls
ID            NAME      MODE        REPLICAS  IMAGE          PORTS
K2hq2ivnwuq4  registry  replicated  1/1       registry:2     *:5000->5000/tcp

Команда docker service ls выводит список всех служб, запущенных в вашем кластере Docker.

1.3 Проверьте подключение к реестру с помощью cURL: Убедитесь, что вы можете получить доступ к вашему реестру через cURL. Для этого введите следующую команду:

$ curl http://localhost:5000/v2/

Если ваш реестр работает как положено, то cURL должен выдать следующий вывод терминала:

{}
Примечание

cURL — это программа командной строки для вызова веб-адресов и загрузки или скачивания файлов. Подробнее о cURL можно узнать на сайте проекта с открытым исходным кодом: curl.haxx.se.

Шаг 2: Создайте мультиконтейнерное приложение и определите его как стек

На следующем шаге создайте все файлы, необходимые для развертывания стека в кластере Docker, и поместите их в общую директорию проекта.

2.1 Создайте папку проекта: Создайте каталог проекта с любым понравившимся вам именем — например, stackdemo.

$ mkdir stackdemo

Перейдите в каталог проекта.

$ cd stackdemo

Ваша директория проекта функционирует как общая папка для всех файлов, необходимых для работы вашего многоконтейнерного приложения. Сюда входит файл с исходным кодом приложения, текстовый файл, в котором вы определяете программное обеспечение, необходимое для работы вашего приложения, а также Docker-файл и Compose-файл.

2.2 Создайте приложение: Создайте Python-приложение со следующим содержанием и запишите его под именем app.py в каталог проекта.

from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    count = redis.incr('hits')
    return 'Hello World! I have been seen {} times.n'.format(count)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

Пример приложения app.py представляет собой простое веб-приложение с домашней страницей, на которой отображается приветствие «Hello World!», а также детализация, показывающая, как часто к приложению обращались.  За основу взяты веб-фреймворк Flask с открытым исходным кодом и база данных in-memory с открытым исходным кодомRedis.

2.3 Определите требования: Создайте текстовый файл с названием requirements.txt со следующим содержанием и поместите его в каталог проекта.

flask
redis

В файле requirements.txt укажите, на каком программном обеспечении строится ваше приложение.

2.4 Создайте Dockerfile: Создайте еще один текстовый файл с именем Dockerfile, добавьте в него следующее содержание и поместите его в папку проекта, как и остальные.

FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Dockerfile содержит все инструкции, необходимые для создания образа приложения. Например, Dockerfile указывает на файл requirements.txt и определяет, какое программное обеспечение должно быть установлено для запуска приложения.

Dockerfile в примере позволяет создать образ веб-приложения app.py, включая все требования (Flask и Redis).

2.5 Создание Compose-файла: Создайте конфигурационный файл со следующим содержанием и сохраните его как docker-compose.yml.

version: '3'

services:
  web:
    image: 127.0.0.1:5000/stackdemo
    build: .
    ports:
      - "8000:8000"
  redis:
    image: redis:alpine

Файл docker-compose.yml позволяет связывать различные сервисы друг с другом, запускать их как единое целое и управлять ими централизованно.

Примечание

Compose-файл написан на YAML, упрощенном языке разметки, который служит для отображения структурированных данных и в основном используется в конфигурационных файлах. В Docker файл docker-compose.yml служит центральной конфигурацией сервисов многоконтейнерного приложения.

В данном примере мы определяем два сервиса: Веб-сервис и сервис Redis.

  • Веб-сервис: Основой веб-сервиса является образ, сгенерированный на основе созданного Dockerfile в каталоге stackdemo.
  • Служба Redis: Для службы Redis мы не используем собственный образ. Вместо этого мы обращаемся к публичному образу Redis (redis:alpine), доступному через хаб Docker.

Шаг 3: Тестирование многоконтейнерного приложения с помощью Compose

Сначала протестируйте многоконтейнерное приложение локально, запустив его на узле менеджера.

3.1 Запустите приложение: Используйте команду docker-compose up в сочетании с флагом -d для запуска вашего стека. Флаг активирует «Отдельный режим», который запускает все контейнеры в фоновом режиме. Теперь ваш терминал готов к вводу дополнительных команд.

$ sudo docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use the bundle feature of the Docker experimental build.

More info:
https://docs.docker.com/compose/bundles

Creating network "stackdemo_default" with the default driver
Creating stackdemo_web_1
Creating stackdemo_redis_1

3.2 Проверьте состояние стека: Выполните команду docker-compose ps, чтобы проверить состояние вашего стека. Вы получите вывод терминала, похожий на следующий пример:

$ sudo docker-compose ps
      Name             Command             State              Ports       
-------------------------------------------------------------------------
stackdemo_redis_   docker-            Up                 6379/tcp         
1                  entrypoint.sh                                          
                   redis ...                                              
stackdemo_web_1    python app.py      Up                 0.0.0.0:8000->80 
                                                         00/tcp           

Команда docker-compose ps дает вам обзор всех контейнеров, запущенных в контексте вашего многоконтейнерного приложения. В текущем примере этот список включает два контейнера — по одному для каждого из Redis и веб-сервисов.

3.3 Протестируйте стек с помощью cURL: Протестируйте ваш стек, запустив программу командной строки cURL с адресом локального хоста (localhost или 127.0.0.1).

$ curl http://localhost:8000
Hello World! I have been seen 1 times.

$ curl http://localhost:8000
Hello World! I have been seen 2 times.

$ curl http://localhost:8000
Hello World! I have been seen 3 times.

Вы также можете получить доступ к веб-приложению в браузере.

3.4 Деактивируйте приложение: Если вы хотите отключить приложение, выполните команду docker-compose down с флагом —volumes.

$ sudo docker-compose down --volumes
Stopping stackdemo_redis_1 ... done
Stopping stackdemo_web_1 ... done
Removing stackdemo_redis_1 ... done
Removing stackdemo_web_1 ... done
Removing network stackdemo_default

Шаг 4: Загрузка изображения в реестр

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

Загрузка локально созданного образа в центральный реестр называется в Docker «push». В Docker Compose для этого есть команда docker-compose push. Выполните команду в каталоге проекта.

Все образы, запускаемые в файле docker-compose.yml, которые локально созданы, загружаются в реестр.

$ sudo docker-compose push
Pushing web (127.0.0.1:5000/stackdemo:latest)...
The push refers to a repository [127.0.0.1:5000/stackdemo]
5b5a49501a76: Pushed
be44185ce609: Pushed
bd7330a79bcf: Pushed
c9fc143a069a: Pushed
011b303988d2: Pushed
latest: digest: sha256:a81840ebf5ac24b42c1c676cbda3b2cb144580ee347c07e1bc80e35e5ca76507 size: 1372

В текущем примере docker-compose push загружает образ из стека stackdemo с тегом latest в локальный реестр под адресом 127.0.0.1:5000.

Шаг 5: Запуск стека в кластере

Если образ вашего стека доступен через локальную службу реестра, то мультиконтейнерное приложение можно запустить в кластере.

5.1 Запуск стека в кластере: Вы также можете запускать стеки в кластере с помощью простой командной строки. Контейнерная платформа предоставляет для этого следующую команду:

docker stack deploy [OPTIONS] STACK
Примечание

Замените место STACK на имя образа стека, который вы хотите запустить.

Выполните команду docker stack deploy на одном из узлов менеджера в вашем рое.

$ sudo docker stack deploy --compose-file docker-compose.yml stackdemo
Ignoring unsupported options: build

Creating network stackdemo_default
Creating service stackdemo_web
Creating service stackdemo_redis

Флаг —compose-file указывает путь к Compose-файлу.

5.2 Получите статус стека: Используйте следующую команду для получения статуса вашего стека:

docker stack services [OPTIONS] STACK

Docker предоставит вам идентификаторы, имена, режимы, репликации, образы и порты всех сервисов, запущенных в контексте вашего стека.

$ sudo docker stack services stackdemo
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
cxyp7srukffy        stackdemo_web       replicated          1/1                 127.0.0.1:5000/stackdemo:latest   *:8000->8000/tcp
z0i2rtjbrj9s        stackdemo_redis     replicated          1/1                 redis:alpine                     

5.3 Тестирование приложения с помощью cURL: Чтобы протестировать ваше мультиконтейнерное приложение, вызовите его через адрес локального хоста на порт 8000.

$ curl http://localhost:8000
Hello World! I have been seen 1 times.

$ curl http://localhost:8000
Hello World! I have been seen 2 times.

$ curl http://localhost:8000
Hello World! I have been seen 3 times.

В качестве альтернативы cURL, к приложению можно также получить доступ через веб-браузер. Используйте адрес локального узла или адрес одного из узлов. Благодаря внутренней сети маршрутизации вы можете обратиться к любому узлу роя через порт 8000, чтобы получить доступ к вашему приложению.

5.4 Деактивируйте стек: Если вы хотите отключить стек, используйте команду docker stack rm в сочетании с именем стека.

$ docker stack rm stackdemo

Removing service stackdemo_web
Removing service stackdemo_redis
Removing network stackdemo_default

5.5 Деактивируйте службу реестра: Если вы хотите отключить службу реестра, используйте команду docker service rm с именем службы — в данном случае: registry.

$ docker service rm registry
Резюме

Docker Swarm и Compose расширяют основную функциональность контейнерной платформы инструментами, которые позволяют запускать сложные приложения в разделенных системах с минимальными усилиями по управлению. Лидер рынка в области виртуализации контейнеров предлагает своим пользователям комплексное решение для оркестровки контейнеров. Оба инструмента хорошо поддерживаются документально и регулярно обновляются. Swarm и Compose позиционируют себя как хорошие альтернативы устоявшимся инструментам сторонних производителей, таким как Kubernetes или Panamax.

Оцените статью
cdelat.ru
Добавить комментарий