• V
 

Dockerで実行する

このガイドはDockerおよびDockerコマンドラインに対していくらか基本的な知識を持っていることを前提としています。 ここにはDockerでNode-REDを実行する多くの方法が記述されており、複数のアーキテクチャ(amd64、arm32v6、arm32v7、arm64v8およびs390x)をサポートしています。

現在のNode-RED 1.0でのこのプロジェクトはDocker Hubnodered/node-redコンテナでビルドできるようにしています。注意: 名称がnodered/node-redに変更されています。

0.20.x以前のバージョンはhttps://hub.docker.com/r/nodered/node-red-dockerから入手可能です。

クイックスタート

最も簡単な方法によってDockerで実行するには、次のようにします:

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

このコマンドを詳細に見てみましょう:

    docker run              - run this container... initially building locally if necessary
    -it                     - attach a terminal session so we can see what is going on
    -p 1880:1880            - connect local port 1880 to the exposed internal port 1880
    --name mynodered        - give this machine a friendly local name
    nodered/node-red        - the image to base it on

コマンドを実行するとNode-REDのインスタンスを実行するターミナルウィンドウが開かれます。

    Welcome to Node-RED
    ===================

    03 Oct 12:57:10 - [info] Node-RED version: v1.0.2
    03 Oct 12:57:10 - [info] Node.js  version: v10.16.3
    03 Oct 12:57:10 - [info] Linux 4.9.184-linuxkit x64 LE
    03 Oct 12:57:11 - [info] Loading palette nodes
    03 Oct 12:57:16 - [info] Settings file  : /data/settings.js
    03 Oct 12:57:16 - [info] Context store  : 'default' [module=memory]
    03 Oct 12:57:16 - [info] User directory : /data
    03 Oct 12:57:16 - [warn] Projects disabled : editorTheme.projects.enabled=false
    03 Oct 12:57:16 - [info] Flows file     : /data/flows.json
    03 Oct 12:57:16 - [info] Creating new flow file
    03 Oct 12:57:17 - [warn]

    ---------------------------------------------------------------------
    Your flow credentials file is encrypted using a system-generated key.

    If the system-generated key is lost for any reason, your credentials
    file will not be recoverable, you will have to delete it and re-enter
    your credentials.

    You should set your own key using the 'credentialSecret' option in
    your settings file. Node-RED will then re-encrypt your credentials
    file using your chosen key the next time you deploy a change.
    ---------------------------------------------------------------------

    03 Oct 12:57:17 - [info] Starting flows
    03 Oct 12:57:17 - [info] Started flows
    03 Oct 12:57:17 - [info] Server now running at http://127.0.0.1:1880/

    [...]

ブラウザでhttp://{host-ip}:1880を開くと、馴染みのNode-REDのデスクトップを確認できます。

これをおこなう利点は命名する(mynodered)ことでより簡単に操作することができ、 ホストポートを修正することで慣れ親しんでいる画面にたどり着くことができます。 もちろんこれは同時に1つのインスタンスしか実行できないことを意味します…しかし、一度に1ステップずつ実行できます

Note: 現在Dockerのアーキテクチャ検出に、Arm6 CPU - 例えばRaspberry Pi Zeroまたは1について失敗するというバグがあります。現状、以下のようにこれらのデバイスではフルビルドラベルを指定する必要があります。:

docker run -it -p 1880:1880 --name mynodered nodered/node-red:1.0.2-10-minimal-arm32v6

現在実行しているものに満足した場合、Ctrl-p Ctrl-qによってターミナルを切り離すことができます - コンテナはバックグラウンドで実行させ続けます。

ターミナルに再接続する(ログを確認する)ためには、以下を実行します:

    $ docker attach mynodered

コンテナを再起動する必要がある場合(例 Dockerデーモンのリブート再起動):

    $ docker start mynodered

そして必要なときに再び停止します:

    $ docker stop mynodered

イメージのバリエーション

Node-REDイメージは異なるバリエーションがあり、マニフェストリストでサポートされています(自動検出アーキテクチャ)。 これによって複数アーキテクチャのDocker環境に簡単にデプロイすることができます。例えば、Raspberry Piとamd64のノードが混ざったDocker Swarmを作ることができます。

