Статья

Установка и запуск Node-Red и HomeBridge на RaspberryPi в Docker

Для чего?

Многие задаются вопросом, как без проблем заставить работать Node-Red и HomeBridge на малине. Особенно после каких-либо изменений и/или обновлений. Другая часть аудитории наверняка спросит - "А зачем это надо? В Node-Red есть Homekit и все можно без бриджа". Оставим дискуссию на данную тему за рамками данной статьи и приступим к тому, что, собственно, написано в заголовке.

Что такое Docker и с чем его едят

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

В общем и целом, докер - это утилита, которая позволяет запускать приложения в фиксированном окружении (библиотеки, зависимости и пр). Это позволяет нескольким приложениям работать с разными версиями одной и той же библиотеки, не нарушая зависимостей, и тем самым, ничего не ломая. Упрощенными словами - каждое приложение работает внутри своей "песочницы". Я не буду подробно останавливаться на описании технологии, все желающие могут почитать об этом на сайте докера. Я же затрону здесь основные аспекты, на которые стоит обратить внимание.

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

Все контейнеры по умолчанию хранят все данные внутри. Это значит, что при пересоздании контейнера все данные будут утеряны. Об этом надо помнить и хранить все необходимые данные с помощью так называемых томов (volumes) снаружи контейнера. В терминологии докера это называется persistent storage.

Очень много контейнеров получают свои первоначальные настройки из переменных окружения. Не забывайте об этом и старайтесь указывать все параметры до первого запуска контейнера

Docker - служба, которая следит за состоянием контейнеров, и автоматически их перезапускает, если... вы явно об этом сказали.

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

Установка

Данная статья предполагает, что у вас уже есть установленная (желательно чистая) система на RaspberryPi (автор статьи рекомендует минимум версию 3, но это условие не так, чтобы прям обязательное), малина включена в сеть, подключена к WiFi или к проводной сети, настроен SSH и вы имеете туда доступ. Если нет - самое время сделать это.

Мы с вами последовательно установим и настроим 4 компонента, имеющих отношение к этой статье. Разумеется, это только начало, и в дальнейшем, вы сможете использовать ваш Docker для запуска других приложений, которые вам понадобятся. Итак, последовательно установим:

Docker

Подключаемся к RaspberyPi с помощью любимого SSH-Клиента. Автор статьи будет использовать PuTTY.

Становимся root-ом (здесь и далее все команды, которые необходимо выполнить в консоли, будут написаны курсивом).

sudo -s

Обновляем репозитории (не забываем говорить "y" на вопросы)

apt-get update && apt-get upgrade

Данная процедура займет некоторое время, можете пока сходить, налить себе чайку.

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

Скачиваем и устанавливаем Docker:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

После установки нужно разрешить пользователю pi создавать и запускать контейнеры.

usermod -aG docker pi

Осталось проверить, что у нас докер работает, а также сказать системе, что докер должен запускаться при старте.

docker version
docker info
systemctl enable docker.service
systemctl start docker.service

Если никаких ошибок вы не получили (скорее всего так и есть), переходим к следующему шагу.

Лирическое отступление. У докера есть огромное хранилище образов, которое зовется doccker hub и располагается по адресу hub.docker.com. Если ищете контейнер - идите сразу туда.

Portainer

Portainer - это веб-интерфейс для управления контейнерами. После установки этой оболочки, командная строка нам больше не понадобится и мы сможем все делать из браузера.

Итак, для установки нам потребуется образ контейнера. Весь кайф в том, что при попытке запуска контейнера, докер, не найдя образа локально, будет сам его скачивать (по умолчанию из своего хаба, если не указано иного). Интересующиеся могут пройти на вышеупомянутый хаб и в поиске ввести "portainer", а мы продолжим.

Создадим тот самый persistent storage для контейнера, чтобы при обновлении или пересоздании контейнера, все настройки не потерялись.

docker volume create portainer_data
(вместо portainer_data можно использовать любое понравившееся вам слово, главное - не забыть его использовать везде далее по тексту).

И запускаем сам контейнер:

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

