DockerでIBM CloudのNode-REDの開発環境を再現してみた
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