タグの命名規則は<node-red-version>-<node-version>-<image-type>-<architecture>となっています:

  • <node-red-version>はNode-REDのバージョン。
  • <node-version>はNode JSのバージョン。
  • <image-type>はイメージタイプであり、_none_またはminimalはオプションです。
    • none : デフォルトであり、Python 2およびPython 3さらにdevtoolsがインストールされています
    • minimal : Pythonがインストールされておらず、devtoolsもインストールされていません
  • <architecture>はDockerホストシステムのアーキテクチャであり、amd64、arm32v6、arm32v7、arm64またはs390xのいずれかです。

minimalバージョン(pythonおよびビルドツールが存在しない)は、ローカルでコンパイルされたネイティブコードが必要なノードをインストールすることはできません。

例えば - 最新の最小バージョンで実行するには、以下のようにします

docker run -it -p 1880:1880 --name mynodered nodered/node-red:latest-minimal

Node-REDイメージは、可能な限り小さく保つためにofficial Node JS Alpine Linuxイメージに基づいています。 Alpine Linuxを使用するとビルドされるイメージのサイズを小さくすることができますが、ネイティブモジュールのコンパイルに必要な一般的な依存関係は除去されています。これらの依存関係を加えたい場合、実行しているコンテナで除外したパッケージでNode-REDイメージを拡張するか、docker-customを参考に新たなイメージをビルドします。

詳細なイメージ、タグ、マニフェスト情報についてはGithub project READMEを参照してください。

例えば: アーキテクチャとしてarm32v7を持つRaspberry PI 3Bで実行するとしましょう。そして、以下のコマンドでイメージ(1.0.2-10-arm32v7とタグ付けされた)をプルし、コンテナを起動します。

docker run -it -p 1880:1880 --name mynodered nodered/node-red:latest

同じコマンドはamd64システムで実行している場合でも利用することができますが、これはDockerがamd64ホストで実行されていることを検出し、一致するタグ(1.0.2-10-amd64)のイメージをプルするからです。

これは自身が実行しているアーキテクチャを知る/指定する必要がないという利点を提供し、docker runコマンドとDockerコンポーズファイルをより柔軟に、システム間の互換を可能にします。

Note: 現在Dockerのアーキテクチャ検出に、Arm6 CPU - 例えばRaspberry Pi Zeroまたは1について失敗するというバグがあります。現状、以下のようにこれらのデバイスではフルビルドラベルを指定する必要があります。:

docker run -it -p 1880:1880 --name mynodered nodered/node-red:1.0.2-10-minimal-arm32v6

Raspberry PI - ネイティブGPIOサポート

| v1.0 - 緊急: Raspberry PIのネイティブGPIOサポートは廃止されました! | | — | ネイティブGPIOの代替はnode-red-node-pi-gpiodです。

ネイティブGPIOサポートの欠点は以下のとおりです:

  • Dockerコンテナは、gpioをコントロールしたい同じDockerノード/ホストにデプロイする必要があります
  • Dockerノード/ホストの/dev/memにアクセスします
  • privileged=trueはdocker stackコマンドではさぽーとされていません

node-red-node-pi-gpiodはこれらの全ての欠点を解消します。node-red-node-pi-gpiodは単一のNode-REDコンテナから複数のRaspberry Piのgpioと情報交換すること、そして複数のコンテナが同じRaspberry Piの異なるgpioにアクセスすることが可能にします。

node-red-node-pi-gpiodへのクイック移行手順

  1. Node-REDパレットを通してnode-red-node-pi-gpiodをインストールします
  2. ホストのPaspberry PiにPiGPIOd daemonをインストールして実行します
  3. pi gpiodノードによって全てのネイティブGPIOノードを置換します
  4. PiGPIOd daemonに接続するようにpi gpioノードを設定します。ほとんどのホストマシンはIPアドレス172.17.0.1 ポート番号8888がありますが、常ではありません。確認にはdocker exec -it mynodered ip route show default | awk '/default/ {print $3}'を利用できます。

詳細なインストール手順はnode-red-node-pi-gpiod READMEを参照してください。

