🐳

DockerでIBM CloudのNode-REDの開発環境を再現してみた

2021/12/08に公開

IBM CloudからNode-REDを実行するには、手順が色々あった面倒です。

単純にAPIを動かしたりするぐらいならローカルで環境を手軽に構築したいわけですが、IBM Cloud上でNode-REDを動かすときにはCloudantというNoSQLデータベースがつかえるというメリットがあります。

そのCloudantをDockerで使えたらIBM Cloudの実行環境の手間がなくなるなと思いました。

というわけで今回はDockerを使ってIBM CloudのようにNode-REDとCloudantを実行する環境を再現してみました。(単純に両サービスを動かせるようにするという意味での再現であって、完全な再現ではありません)

必要なもの

  • Docker Desktop(Windows・MacOS)
  • Linuxはこちらの手順でインストールすればいいかと思います。

docker-composeファイル

早速今回使用するdocker-compose.ymlファイルは以下のものなります。

CloudantはDockerイメージがあるので、Docker ComposeでNode-REDとセットで構築することができます。

version: '2'
services:
  nodered:
    image: nodered/node-red
    volumes:
      - .:/data
    ports:
      - "1880:1880"
    depends_on:
      - cloudant
  cloudant:
    image: ibmcom/cloudant-developer
    hostname: developer.local
    volumes:
      - ./cloudant:/srv
    ports:
      - "2080:80"

動かしてみる

先程作成したdocker-compose.ymlと同じディレクトリに移動し、以下のコマンドを実行します。

docker-compose up -d

Node-REDを起動

ブラウザでlocalhost:1880にアクセスすると、Node-REDが起動できます。

適当なフローを作成してフローが動けば問題ありません。

Cloudantを起動

再びブラウザでlocalhost:2080/dashboard.htmlにアクセスすると、Cloudantが起動できます。

UsernameとPasswordは以下の内容を入力します。

Username: admin
Password: pass

ログインをしてデータベースの一覧が表示されたら成功です。

Node-REDでCloudantを使う

一通り立ち上げたアプリの動作を確認したところでNode-REDでCloudantを使ってみます。

IBM CloudのNode-RED環境では、Cloudantに接続するためのノードがデフォルトで入っていますが、Dockerの環境でCloudantを使う場合は、Cloudantのノードを追加する必要があります。

そこで使うノードがnode-red-contrib-cloudantplusです。

右上のハンバーガーメニューからパレットの管理を選択して、ノードを追加からnode-red-contrib-cloudantplusを検索してノードを追加します。

データをインサート

試しに適当なデータをインサートしてみましょう。

以下のフローをコピーして、ハンバーガーメニューから読み込みをクリックしてコピーしたフローを貼り付けます。

[{"id":"89535a40cee0c240","type":"inject","z":"f3445c498ccb6a95","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":260,"wires":[["2421a34b2308d188"]]},{"id":"5da23496b052595c","type":"debug","z":"f3445c498ccb6a95","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":780,"y":260,"wires":[]},{"id":"ca8fef2229408611","type":"cloudantplus out","z":"f3445c498ccb6a95","name":"","cloudant":"","database":"helloworld","service":"_ext_","payonly":true,"operation":"insert","x":590,"y":260,"wires":[["5da23496b052595c"]]},{"id":"2421a34b2308d188","type":"function","z":"f3445c498ccb6a95","name":"","func":"var timestamp = msg.payload;\nmsg.payload = {\n    \"_id\": String(timestamp),\n    \"name\": \"Jhon\",\n    \"age\": 30\n}\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":400,"y":260,"wires":[["ca8fef2229408611"]]}]

cloudantのノードをダブルクリックしてノードの設定を開きます。

そして、サーバーの接続情報を入力します。

サーバーの接続情報は以下の内容を記入します。Hostnameがcloudantなのはdocker-compose.ymlのdepends_onで設定したCloudantのコンテナを指定しているためです。

Host: http://cloudant
Username: admin
Password: pass
Name: 接続情報を管理しやすい任意のもの(なくてもOK)

設定を終えたところでフローを実行します。

injectノードについているボタンをクリックして、右のデバッグ画面に結果が表示されれば成功です。

データベースが存在しない場合は、インサート時にデータベースが作成されます。

データをセレクト

続いて、データをセレクトしてみましょう。

以下のフローをコピーして、ハンバーガーメニューから読み込みをクリックしてコピーしたフローを貼り付けます。

[{"id":"a5dd90f7b794a074","type":"inject","z":"f3445c498ccb6a95","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":220,"y":320,"wires":[["b76b3de90f5e1fb1"]]},{"id":"b76b3de90f5e1fb1","type":"change","z":"f3445c498ccb6a95","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\"selector\":{\"name\":{\"$eq\":\"Jhon\"}},\"fields\":[\"name\",\"age\"]}","tot":"json"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":320,"wires":[["35330df7b7b88099"]]},{"id":"35330df7b7b88099","type":"cloudantplus in","z":"f3445c498ccb6a95","name":"","cloudant":"","database":"helloworld","service":"_ext_","search":"_query_","design":"","index":"","x":590,"y":320,"wires":[["3932555b2a80b1d1"]]},{"id":"3932555b2a80b1d1","type":"debug","z":"f3445c498ccb6a95","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":320,"wires":[]}]

Serverの接続情報は先程設定したものを選択できるようになるので選択します。

injectノードを実行して、Jsonで設定したクエリーの実行結果がデバッグ画面に表示されたら成功です。

表示されているWarningですが、検索に使用したカラム(今回だとname)にインデックスが張られてないことを示しています。

今回はデータの数が少ないので特に気にしなくてもいいですが、本格的に使うデータベースにはインデックスを貼ることでデータ検索を最適化できます。

まとめ

今回はDockerでIBM CloudのNode-RED環境をしてみました。

完全再現ではありませんが、これでCloudantのデータベースを使えるようになったので、IBM Cloudで環境構築する前のお試しにはなるかと思います。

Discussion