Как создать кластер контейнеров Docker с помощью Docker Swarm и Ubuntu 16.04
Введение
Docker Swarm — это собственное решение Docker для развертывания кластера хостов Docker. Вы можете использовать его для быстрого развертывания кластера хостов Docker, работающих либо на вашем локальном компьютере, либо на поддерживаемых облачных платформах.
До Docker 1.12 для настройки и развертывания кластера хостов Docker требовалось использовать внешнее хранилище ключей и значений, такое как Consul, для обнаружения служб. Однако с Docker 1.12 внешняя служба обнаружения больше не нужна, поскольку Docker поставляется с хранилищем ключей и значений в памяти, которое работает «из коробки».
В этом руководстве вы узнаете, как развернуть кластер машин Docker с помощью функции Swarm Docker 1.12 в DigitalOcean. Каждый узел Docker в кластере будет работать под управлением Ubuntu 16.04. Хотя вы можете запустить кластер, состоящий из десятков, сотен или тысяч хостов Docker, кластер, который мы будем настраивать в этом руководстве, будет состоять из узла менеджера и двух рабочих узлов, всего три члена кластера. . После того, как вы закончите это руководство, вы сможете легко добавлять дополнительные узлы в свой кластер.
Предпосылки
Для этого урока вам понадобится:
- Локальный компьютер с установленным Docker. На вашем локальном компьютере может быть установлен любой дистрибутив Linux или даже Windows или macOS. Для Windows и macOS установите Docker, используя инструкции по установке и использованию Docker в Ubuntu 16.04.
- Токен API DigitalOcean. Если у вас его нет, создайте его с помощью этого руководства. Когда вы создаете токен, убедитесь, что он имеет область чтения-записи. Это значение по умолчанию, поэтому, если вы не измените какой-либо параметр при его создании, у него будут возможности чтения-записи. Чтобы упростить использование в командной строке, обязательно назначьте токен переменной, как указано в этой статье.
- Docker Machine, установленный на вашем локальном компьютере, который вы будете использовать для создания трех хостов. В Windows и macOS установка Docker включает Docker Machine. Если вы используете Ubuntu 16.04 локально, инструкции по установке см. в разделе Как подготовить удаленные хосты Docker и управлять ими с помощью Docker Machine в Ubuntu 16.04.
Шаг 1 — Подготовка узлов кластера
Нам нужно создать несколько хостов Docker для нашего кластера. Напоминаем, что следующая команда подготавливает один хост Dockerized, где $DOTOKEN
— это переменная среды, которая оценивается как ваш токен DigitalOcean API:
- docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name
Представьте, что вам нужно сделать это, чтобы настроить кластер, состоящий как минимум из трех узлов, выделяющих по одному хосту за раз.
Мы можем автоматизировать процесс подготовки любого количества хостов Docker с помощью этой команды в сочетании с некоторыми простыми сценариями Bash. Выполните эту команду на локальном компьютере, чтобы создать три хоста Docker с именами node-1
, node-2
и node-3
:
- for i in 1 2 3; do docker-machine create --driver digitalocean \
- --digitalocean-image ubuntu-16-04-x64 \
- --digitalocean-access-token $DOTOKEN node-$i; done
После успешного выполнения команды вы можете убедиться, что все машины созданы, посетив панель управления DigitalOcean или введя следующую команду:
- docker-machine ls
Вывод должен быть похож на следующий, и он должен служить кратким справочником для поиска IP-адреса узлов:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node-1 - digitalocean Running tcp://111.111.111.111:2376 v1.12.2
node-2 - digitalocean Running tcp://111.111.111.112:2376 v1.12.2
node-3 - digitalocean Running tcp://111.111.222.222:2376 v1.12.2
На данный момент все три узла Dockerized созданы, и у вас есть IP-адрес каждого узла. Все они также работают под управлением Docker 1.12.x, но еще не являются частью кластера Docker. На следующих шагах мы настроим правила брандмауэра, которые заставят узлы функционировать как члены кластера, выберем один из узлов и назначим его менеджером Docker Swarm, а остальные настроим как рабочие Docker Swarm.
Шаг 2 — Настройка правил брандмауэра для разрешения трафика Docker Swarm
В кластере должен быть хотя бы один узел, который служит менеджером, хотя для производственной установки рекомендуется три менеджера. Для этой настройки давайте выберем первый узел и сделаем его менеджером Swarm. Два других узла будут рабочими узлами.
Для правильной работы кластера необходимо открыть определенные сетевые порты на узлах, которые будут частью кластера. Это влечет за собой настройку брандмауэра для пропуска трафика через эти порты. Поскольку для выполнения этой задачи можно использовать три различных приложения брандмауэра, команды, которые необходимо выполнить на узлах для каждого приложения брандмауэра, описаны в отдельной статье. Следуйте этому руководству и настройте брандмауэры для каждого хоста. Откройте соответствующие порты в диспетчере, затем повторите, чтобы открыть порты на двух клиентских узлах.
После того, как вы выполнили этот шаг, вы можете инициализировать менеджер кластера.
Шаг 3 — Инициализация диспетчера кластеров
Мы решили, что node-1
будет нашим менеджером кластера, поэтому войдите на узел со своего локального компьютера:
- docker-machine ssh node-1
Командная строка изменится, чтобы отразить тот факт, что вы вошли в этот конкретный узел. Чтобы настроить узел в качестве менеджера Swarm, введите следующую команду:
- docker swarm init --advertise-addr node_ip_address
node_ip_address
— это IP-адрес узла. Вы можете получить его из вывода docker-machine ls
или с панели инструментов DigitalOcean.
Вы увидите вывод, который выглядит следующим образом:
OutputSwarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
В выходных данных содержится идентификатор узла, в данном примере это a35hhzdzf4g95w0op85tqlow1, и инструкции по добавлению других узлов в кластер.
Итак, теперь у вас есть Docker Swarm с настроенным менеджером. Добавим оставшиеся узлы в качестве рабочих.
Шаг 4 — Добавление узлов в кластер
Чтобы выполнить этот шаг, вы можете открыть другой терминал и пока оставить только вкладку или окно терминала, которые вы использовали для входа в менеджер Swarm.
Сначала подключитесь к node-2
с вашего локального компьютера:
- docker-machine ssh node-2
Затем выполните эту команду, где your_swarm_token
— это токен, который вы получили при создании кластера на предыдущем шаге, а manager_node_ip_address
— это IP-адрес менеджера Swarm:
- docker swarm join \
- --token your_swarm_token \
- manager_node_ip_address:2377
После успешного выполнения команды вы увидите такой ответ:
OutputThis node joined a swarm as a worker.
Выйдите из node-2
, а затем повторите этот процесс с node-3
, чтобы добавить его в свой кластер. .
Теперь вы добавили в кластер два рабочих узла. Если правила брандмауэра были настроены правильно, теперь у вас есть работающий Docker Swarm со всеми синхронизированными узлами.
Шаг 5 — Управление кластером
После того, как управляющий и рабочий узлы были назначены кластеру, все команды управления Docker Swarm должны выполняться на управляющих узлах. Поэтому вернитесь к терминалу, который вы использовали для добавления менеджера, и введите эту команду, чтобы просмотреть всех членов кластера:
- docker node ls
Вывод должен быть похож на этот:
OutputID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active
6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active
a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader
Этот вывод показывает, что мы имеем дело с 3-узловым Docker Swarm и его узлами — менеджером и двумя рабочими. Чтобы просмотреть другие команды управления, которые вы можете запустить на узле менеджера, введите:
- docker node --help
Для получения подробной информации о кластере вы можете использовать следующую команду для менеджера или рабочих процессов (это общая команда Docker):
- docker info
Вывод должен быть такого рода и должен указывать статус кластера (активный или ожидающий), количество узлов в кластере и является ли конкретный узел управляющим или рабочим.
Output...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...
Если вы повторите ту же команду на рабочих узлах, строка Is Manager должна показать false
.
Совет: Вы можете в любое время добавить или удалить узлы из кластера. Кроме того, рабочий узел может быть повышен до менеджера, а менеджер может быть преобразован в рабочий.
Теперь давайте запустим службу в кластере.
Шаг 6 — Запуск сервисов в Docker Swarm
Теперь, когда у вас есть запущенный Docker Swarm, давайте запустим тестовый контейнер и посмотрим, как с ним справится менеджер. На машине с Docker Engine 1.12 или новее контейнеры развертываются как службы с помощью команды docker service
. Как и команда docker node
, команда docker service
может выполняться только на управляющем узле.
Итак, давайте развернем службу веб-сервера, используя официальный образ контейнера Nginx:
- docker service create -p 80:80 --name webserver nginx
В этой команде мы сопоставляем порт 80
в контейнере Nginx с портом 80
в кластере, чтобы мы могли получить доступ к странице Nginx по умолчанию из любого места.
Чтобы просмотреть, какие службы работают в кластере, введите:
- docker service ls
Вывод должен иметь такую форму. Столбец REPLICAS показывает, сколько запущено экземпляров службы:
OutputID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
Вы можете определить, на каких узлах работают службы, используя docker service ps
, за которым следует имя службы.
- docker service ps webserver
Вывод должен быть похож на следующий:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago
В этом примере служба webserver
работает на node-1
. Поскольку это веб-сервер, работающий на портах по умолчанию, вы можете получить к нему доступ, указав в браузере http://node-1_ip_address
. Попробуйте. Вы увидите страницу Nginx по умолчанию.
Благодаря волшебству ячеистых сетей служба, работающая на узле, может быть доступна на любом другом узле кластера. Например, к этому сервису Nginx также можно получить доступ, указав в браузере IP-адрес любого узла в кластере, а не только того, на котором он запущен. Попробуйте.
Еще одна особенность Docker Swarm — возможность масштабировать сервис, то есть раскручивать дополнительные экземпляры сервиса. Предположим, мы хотим масштабировать сервис webserver
, который мы запустили ранее, до пяти экземпляров. Для этого мы просто вводим следующую команду, и система создаст еще четыре экземпляра:
- docker service scale webserver=5
А вывод docker service ps
покажет, на каких узлах были запущены новые экземпляры:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago
1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago
d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago
Это показывает, что два из четырех новых экземпляров были запущены на node-3
, один был запущен на node-1
, а другой запущен на node-2
.
Наконец, если служба выходит из строя, она автоматически перезапускается на том же узле или на другом узле, если исходный узел больше недоступен.
Заключение
Вы видели, как легко настроить Docker Swarm с помощью Docker Engine 1.12 и нового режима Swarm. Вы также видели, как выполнять несколько задач управления в кластере. Но есть еще кое-что. Чтобы просмотреть доступные команды Docker Swarm, выполните следующую команду в диспетчере Swarm.
- docker swarm --help
Для получения дополнительной информации о Docker Swarm посетите связанные с Docker статьи на DigitaloOcean.