Основы работы с Docker Swarm

Docker Swarm – инструмент для создания кластеров из Docker-ов, иначе говоря – кластер из нескольких Docker-хостов, на каждом из которых запущен Docker Engine, обрабатывающий контейнеры Docker. “Извне” Docker Swarm выглядит также как “большой запущенный Docker”.
Начиная с версии 1.12, Docker Swarm включен по-умолчанию в “коробочную поставку” Docker-а. Рассмотрим поближе принципы работы с ним.
Все ноды Docker-а, работающего в режиме Swarm, могут работать как manager либо worker. На самом деле, кластер Docker Swarm может работать исключительно с manager-нодами, поскольку каждый manager способен выполнять задачи worker-а.
Один из менеджеров выступает как лидер кластера. Управляющие команды, которые приходят на другие менеджеры, автоматически передаются лидеру.
Чтобы инициализировать кластер (“рой” – Swarm), в консоли его лидера нужно выполнить команду
docker swarm initПолучившийся при этом кластер не будет обладать масштабируемостью либо отказоустойчивостью, поскольку для последнего необходимо как минимум 3 управляющих узла. Чтобы добавить их, нужно выполнить:
$ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-c12oncaqr8heox5ed2jj50kjf \ 172.28.128.3:2377Рабочий узел в кластер добавляется командой:
$ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-1yptom678kg6hryfufjyv1ky7xc4tx73m8uu2vmzm1rb82fsas-511vapm98iiz516oyf8j00alv \ 172.28.128.3:2377Рабочие и управляющие узлы могут добавляться к Docker Swarm в любой момент времени.
Создание Docker-сервиса похоже на создание Docker-контейнера:
docker service create --name nginx --publish 8080:80 --replicas 2 nginx:stable-alpineУ Docker-сервиса в Docker Swarm, относительно автономно запущенного контейнера, есть большое преимущество – при наличии хотя бы 2х реплик этого сервиса (с контейнером), его можно обновить без остановки и, соответственно, простоя для пользователей.
Обновление сервиса на примере добавления новой метки выглядит так (наглядный суффикс -add):
docker service update --label-add foo=bar nginxЧтобы удалить 80й порт, нужно выполнить
docker service update --publish-rm 80 nginxБалансировка нагрузки
Запросы пользователей в Docker Swarm распределяет между узлами кластеров механизм под названием ingress load balacing.
При этом пользовательский запрос для любого узла, сначала будет обработан внутренним балансировщиком, и уже потом отправится тому узлу, который сможет его обработать. Таким образом, каждый узел может обработать запрос к любому узлу Docker Swarm.
Чтобы изменить масштабируемость в Docker Swarm, необходимо изменить количество реплик для определенного сервиса (в примере – 3 реплики):
docker service update --replicas 3 nginxЖелательно, чтобы количество узлов при это было большим, чем количество реплик – в этом случае Docker Swarm будет выполнять реплики на разных узлах.
Для обеспечения отказоустойчивости кластера используется алгоритм Raft – любой из manager-узлов в любой момент времени может заменить leader-узел.
Узнать и изучить все нюансы Docker и Docker Swarm на практике и получить твердые знания и опыт вы можете на наших авторских курсах “L3-DevOps” и “L3-Virtualization“.