Note: 必要な場合、ホスト上ではなくそれ自身のコンテナでgpiodを実行するgpiod projectが存在します。

ユーザデータを管理する

DockerでNode-REDを実行する場合、 コンテナが壊れた場合に追加したノードやフローが消失しないことを保証する必要があります。 コンテナ外部のボリュームに対してデータディレクトリをマウンティングすることで、このユーザデータを永続化することができます。 バインドしたマウントまたは命名したデータボリュームを使うことでおこなうこともできます。

Node-REDはコンテナ内の/dataディレクトリを使うことでユーザ設定データを保存できます。

永続化のためにホストディレクトリを利用する(マウントをバインドする)

コンテナ内部のNode-REDのユーザディレクトリを、コンテナ外部のホストディレクトリに保存することで、以下のコマンドを使うことができます。 このホストディレクトリにアクセスを許可すると、 コンテナ内のnode-redユーザ(デフォルトではuid=1000)はホストディレクトリのオーナーとして同じuidを持っているはずです。

docker run -it -p 1880:1880 -v /home/pi/.node-red:/data --name mynodered nodered/node-red

この例ではホストの/home/pi/.node-redディレクトリをコンテナの/dataディレクトリにバインドします。

Note: バージョン0.20から1.0に移行したユーザは存在している/dataディレクトリが正しいオーナー権限を持っていることを確認する必要がある。 1.0では、1000:1000となる必要があります。 コマンドsudo chown -R 1000:1000 path/to/your/node-red/dataによって強制的に変更することができます。

権限に関する詳細な情報については、 wikiを参照してください。

命名されたデータボリュームを利用する

Dockerも命名されたデータボリュームを使うことがサポートされており、 コンテナ外部で永続化または共有するデータを保存することができます。

ユーザデータを永続化するために新たに命名されたデータボリュームを作成し、 このボリュームを使って新たなコンテナを実行します。

    $ docker volume create --name node_red_user_data
    $ docker volume ls
    DRIVER              VOLUME NAME
    local               node_red_user_data
    $ docker run -it -p 1880:1880 -v node_red_user_data:/data --name mynodered nodered/node-red

いくつかのサンプルフローを作成してデプロイするためにNode-REDを使ったあと、 コンテナを壊してユーザデータを喪失することなく新しいインスタンスを起動します。

    $ docker rm mynodered
    $ docker run -it -p 1880:1880 -v node_red_user_data:/data --name mynodered nodered/node-red

更新する

/dataは現在コンテナの外部に保存されているため、 ベースのコンテナイメージを更新することはシンプルです。

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

Dockerスタック / Dockerコンポーズ

以下のDockerコンポーズファイルの例はdocker stackまたはdocker-composeによって実行できます。 Docker stackおよびDocker composeに関する更なる情報は公式Dockerページを参照してください。

################################################################################
# Node-RED Stack or Compose
################################################################################
# docker stack deploy node-red --compose-file docker-compose-node-red.yml
# docker-compose -f docker-compose-node-red.yml -p myNoderedProject up
################################################################################
version: "3.7"

services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "1880:1880"
    networks:
      - node-red-net
    volumes:
      - node-red-data

volumes:
  node-red-data:

networks:
  node-red-net:

上述のコンポーズファイルは以下のことをおこないます:

  • node-redサービスを作成
  • 最新版node-redイメージをプル
  • ヨーロッパ/アムステルダムにタイムゾーンを設定
  • コンテナポート1880をホストポート1880に設定
  • node-red-netネットワークを作成、このネットワークにコンテナを接続
  • コンテナ内の/dataディレクトリをコンテナ外の/mnt/docker-cluster/node-red/dataディレクトリに永続化

起動

npm startを使用することでNode-REDは/usr/src/node-redから実行され、 --userDirパラメータはコンテナの/dataディレクトリを指定します。

フロー設定ファイルは、 デフォルトでは‘flows.json’となっている環境変数(FLOWS)を使うことで設定します。 以下のコマンドラインフラグによって実行時に変更することができます。

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

Note: -e FLOWS=""を指定した場合、 settings.jsファイル内のflowFileプロパティを経由してフローファイルに設定されます。

