Node-RED:Введение/Запуск под Docker

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Запуск под Docker[1]

Есть несколько способов запуска Node-RED под Docker, и мы в этом руководстве опишем некоторые из них.

Примечание

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

Контейнерные версии Node-RED

Мы разместили в DockerHub три контейнерные версии Node-RED со следующими тегами:

Использование Alpine Linux позволяет уменьшить размер собранного образа (100 Мб vs 700 Мб), но удаляет стандартные зависимости, требуемые для компиляции нативных модулей. Если вы хотите добавить модули с нативными зависимостями, либо используйте стандартный образ, либо дополните «обезжиренный» образ недостающими пакетами.

Теперь также доступны дополнительные образы, использующие более новый базовый образ Node.js v8. Они имеют следующие теги:

  • v8
  • slim-v8
  • rpi-v8

Кроме того, версии Node-RED тегированы цифровыми названиями, что удобно, если вам нужен Node-RED строго определенной версии: latest:X.Y.Z, slim:X.Y.Z, rpi:X.Y.Z.

Быстрый старт

Чтобы запустить контейнер «latest», воспользуйтесь следующей командой:

docker run -it -p 1880:1880 --name mynodered nodered/node-red-docker
Примечание

Если у вас Raspberry Pi, то вы должны использовать образ с тегом «rpi»:

nodered/node-red-docker:rpi

Команда выше загрузит из DockerHub контейнер «nodered/node-red-docker» и запустит его экземпляр под названием «mynodered» с открытым портом 1880. Запуск Node-RED будет показан в окне терминала. Когда Node-RED будет запущен, вы можете ввести в адресную строку браузера «http://{ip-адрес-хоста}:1880», чтобы открыть редактор Node-RED.

Чтобы контейнер начал работать в фоновом режиме, зажмите  Ctrl , а потом нажмите  P + Q .

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

docker attach mynodered

Чтобы остановить контейнер:

docker stop mynodered

Чтобы запустить контейнер:

docker start mynodered
Примечание

Ваши потоки будут сохранены в файл «flows.json», находящийся в контейнере. Но вы можете задать вместо него другой файл при помощи переменной окружения «FLOWS»:

docker run -it -p 1880:1880 -e FLOWS=my_flows.json nodered/node-red-docker

Переменная окружения «NODE_OPTIONS» позволяет передать контейнеру аргументы командной строки Node.js. Например, чтобы задать размер кучи, используемой «сборщиком мусора» Node.js, можно воспользоваться следующей командой:

docker run -it -p 1880:1880 -e FLOWS=my_flows.json nodered/node-red-docker

Добавление новых нод

В качестве папки для настроек пользователя контейнер использует директорию «/data». Чтобы добавить в нее дополнительные ноды, вы можете открыть в контейнере командную оболочку bash и запустить в ней соответствующие команды «npm install».

# Открываем командную оболочку в контейнере:
docker exec -it mynodered /bin/bash

# Будучи внутри контейнера, используем «npm install»,
# чтобы установить нужные ноды в директорию «/data»:
cd /data
npm install node-red-node-smooth
exit

# Перезапускаем контейнер, чтобы загрузить новые ноды:
docker stop mynodered
docker start mynodered

Хранение данных за пределами контейнера

Путь к директории «/data» можно монтировать на внешний том:

docker run -it -p 1880:1880 -v ~/node-red-data:/data --name mynodered nodered/node-red-docker

Эта команда делает директорию «~/node-red-data» на компьютере-хосте директорией для хранения настроек пользователя внутри контейнера.

Чтобы добавить в контейнер дополнительные ноды, запустите на компьютере-хосте следующие команды:

cd ~/node-red-data
npm install node-red-node-smooth
docker stop mynodered
docker start mynodered


Примечание

Модули с нативными зависимостями будут скомпилированы на архитектуре компьютера-хоста. Эти модули не будут работать внутри контейнера Node-RED, разве что его архитектура не будет соответствовать архитектуре базового образа контейнера. Поэтому рекомендуем либо устанавливать нативные модули при помощи локальной командной оболочки, либо обновлять «package.json» и делать пересборку.

Сборка контейнера из исходного кода

Docker-файлы для всех контейнерных версий Node-RED сопровождаются тут, и у каждой есть своя собственная ветка.

Чтобы собрать собственную версию, воспользуйтесь вот этими командами:

git clone https://github.com/node-red/node-red-docker.git
cd node-red-docker

# Собираем контейнер с нужным тегом:
docker build -f <version>/Dockerfile -t mynodered:<tag>

Сборка собственного образа

Создание нового Docker-образа – с использованием публичных образов Node-RED в качестве базового образа – позволяет установить дополнительные ноды во время процесса сборки.

Создаем файл под названием «Dockerfile» со следующим содержимым:

FROM nodered/node-red-docker
RUN npm install node-red-node-wordpos

Запускаем команду ниже, чтобы собрать образ:

docker build -t mynodered:<tag> .

Это создаст образ Node-RED с нодами «wordpos».

Обновление

Обновление базового образа контейнера делается очень просто:

docker pull nodered/node-red-docker
docker stop mynodered
docker start mynodered

Как связать контейнеры друг с другом

Контейнеры можно связать друг с другом «внутренне» – в среде выполнения Docker – при помощи флага «--link».

К примеру, если вам нужно, чтобы ваш контейнер с Node-RED и контейнер с MQTT-брокером под названием «mybroker» безопасно обменивались информацией, вам нужно запустить этот контейнер с Node-RED вместе с флагом «--link»:

docker run -it -p 1880:1880 --name mynodered --link mybroker:broker nodered/node-red-docker

Эта команда сделает «broker» известным именем хоста внутри контейнера Node-RED, благодаря чему это имя хоста можно будет использовать для доступа к сервису внутри потока – без необходимости демонстрировать его за пределами Docker-хоста.

[{"id":"190c0df7.e6f3f2","type":"mqtt-broker","broker":"broker","port":"1883","clientid":""},{"id":"37963300.c869cc","type":"mqtt in","name":"","topic":"test","broker":"190c0df7.e6f3f2","x":226,"y":244,"z":"f34f9922.0cb068","wires":[["802d92f9.7fd27"]]},{"id":"edad4162.1252c","type":"mqtt out","name":"","topic":"test","qos":"","retain":"","broker":"190c0df7.e6f3f2","x":453,"y":135,"z":"f34f9922.0cb068","wires":[]},{"id":"13d1cf31.ec2e31","type":"inject","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":226,"y":157,"z":"f34f9922.0cb068","wires":[["edad4162.1252c"]]},{"id":"802d92f9.7fd27","type":"debug","name":"","active":true,"console":"false","complete":"false","x":441,"y":261,"z":"f34f9922.0cb068","wires":[]}]

См.также

Внешние ссылки