Pull to refresh

Пусть роится Docker по всему кластеру на Raspberry Pi

Reading time5 min
Views46K
Original author: Stefan


От переводчика: Ссылка на эту статью была опубликована в последней официальной рассылке Docker. Думаю, я не один интересуюсь одновременно и Raspberry Pi и Docker (Swarm), поэтому предлагаю вашему вниманию перевод,

В этом посте мы расскажем насколько легко можно установить Swarm на ваших Raspberry Pi и настроить на них Swarm кластер с помощью Docker Machine.

Мы построили небольшую башню Pi из трёх Raspberry Pi 2 Model B и собрали их в кластер Docker Swarm.

Как можно видеть на фотографии, мы поставили три Распберри Пи на пятипортовый свич D-Link. Все четыре устройства питаются от 4ёх USB-портового зарядного устройства. Это позволяет башне быть очень устойчивой, но вместе с тем переносной — из внешних проводов имеются только один провод питания и один сетевой кабель.

Для вашего удобства, мы собрали использованные компоненты в один список покупок на Amazon. (Примечание переводчика: из всего списка осталось только два пункта, остальные куда-то очень быстро делись с Амазона.)

Необходимые материалы
В этом тьюториале все три шага ти выполним на Маке. Для этого нам потребуются три утилиты:

Утилита flash для записи образов SD карт для всех Raspberry Pi.
Клиент Docker, который находится на расстоянии одной установки brew.
Бинарник Docker Machine с драйвером hypriot.
 

Запишите карты


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

$ flash --hostname pi1 http://downloads.hypriot.com/hypriot-rpi-20150416-201537.img.zip
$ flash --hostname pi2 http://downloads.hypriot.com/hypriot-rpi-20150416-201537.img.zip
$ flash --hostname pi3 http://downloads.hypriot.com/hypriot-rpi-20150416-201537.img.zip

Затем вставьте карты во все устройства Raspberry Pi и загрузитесь с них. Через некоторое время, они появятся с разными именами хостов.
 

Получите IP адреса


Наши SD образы тоже запускают avahi-deamon чтобы объявить имя хостов через mDNS. Поэтому каждая из малин доступна через pi1.local, pi2.local и pi3.local. Docker Machine не может разрешить эти имена хостов на данный момент, поэтому нам необходимо получить адреса IP для малин вручную.

$ ping -c 1 pi1.local
$ ping -c 1 pi2.local
$ ping -c 1 pi3.local

Для этого примера представим, что три наших адреса это 92.168.1.101, 102 и 103.
 

Введите публичный ключ SSH


Docker Machine подключается к каждой Raspberry Pi через SSH. Вам потребуется ввести публичный ключ SSH чтобы не вводить пароль для пользователя root. Существует специальная утилита чтобы вводить публичный ключ SSH для удаленной машины под названием ssh-copy-id. Возможно вам потребуется сначала ее установить.

$ ssh-copy-id root@192.168.1.101
$ ssh-copy-id root@192.168.1.102
$ ssh-copy-id root@192.168.1.103

Для каждой из приведенных выше команд вам будет нужно ввести пароль hypriot для пользователя root.
 

Создайте Docker машины


Для следующего шага мы воспользуемся драйвером Docker Machine чтобы подключится к устройствам Raspberry Pi Hypriot. Наш драйвер hypriot пока не интегрирован в официальный бинарник Docker Machine. Поэтому потребуется скачать бинарник docker-machine с драйвером hypriot.

$ curl -o docker-machine http://downloads.hypriot.com/docker-machine_0.4.0-dev_darwin-amd64
$ chmod +x ./docker-machine

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

Создайте токен Swarm


Кластер Docker Swarm использует уникальный идентификатор кластера, который позволяет отдельным агентам сворма находить друг друга. Нам потребуется такой идентификатор чтобы создать Docker Swarm.
Это можно сделать из shell:

$ export TOKEN=$(for i in $(seq 1 32); do echo -n $(echo "obase=16; $(($RANDOM % 16))" | bc); done; echo)
$ echo $TOKEN

В этом примере мы используем
 $ export TOKEN=babb1eb00bdecadedec0debabb1eb00b

Если у вас уже есть запущенный контейнер с Docker Swarm, вы так же можете создать новый идентификатор кластера командой docker run --rm hypriot/rpi-swarm create. Мы воспользовались командой выше чтобы не вдаваться в проблему курицы и яйца.
 

Создайте Swarm Master


Теперь создадим Docker Swarm Master на первой Raspberry Pi с нашим сгенерированным идентификатором кластера
$ ./docker-machine create -d hypriot --swarm --swarm-master --swarm-discovery token://$TOKEN --hypriot-ip-address 192.168.1.101 pi1

Эта команда подключится к малине «pi1», возьмет контроль над демоном докер с помошью TLS и скачает Docker образ hypriot/rpi-swarm:latest из Docker Hub. Она запустит как Swarm Master, так и Swarm агента в контейнере.

Чтобы проверить все ли работает как надо, мы можем подключиться к только что созданному Swarm Master'у с используя следующую команду. Она получает все переменные среды необходимые клиентскому Docker'у для связи со Swarm.

$ eval $(./docker-machine env --swarm pi1)
$ docker info
Containers: 2
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 1
 pi1: 192.168.1.202:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 971.3 MiB

Мы успешно настроили одинокий менеджер Swarm. Чтобы ему не было одиноко, давайте запустим еще малиок.
 

Создайте агентов Swarm


Для оставшихся Raspberry Pi нам тоже нужно создать соединения Docker Machine с тем же идентификатором кластера. В этот раз мы запустим docker-machine без опции --swarm-master чтобы просто запустить контейнер агента Swarm на каждой из малин.

$ ./docker-machine create -d hypriot --swarm --swarm-discovery token://$TOKEN --hypriot-ip-address 192.168.1.102 pi2
$ ./docker-machine create -d hypriot --swarm --swarm-discovery token://$TOKEN --hypriot-ip-address 192.168.1.103 pi3

Давайте посмотрим на что теперь похож наш Swarm

$ docker info
Containers: 4
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 3
 pi1: 192.168.1.101:2376
  └ Containers: 2
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 971.3 MiB
 pi2: 192.168.1.102:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 971.3 MiB
 pi3: 192.168.1.103:2376
  └ Containers: 1
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 971.3 MiB

Мы можем вывести все контейнеры во всем swarm'е обычной командой

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                CREATED             STATUS              PORTS                                    NAMES
5effaa7de4a3        hypriot/rpi-swarm:latest   "/swarm join --addr    2 minutes ago       Up About a minute   2375/tcp                                 pi3/swarm-agent
6b73003b7246        hypriot/rpi-swarm:latest   "/swarm join --addr    4 minutes ago       Up 3 minutes        2375/tcp                                 pi2/swarm-agent
5e00fbf7b9f6        hypriot/rpi-swarm:latest   "/swarm join --addr    7 minutes ago       Up 7 minutes        2375/tcp                                 pi1/swarm-agent
02c905ec25a0        hypriot/rpi-swarm:latest   "/swarm manage --tls   7 minutes ago       Up 7 minutes        2375/tcp, 192.168.1.101:3376->3376/tcp   pi1/swarm-agent-master

После настройки Docker Swarm вы таперь можете использовать обычные команды Docker чарез порт 3376. За более подробной информацией обратитесь к официальной документации по Docker Swarm.

Для корретной связи со Swarm Master'ом, прежде чем использовать клиент Docker не забудьте настроить окружение

$ eval $(docker-machine env --swarm pi1)

Теперь вы можете удаленно управлять свормом на Raspberry Pi с вашего мака. Видите, это было совсем не трудно!

[...]
Tags:
Hubs:
+13
Comments8

Articles