Для чего?
Многие задаются вопросом, как без проблем заставить работать 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 в основном нужен, если ты хочешь собрать свой образ.
Во-вторых, малина все-таки не предназначена для запуска кучи контейнеров. Данное решение является неким компромиссом для тех, и написано в основном для тех, кто не может или не хочет использовать по каким-то причинам только ноду или только хоумбридж.
малина в том числе предназначена для запуска кучи контейнеров
я просто оставлю это здесь...
https://dker.ru/docs/docker-compose/overview-of-docker-compose">https://dker.ru/docs/docker-co...
Тоже на всякий случай оставлю https://docs.docker.com/compose/">https://docs.docker.com/compos...
Статья хорошая. Однозначный Like.
UPD: Я тут подумал и понял, что странно, что для node-red вы не устанавливаете переменную env TZ. В случае использования нод, работающих со временем - будут проблемы (например node-red-contrib-time-range-switch)