Node.jsの実行時引数は環境変数(NODE_OPTIONS)を使うことでコンテナに引き渡すことができます。 例えば、Node.jsガーベージコレクタを使うことでヒープサイズの修正をおこなうためには 以下のコマンドを使用します。

docker run -it -p 1880:1880 -e NODE_OPTIONS="--max_old_space_size=128" nodered/node-red

その他有用な環境変数は以下のとおりです

  • -e NODE_RED_ENABLE_SAFE_MODE=false # trueに設定することでセーフ(実行されない)モードでNode-REDを起動します
  • -e NODE_RED_ENABLE_PROJECTS=false # trueに設定することでプロジェクト機能を有効にしてNode-REDを起動します

コンテナシェル

$ docker exec -it mynodered /bin/bash

コンテナ内のコマンドラインを表示します - 実行したいnpm installコマンドを実行できます

  • $ cd /data
    $ npm install node-red-node-smooth
    $ exit
    $ docker stop mynodered
    $ docker start mynodered
    

そして、ブラウザページを更新することでパレットに新しく追加したノードが現れるはずです。

ヘッドレスで実行する

Node-REDを実行するだけに必要な究極に最小限な操作は

$ docker run -d -p 1880:1880 nodered/node-red

これはマシンのローカル実行インスタンスを作成します - 何らかのDocker IDを持ち、ランダムなポートで実行されていて…実行を確認するには

$ docker ps
CONTAINER ID        IMAGE                            COMMAND             CREATED             STATUS                     PORTS                     NAMES
4bbeb39dc8dc        nodered/node-red:latest          "npm start"         4 seconds ago       Up 4 seconds               0.0.0.0:49154->1880/tcp   furious_yalow
$

応答があったTCPポートでホストマシンをブラウザで指定します、 つまり上記の例ではhttp://{host ip}:49154でブラウザで確認します。

コンテナのリンク

–linkオプションを使用することでDocker実行環境の「内部に」コンテナをリンクすることができます。

例えば、次のように利用できるシンプルなMQTTブローカーコンテナがあります。

    docker run -it --name mybroker eclipse-mosquitto

(望まない限り、ポート1883をグローバルに公開する必要はありません。後で魔法をかけます。)

そしてnode-red dockerを実行します - しかし今回はlinkパラメータ(name:alias)を使います

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

ここでの魔法は、外部のmybrokerインスタンスにリンクしているブローカーと呼ばれるnode-redインスタンスのホストファイルに、 --linkでエントリを追加することです。 しかし、ポート1880で公開しており、node-redの編集のために外部のブラウザを使うことができます。

そして、以下のようなシンプルなフローは動作するはずです - つい先程設定したエイリアスブローカーを使います

    [{"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":[]}]

この方法は内部ブローカーをDockerホスト外に公開しません - もちろん公開したいのであれば、-p 1883:1883などをブローカーに追加してコマンドを実行することができます。

よくある問題とヒント

ここではユーザが報告した一般的な問題と解決策の一覧を示します。

ユーザ権限のエラー

権限に関する詳細な情報については wikiを参照してください。

権限拒否エラーを確認した場合、ファイルを開くかホストデバイスにアクセスし、ルートユーザとしてコンテナを起動してみてください。

docker run -it -p 1880:1880 --name mynodered -u root nodered/node-red

リファレンス:

https://github.com/node-red/node-red/issues/15

https://github.com/node-red/node-red/issues/8

ホストデバイスにアクセスする

コンテナ内のホストからデバイスにアクセスしたい、例えばシリアルポートの場合、以下のコマンドラインフラグを使ってアクセスします。

docker run -it -p 1880:1880 --name mynodered --device=/dev/ttyACM0 nodered/node-red

リファレンス: https://github.com/node-red/node-red/issues/15

タイムゾーンを設定する

デフォルトのタイムゾーンを変更したい場合、相対タイムゾーンを用いたTZ環境変数を使用します。

docker run -it -p 1880:1880 --name mynodered -e TZ=Europe/London nodered/node-red

リファレンス: https://groups.google.com/forum/#!topic/node-red/ieo5IVFAo2o