Расскажу немного по параметрам. Просто для информации.

-d - говорит докеру, что нужно "демонизировать" контейнер, то есть не цепляться к нему.
-p 8000:8000 -p 9000:9000 - "проброс" портов 8000 и 9000 внутрь контейнера из хост системы. Именно по этим портам работает Portainer.
--name=portainer - имя контейнера. Можете использовать любое какое хотите. Используется для идентификации.
--restart=always - та самая команда docker-у, что этот контейнер нужно всегда перезапускать.
-v /var/run/docker.sock:/var/run/docker.sock - использование системного стораджа /var/run/docker.sock в качестве внутреннего. Таким образом, мы "мапим" сокет докера внутрь контейнера.
-v portainer_data:/data/portainer/portainer-ce - "маппинг" того самого volume, что мы создали выше внутрь контейнера. Таким образом, контейнер будет все свои настройки хранить вне контейнера и не потеряет при пересоздании.

После этого, открываем наш любимый браузер и переходим по адресу http://<ip-адрес малины>:9000/. Нам предложат создать пароль администратора. Что мы и делаем.

После успешного создания администратора, вас отправят на экран выбора подсистемы, где необходимо выбрать docker и нажать кнопочку connect. Нажав на рамку, в которой отражен статус вашего докера (можете нажать на иконку кита), вы попадете на экран статуса. Можно переходить к следующему шагу.

Установка Node-Red

Установку сервера node-red начнем с создания persistent стораджа для него.

Homebridge

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

Создадим еще один Volume для хранения данных Homebridge. Имя, разумеется, вы можете использовать любое, автор использует homebridge-data.

Создадим контейнер Homebridge со следующими параметрами:

  • Name - Homebridge.
  • Registry - DockerHub.
  • Image name - oznu/homebridge.
  • Volume mapping: /homebridge -> homebridge_data.
  • Network - host.
  • Restart policy - unless stopped.

А вот тут есть небольшие отличия. Данный контейнер конфигурируется с помощью переменных окружения. Поэтому перед нажатием кнопки Deploy.. нужно зайти во вкладку Env.

Во вкладке Env вам необходимо создать 3 переменных со следующими именами и значениями:

HOMEBRIDGE_CONFIG_UI1

HOMEBRIDGE_CONFIG_UI_PORT8581
TZ
Europe/Moscow
Поясню.

HOMEBRIDGE_CONFIG_UI - включает плагин для веб-интерфейса к хоумбриджу.
HOMEBRIDGE_CONFIG_UI_PORT - указывает, по какому порту должен отвечать web-интерфейс. В данном случае - 8581

TZ - в какой временной зоне живет хоумбридж.
Разумеется, вы можете указывать необходимые вам значения.

Заключение

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

Если у вас возникнут вопросы после прочтения этой статьи, вы всегда можете найти меня в профильных чатах в Telegram по нику @blacklion_msk.


Очень подробная статья. Предлагаю написать для всех контейнеров docker-compose файл для удобства новичкам в докере. 

Не вижу смысла по нескольким причинам.
Во-первых, compose в основном нужен, если ты хочешь собрать свой образ. 
Во-вторых, малина все-таки не предназначена для запуска кучи контейнеров. Данное решение является неким компромиссом для тех, и написано в основном для тех, кто не может или не хочет использовать по каким-то причинам только ноду или только хоумбридж. 

  1. compose не нужен если ты собираешь свой образ, ровно точно так же как и наоборот
    малина в том числе предназначена для запуска кучи контейнеров

Тоже на всякий случай оставлю https://docs.docker.com/compose/">https://docs.docker.com/compos...

Статья хорошая. Однозначный Like.

UPD: Я тут подумал и понял, что странно, что для node-red вы не устанавливаете переменную env TZ. В случае использования нод, работающих со временем - будут проблемы (например node-red-contrib-time-range-switch)



Вернуться назад

Устройства


Raspberry Pi

Raspberry Pi 4

(16 отзывов)

Raspberry Pi

Raspberry Pi 3 Model B

(2 отзыва)

Вернуться назад