Одним из ключевых обновлений в составе Docker 1.6 является Docker Swarm 0.2.0 . Docker Swarm решает одно из фундаментальных ограничений Docker, когда контейнеры могут работать только на одном хосте Docker. Docker Swarm является родной кластеризацией для Docker. Он превращает пул хостов Docker в один виртуальный хост.
Этот технический совет покажет, как создать кластер на нескольких хостах с помощью Docker Swarm.
Хорошее введение в Docker Swarm — @aluzzardi и @vieux из Container Camp :
Ключевые компоненты Docker Swarm
Swarm Manager : Docker Swarm имеет Master или Manager , который является предопределенным Docker Host и является единой точкой для всего администрирования. В настоящее время в кластере разрешен только один экземпляр менеджера. Это SPOF для архитектур высокой доступности, и дополнительные менеджеры будут допущены в будущей версии Swarm с # 598 .
Swarm Nodes : Контейнеры развернуты на Узлах, которые являются дополнительными Docker Hosts. Каждый Swarm Node должен быть доступен менеджеру, каждый узел должен прослушивать один и тот же сетевой интерфейс (порт TCP). На каждом узле запускается агент узла, который регистрирует упомянутый демон Docker, отслеживает его и обновляет бэкэнд обнаружения со статусом узла. Контейнеры работают на узле.
Стратегия планировщика : различные стратегии планировщика ( binpack , spread и random ) могут применяться для выбора лучшего узла для запуска вашего контейнера. Стратегия по умолчанию — это spread которое оптимизирует узел для наименьшего количества работающих контейнеров. Существует несколько видов фильтров , таких как ограничения и сходство . Это должно позволить приличный алгоритм планирования.
Служба обнаружения узлов : по умолчанию Swarm использует размещенную службу обнаружения на основе Docker Hub, используя токены для обнаружения узлов, являющихся частью кластера. Однако etcd, consul и zookeeper также могут быть использованы для обнаружения сервисов. Это особенно полезно, если нет доступа к Интернету или вы выполняете установку в закрытой сети. Новый бэкэнд обнаружения может быть создан, как описано здесь . Было бы полезно иметь размещенную службу обнаружения внутри брандмауэра, и # 660 будет обсуждать это.
Стандартный Docker API : Docker Swarm обслуживает стандартный Docker API, и, таким образом, любой инструмент, который обращается к одному хосту Docker, теперь будет легко масштабироваться до нескольких хостов. Это означает, что если бы вы использовали сценарии оболочки, использующие интерфейс командной строки Docker для настройки нескольких узлов Docker, тот же интерфейс командной строки теперь мог бы взаимодействовать с кластером Swarm, а затем Docker Swarm будет действовать как прокси-сервер и запускать его в кластере.
Есть много других концепций, но это основные.
TL; DR: вот простой скрипт, который создаст шаблонный кластер с мастером и двумя узлами:
|
1
2
3
4
5
6
7
8
9
|
echo "Creating cluster ..."TOKEN=`docker run swarm create`echo "Got the token " $TOKENecho "Creating Swarm master ..."docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$TOKEN swarm-masterecho "Creating Swarm node 01 ..."docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-01echo "Creating Swarm node 02 ..."docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-02 |
Давайте копаться в деталях сейчас!
Создать Рой Кластер
Создайте кластер Swarm как:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
~> docker run swarm createUnable to find image 'swarm:latest' locallylatest: Pulling from swarmdc2cace3cb9c: Pull complete dc2cace3cb9c: Download complete 132dac22a0c2: Download complete c578e06f7812: Download complete 1dfbc304fc7f: Download complete 9b5a856b703d: Download complete 282cd8d4f06e: Download complete 96b8c18d1208: Download complete 511136ea3c5a: Download complete Status: Downloaded newer image for swarm:latest117c8d19ba140d7ba3259aae9012e22f |
Эта команда возвращает токен и является уникальным идентификатором кластера. Он будет использоваться при создании мастера и узлов позже. Как упоминалось ранее, этот идентификатор кластера возвращается размещенной службой обнаружения в Docker Hub. Обязательно запишите этот идентификатор кластера сейчас, так как нет возможности перечислить его позже. # 661 должен это исправить.
Создать Рой Мастер
Swarm полностью интегрирован с Docker Machine, и поэтому это самый простой способ начать работу с OSX.
- Создайте мастера Swarm как:
1234567
~> docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22fswarm-masterINFO[0000] Creating SSH key...INFO[0000] Creating VirtualBox VM...INFO[0005] Starting VirtualBox VM...INFO[0006] WaitingforVM to start...INFO[0060]"swarm-master"has been created and is now the active machine.INFO[0060] To point your Docker client at it, run thisinyour shell:eval"$(docker-machine env swarm-master)"--swarmнастраивает машину с помощью Swarm,--swarm-masterнастраивает созданную машину как Swarm master. Обязательно замените идентификатор кластера послеtoken://на полученный в предыдущем шаге. Создание мастера Swarm связывается с размещенным сервисом в Docker Hub и сообщает, что мастер создан в кластере.Должна быть возможность сделать существующую машину мастером Swarm. Это сообщается как # 1017 .
- Перечислите все работающие машины как:
123
~> docker-machinelsNAME ACTIVE DRIVER STATE URL SWARMswarm-master * virtualbox Running tcp://192.168.99.108:2376 swarm-master (master)Обратите внимание, как
swarm-masterпомечен как мастер. Похоже, имя кластера происходит от имени мастера. Должна быть возможность указать имя кластера, вероятно, при создании кластера. Это сообщается как # 1018 . - Подключитесь к этому вновь созданному мастеру и найдите дополнительную информацию о нем:
0102030405060708091011121314151617181920212223242526272829
~>eval"$(docker-machine env swarm-master)"~> docker infoContainers: 2Images: 8Storage Driver: aufsRoot Dir:/mnt/sda1/var/lib/docker/aufsBacking Filesystem: extfsDirs: 12Dirperm1 Supported:trueExecution Driver: native-0.2Kernel Version: 3.18.11-tinycore64Operating System: Boot2Docker 1.6.0 (TCL 5.4); master : a270c71 - Thu Apr 16 19:50:36 UTC 2015CPUs: 8Total Memory: 999.4 MiBName: swarm-masterID: UAEO:HLG6:2XOF:QQH7:GTGW:XW6K:ZILW:RY57:JSEY:2PHI:4OHE:QMVWDebug mode (server):trueDebug mode (client):falseFds: 25Goroutines: 38System Time: Thu Apr 23 02:15:55 UTC 2015EventsListeners: 1Init SHA1: 9145575052383dbf64cede3bac278606472e027cInit Path:/usr/local/bin/dockerDocker Root Dir:/mnt/sda1/var/lib/dockerUsername: arunguptaRegistry: [https://index.docker.io/v1/]Labels:provider=virtualbox
Создать Swarm Nodes
- Создайте узел роя как:
1234567
~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22fswarm-node-01INFO[0000] Creating SSH key...INFO[0000] Creating VirtualBox VM...INFO[0006] Starting VirtualBox VM...INFO[0006] WaitingforVM to start...INFO[0070]"swarm-node-01"has been created and is now the active machine.INFO[0070] To point your Docker client at it, run thisinyour shell:eval"$(docker-machine env swarm-node-01)"Еще раз, создание узла связывается с размещенным сервисом в Docker Hub и присоединяется к ранее созданному кластеру. Это указывается с помощью
--swarm-discovery token://...и указывает идентификатор кластера, полученный ранее. - Создайте другой узел Swarm как:
1234567
~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22fswarm-node-02INFO[0000] Creating SSH key...INFO[0000] Creating VirtualBox VM...INFO[0006] Starting VirtualBox VM...INFO[0006] WaitingforVM to start...INFO[0061]"swarm-node-02"has been created and is now the active machine.INFO[0061] To point your Docker client at it, run thisinyour shell:eval"$(docker-machine env swarm-node-02)" - Перечислите все существующие машины Docker:
123456
~> docker-machinelsNAME ACTIVE DRIVER STATE URL SWARMmydocker virtualbox Running tcp://192.168.99.107:2376swarm-master virtualbox Running tcp://192.168.99.108:2376 swarm-master (master)swarm-node-01 virtualbox Running tcp://192.168.99.109:2376 swarm-masterswarm-node-02 * virtualbox Running tcp://192.168.99.110:2376 swarm-masterМашины, которые являются частью кластера, имеют имя кластера в столбце
SWARM, в противном случае пустым. Например,mydockerявляется автономной машиной, где, как и все другие машины, являются частью кластераswarm-master. Мастер Роя также идентифицирован(master)в столбце Рой. - Подключитесь к кластеру Swarm и найдите некоторую информацию об этом:
010203040506070809101112131415161718
~>eval"$(docker-machine env --swarm swarm-master)"~> docker infoContainers: 4Strategy: spreadFilters: affinity, health, constraint, port, dependencyNodes: 3swarm-master: 192.168.99.108:2376└ Containers: 2└ Reserved CPUs: 0 / 8└ Reserved Memory: 0 B / 1.025 GiBswarm-node-01: 192.168.99.109:2376└ Containers: 1└ Reserved CPUs: 0 / 8└ Reserved Memory: 0 B / 1.025 GiBswarm-node-02: 192.168.99.110:2376└ Containers: 1└ Reserved CPUs: 0 / 8└ Reserved Memory: 0 B / 1.025 GiBЕсть 3 узла — один мастер Swarm и 2 узла Swarm. Всего в этом кластере работает 4 контейнера — один агент Swarm на главном сервере и каждый узел, а на главном сервере работает дополнительный
swarm-agent-mastermaster. Это можно проверить, подключившись к мастеру и перечислив все контейнеры:12345~>eval"$(docker-machine env swarm-master)"~> dockerpsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES458c58f93a2b swarm:latest "/swarmjoin--addr 19 minutes ago Up 19 minutes 2375/tcpswarm-agent0c80a04859ba swarm:latest "/swarmmanage --tls 19 minutes ago Up 19 minutes 2375/tcp, 0.0.0.0:3376->3376/tcpswarm-agent-master - Сконфигурируйте клиент Docker для подключения к кластеру Swarm и проверьте список запущенных контейнеров:
123
~>eval"$(docker-machine env --swarm swarm-master)"~> dockerpsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESКак и ожидалось, в кластере не запущены контейнеры приложений.
- Перечислите узлы в кластере как:
1234
~> docker run swarm list token://117c8d19ba140d7ba3259aae9012e22f192.168.99.108:2376192.168.99.109:2376192.168.99.110:2376
Последующий блог покажет, как запустить несколько контейнеров на хостах в этом кластере, а также рассмотрит различные стратегии планирования.
- У Scaling Docker с Swarm есть хорошие детали.
Swarm еще не полностью интегрирован с Docker Compose. Но что было бы действительно здорово, это когда я могу указать все описания Docker Machine в docker-compose.yml , в дополнение к контейнерам. Затем docker-compose up -d настроит кластер и запустит контейнеры в этом кластере.
| Ссылка: | Кластеризация с использованием Docker Swarm 0.2.0 от нашего партнера по JCG Аруна Гупта из Miles to go 2.0… блог. |

