Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説 (1/3)


Node-REDは、ブラウザ上で機能単位であるノードを繋ぐ事で、非同期処理を開発する事ができる優れたツールです。このツールを使って本格的に開発するには、GitHubなどのコード・リポジトリと連携して、開発をチームで推進する事が必須となります。

Node-REDのバージョン0.18から、プレビューとして、プロジェクト管理やGitHubとの連携機能が実装されました。しかし (2018年3月10日現在) IBM Cloud CloudFoundry のボイラーテンプレートでは、この機能が無効化されており、 利用する事ができません。 また、筆者が、Node-REDのプロジェクト管理機能を有効化したコードのmanifest.yamlの作成して、ビルドパックも最新版を指定したデプロイを試みてみましたが、残念ながら期待する様に動作しませんでした。

そこで、Dockerコンテナとして、プロジェクト管理機能を有効化した最新版Node-REDをビルドして、ローカル環境で開発に利用して、Kubernetesクラスタ上で稼働させるまでを解説したいと思います。

* [Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説 (1/3)](https://qiita.com/MahoTakara/items/86c0d1072d1cd34187d5)
* [Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説 (2/3)](https://qiita.com/MahoTakara/items/605b1e32ddf22fb7b910)
* [Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説 (3/3)](https://qiita.com/MahoTakara/items/8cfa4d0be22277869084)
* [Node-REDが動作するコンテナをビルドして Kubernetes で実行するまでを解説 (番外編)](https://qiita.com/MahoTakara/items/2529c4a66519fb459e5d)

番外編で、IBM Cloud が提供する GitLabリポジトリとNode-REDの連携方法を補足していますので、GitLabでチーム開発を考えている方は、番外編もご覧ください。

## Cloud Foundryアプリの継続的開発(Continuous delivery)との違い

Cloud Foundry ボイラーテンプレートの「Node-RED Starter」を開始後に、そのNode-REDインスタンスで、継続的開発(Continuous delivery)を開始して、その中のGitにメンバーを登録すれば、各自のGitリポジトリに表示されるリンクのクリックによって以下の画面が表示される様になり、「View app」から複数の開発者が同じNode-REDのフローエディタにアクセスできる様になります。 

![スクリーンショット 2018-03-13 15.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ce027252-adec-628c-84e0-b5beca17ff22.png "スクリーンショット 2018-03-13 15.37.49.png")

この場合は、それぞれの開発者が、それぞれの開発環境に git clone して平行して開発するというスタイルではありません。 開発メンバーが、同じNode-REDのサーバーにアクセスする事になり、誰か一人がNode-REDフローエディタを操作すると、他のクライアントで変更を検知して再読み込みが必要となる状態になります。 

さらに、本質的な問題点として、Cloud Foundry ボイラーテンプレートの「Node-RED Starter」では、ノードを繋ぎ合わせて作ったフローは、一緒にデプロイされるCloudantのデータベースに格納されます。このため、Gitリポジトリには開発の成果物は登録されません。 そして、ツールチェーンのデプロイ実行のトリガーはGitリポジトリの更新をトリガーとしていますから、Node-REDの更新は、ツールチェーンとは関係ない処で動いている事になります。 つまり、Node-REDでツールチェーンが設定できたとしても、繋がらない、連携していない状態なのです。

今回、提案する方法は、Node-REDはローカルのファイルシステム上に、開発の成果物を書き込みます。 そして、add,commit,push という一連の作業でgitリポジトリへ成果物を保存します。 共同で働く開発者は、それぞれの環境でgit cloneして開発作業を実行して、再度、add,commit,pushでリポジトリを更新する作業スタイルになります。 もちろん、同時にコードが修正された場合は、修正箇所をマージするという作業が必要となる場合があります。


## コンテナだけ利用したいお急ぎな方へ

この記事は、Node-REDコンテナをビルドする方法を主に書いていますが、すぐにNode-REDコンテナを利用したい方は、以下のコマンドで Node-REDがローカルのDocker CE環境で、Node-REDが動作します。

```console
$ docker run -d --name nr -p 1880:1880 maho/node-red:1.0
```

起動後に、ブラウザから、http://localhost:1880/ をアクセスする事で、Node-REDの利用が開始できます。 Node-REDのユーザーIDは admin, パスワードは password です。



## ビルド-登録-実行に必要な条件


### 必要なアカウント

以下のアカウントは、次のURLから全て無料で利用できます。

* GitHub のアカウント https://github.com/
* DockerHub のアカウント https://hub.docker.com/
* IBM Cloud のアカウント http://console.ng.bluemix.net/

IBM Cloudのアカウントが必要になるのは、第3回目になりますので、今回は上から２つだけのアカウントで良いです。


### PC環境でのソフトウェア環境

下記のソフトウェアが、MacOSやWindowsOSにインストールされている必要があります。

* Docker-CE  https://www.docker.com/community-edition
* gitコマンド https://git-scm.com/downloads
* IBM Cloud のクライアント環境 https://console.bluemix.net/docs/cli/index.html
* kubectl のコマンド実行環境 https://kubernetes.io/docs/tasks/tools/install-kubectl/

1回目は、上から二つ目までが必須になります。3回目で残り二つが必要になります。

上記が大変という場合は、vagrant + VirtualBox + git をインストールして、https://github.com/takara9/bluemix-dev Vagrantfileを git clone して、vagrant up するだけで、PC上の仮想サーバーとして環境の作成ができます。


## プロジェクト管理機能などの有効化

Node-REDは、IBMで開発したソフトウェアですが、オープンソース化され、広く利用される様になっています。このソースコードは、https://github.com/node-red/ に公開されています。

このNode-REDの公式のコードを自分のGitHubにフォーク（分岐）して、プロジェクト管理機能を有効化、有用なノードのパッケージを追加、認証機能を有効化など、変更を加えて、GitHubへコミット、プッシュして保存します。

ここで、最終的にパブリック・クラウド上のKubernetesで動作する事を目指しますので、開発したフローが外部から参照されない様に、ユーザー認証機能を有効化しておきます。


### 本家からのフォーク

https://github.com/node-red/node-red のページを開いて、ブラウザ画面の右上のある 「Fork」 のアイコンをクリックして、自分のGitHubのリポジトリにコピー（フォークを作成）します。 この際、GitHubのアカウントにログイン済みである必要があります。事前にGitHubにアカウントを作成してログインしてから、「Fork」を実行します。

![スクリーンショット 2018-03-10 11.10.45.png](https://qiita-image-store.s3.amazonaws.com/0/42829/51ab670d-d5aa-042c-b0ca-a4bf6aba6da6.png "スクリーンショット 2018-03-10 11.10.45.png")


Forkが成功したら、自分のアカウントのGitHubのリポジトリに、node-redのコードのコピーが作成されています。

次の画面コピーの様に、node-red/node-red だった所が、筆者のリポジトリ takara9/node-red に変わっているのが解ります。

![スクリーンショット 2018-03-10 11.15.39.png](https://qiita-image-store.s3.amazonaws.com/0/42829/f8be6e90-2421-f6d6-0688-8725cd108bcb.png "スクリーンショット 2018-03-10 11.15.39.png")

### クローンと修正

ここ迄の操作で、自分専用に修正できるコードになります。　早速、自分のPC環境にクローン（複製）して修正を加えて、コミットとプッシュを進めていきます。

~~~
git clone https://github.com/takara9/node-red
~~~


修正するファイルは、package.json と settings.js の二つのファイルです。


#### packege.jsonの修正箇所
コンテナで実行する際のディレクトリの変更、そして、ノードの追加を設定します。

修正する場所は、13行目の"start"項目の値です。 コンテナ内のディレクトリに変更します。

~~~packege.json
    11	    "main": "red/red.js",
    12	    "scripts": {
    13		"start": "node red.js --settings /node-red/settings.js --userDir /node-red-user -v",
    14	        "test": "grunt",
    15	        "build": "grunt build"
    16	    },
~~~

WatsonAPI、MySQL接続、Cloudand接続など、有用なノードが利用できる様に79行目以降を追加します。
                                                
~~~packege.json
    35	    "dependencies": {
    36	        "basic-auth": "2.0.0",
    37	        "bcryptjs": "2.4.3",
...
    79         "mongodb": "~1.4.x",
    80	        "nano": "6.2.x",
    81	        "bcrypt": "1.0.2",
    82	        "cfenv": "~1.0.0",
    83	        "http-shutdown": "1.2.0",
    84	        "node-red-bluemix-nodes": "1.x",
    85	        "node-red-node-watson": "0.x",
    86	        "node-red-node-openwhisk": "0.x",
    87	        "node-red-node-cf-cloudant": "0.x",
    88	        "node-red-contrib-scx-ibmiotapp": "0.x",
    89	        "node-red-contrib-ibm-wiotp-device-ops": "0.x",
    90	        "node-red-contrib-iot-virtual-device": "0.x",
    91         "node-red-node-mysql": "0.0.16"
    92	    },
~~~    

    
#### settings.jsの修正箇所

このファイルでは、HTTPSの有効化、ディレクトリ変更、認証、プロジェクト管理機能の有効化の4点を修正します。

HTTPSの有効化は、settings.jsのコメントに従って修正します。

~~~settings.js
    17  // The `https` setting requires the `fs` module. Uncomment the following
    18  // to make it available:
    19  var fs = require("fs");
~~~    

        
ユーザーデータを格納するディレクトリをコンテナのルート・ディレクトに移動します。以下の例では、79行目、83行目が修正箇所です。

~~~settings.js
    77	    // By default, all user data is stored in the Node-RED install directory. To
    78	    // use a different location, the following property can be used
    79	    userDir: '/node-red-user/',
    80	
    81	    // Node-RED scans the `nodes` directory in the install directory to find nodes.
    82	    // The following property can be used to specify an additional directory to scan.
    83	    nodesDir: '/node-red-user/nodes',
~~~


認証を有効化します。 117行目から124行目までをコメントを外して、有効にします。 このパスワードは、"password" です。 ハッシュの作り方は、http://nodered.org/docs/security.html にあります。


~~~settings.js
   113	    // Securing Node-RED
   114	    // -----------------
   115	    // To password protect the Node-RED editor and admin API, the following
   116	    // property can be used. See http://nodered.org/docs/security.html for details.
   117	    adminAuth: {
   118		type: "credentials",
   119	          users: [{
   120	            username: "admin",
   121	            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
   122	            permissions: "*"
   123	        }]
   124	    },
~~~

最後に、Node-RED v1.8から実装された プロジェクト管理機能とGitHubとの連携機能の有効化です。235行目に、","を加えて、236行目から５行を追加します。

~~~settings.js
   234	        }
   235	    },
   236	    editorTheme: {
   237	       projects: {
   238	           enabled: true
   239	       }
   240	   }
   241	}
~~~


### 修正結果をGitHubへ保存

修正したコードを変更対象にします。

~~~
git add packege.json settings.js
~~~

変更を確定します。

~~~
git commit -m "update for container"
~~~

変更をマスターに登録します。

~~~
git push
~~~


以上で、Node-REDのプロジェクト管理付きのコンテナを作る材料ができました。



## Dockerコンテナのビルド

コンテナをビルドするための Dockerfile を作成します。このDockerfileの内容を以下に解説します。

* FROM の aplineは、小型軽量なLinuxのディストリビューション https://alpinelinux.org/ です。 小さく起動が早いコンテナを作る場合に、良く利用されるディストリビューションです。 3.7は最新リリースのバージョンです。
* RUN apk updateから始まる行は、apline のパッケージマネージャーです。node-redを実行するために必要なソフトウェアのパッケージを導入します。 パッケージを追加したい場合は、https://pkgs.alpinelinux.org/packages から入手できます。
* RUN git から始まる行は、前述の修正済みのNode-REDのリポジトリです。 コンテナのルート・ディレクトリに、/node-red として複製を作成します。
* RUN cd から始まるで行は、Node-REDに必要なNode.jsのモジュールを追加して、ビルドします。この行の "--build-from-source=bcrypt" は、bcryptがセグメンテーション・フォルトで落ちるのを防止するために、再ビルドします。 詳しい説明は、https://github.com/kelektiv/node.bcrypt.js/issues/528 にあります。
* RUN mkdir から始まる行は、フローや状態などのユーザーの情報を保存するためのディレクトリ /node-red-user を作成します。
* WORKDIRは、コンテナ実行時の実行用ディレクトリを指定します。
* EXPOSE 1880 は、Node-REDのウェブページのポートです。 MQTTや他の通信用ポートを開く場合には、EXPOSE を追加します。
* ENVは、環境変数の設定です。
* CMDは、コンテナ起動時に、最初に実行されるコマンドになります。 ここでは、コンテナ起動時に、WORKDIRのディレクトリで、npm start が実行される事になります。


~~~Dockerfile
FROM alpine:3.7

RUN apk update \
    && apk add nodejs git python make g++

RUN git clone https://github.com/takara9/node-red /node-red
RUN cd /node-red; npm install --build-from-source=bcrypt; npm run build
RUN mkdir /node-red-user


WORKDIR /node-red
EXPOSE 1880
ENV FLOWS=flows.json


CMD ["npm", "start"]
~~~


Dockerfileを置いたディレクトリで、次のコマンドを実行して、コンテナをビルドします。

```console
docker build --tag node-red:1.0 .
```


ビルドを実行すると、最初に alpine のイメージが DockerHubからダウンロードされ、alpineのコンテナ上で、Node-REDがビルドされます。

```console
$ docker build --tag node-red:1.0 .
Sending build context to Docker daemon  472.9MB
Step 1/9 : FROM alpine:3.7
3.7: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:7b848083f93822dd21b0a2f14a110bd99f6efb4b838d499df6d04a49d0debf8b
Status: Downloaded newer image for alpine:3.7
 ---> 3fd9065eaf02
Step 2/9 : RUN apk update     && apk add nodejs git python make g++
 ---> Running in 6baa16e1ad02
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
v3.7.0-111-gb96041de80 [http://dl-cdn.alpinelinux.org/alpine/v3.7/main]
v3.7.0-117-g9584b2309e [http://dl-cdn.alpinelinux.org/alpine/v3.7/community]
OK: 9048 distinct packages available
(1/40) Upgrading musl (1.1.18-r2 -> 1.1.18-r3)
(2/40) Installing libgcc (6.4.0-r5)

...

Step 9/9 : CMD ["npm", "start"]
 ---> Running in 384c4fec9497
Removing intermediate container 384c4fec9497
 ---> 5b1c339d916f
Successfully built 5b1c339d916f
Successfully tagged node-red:1.0
```

新たにDockerイメージが作られているのが、`docker images`を実行する事で解ります。

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node-red            1.0                 5b1c339d916f        5 minutes ago       542MB
alpine              3.7                 3fd9065eaf02        8 weeks ago         4.15MB
```



## Node-REDコンテナの実行とテスト

さぁ、いよいよ、最新版、プロジェクト管理機能の加わった Node-REDのコンテナを次のコマンドで実行します。

```console
docker run -d -p 1880:1880 --name nr node-red:1.0
```

* run は、新規のコンテナの実行を開始します。 もしも、--name で指定されたコンテナ名が既に存在すると、コマンドは失敗します。その場合は、`docker kill nr`としてコンテナを停止して、`docker rm nr` としてコンテナを削除します。
* `-d` はバックグランドで実行することを意味します。 バックグランドで出力されるメッセージを参照するには、`docker logs nr` とする事で、ログを表示してくれます。
* `-p` は、コンテナ内部でEXPOSEするポート番号と外部へ公開するポート番号です。
* `--name nr` はコンテナの名前です。 省略すると、適当な名前が付与され、`docker ps` で参照することができます。
* `node-red:1.0` は、先にビルドしたコンテナのイメージ名とタグです。 


```console
$ docker run -d -p 1880:1880 --name nr node-red:1.0
121d99d36132a5d8d20586160ade06e8e00cb03c15a4f1d989b2422db7db64b7

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
121d99d36132        node-red:1.0        "npm start"         27 seconds ago      Up 1 second         0.0.0.0:1880->1880/tcp   nr
```


これで、http://localhost:1880/ でNode-REDの画面にアクセスできます。 ログイン画面が表示されるので、ユーザーID: admin、パスワード: password でログインします。

![スクリーンショット 2018-03-10 14.18.58.png](https://qiita-image-store.s3.amazonaws.com/0/42829/f8f29262-6a9c-f15b-ff47-e1c37526eded.png "スクリーンショット 2018-03-10 14.18.58.png")


ログインに成功すると、プロジェクト管理機能を紹介する画面が現れます。

![スクリーンショット 2018-03-10 14.19.15.png](https://qiita-image-store.s3.amazonaws.com/0/42829/06799da1-516b-e171-696e-c64910557bff.png "スクリーンショット 2018-03-10 14.19.15.png")




## Node-RED プロジェクト管理機能

新たに加わったプロジェクト管理機能は、https://nodered.org/docs/user-guide/projects/ に設定方法と利用方法の解説があります。 settings.jsの設定は完了していますから、Node-REDから利用できます。


![スクリーンショット 2018-03-10 14.29.29.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ae7796a0-62f0-e950-5391-bcf557538cb9.png "スクリーンショット 2018-03-10 14.29.29.png")

### Node-REDプロジェクトの作成

「Not Right Now」 をクリックして、プロジェクト作成をキャンセルしても良いのですが、動きを一通り見て見ます。

ユーザー名とメールアドレスをセットします。これは git configの項目としてセットされます。
![スクリーンショット 2018-03-10 14.29.48.png](https://qiita-image-store.s3.amazonaws.com/0/42829/56755deb-16d4-d389-9276-01add694c15d.png "スクリーンショット 2018-03-10 14.29.48.png")


次にプロジェクト名を設定します。
![スクリーンショット 2018-03-10 14.30.09.png](https://qiita-image-store.s3.amazonaws.com/0/42829/891e7960-65ca-b717-4108-1d66df225c39.png "スクリーンショット 2018-03-10 14.30.09.png")


Flowファイルの名前は、デフォルトを利用します。
![スクリーンショット 2018-03-10 14.30.20.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e472f549-ae0f-8357-7d2d-f07c4e81d999.png "スクリーンショット 2018-03-10 14.30.20.png")


暗号化機能は利用しないで、簡単に利用することを行います。
![スクリーンショット 2018-03-10 14.30.30.png](https://qiita-image-store.s3.amazonaws.com/0/42829/efd36bb8-c1c7-7c87-6270-8f71c1d4350e.png "スクリーンショット 2018-03-10 14.30.30.png")


完了画面です。

![スクリーンショット 2018-03-10 14.30.41.png](https://qiita-image-store.s3.amazonaws.com/0/42829/2ab4ef80-34d9-f6a8-db59-c0feb230beb9.png "スクリーンショット 2018-03-10 14.30.41.png")



### Node-RED用のGitHubのリポジトリの作成

Node-REDのプロジェクトに登録する前に、GitHubのリポジトリを作成します。

自分のGitHubのリポジトリ画面で、緑の New ボタンをクリックして、リポジトリを作成します。

![スクリーンショット 2018-03-10 14.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/42829/05aa5ce3-9cb0-cc86-bd5f-f0d181c67191.png "スクリーンショット 2018-03-10 14.34.31.png")

ここでは、node-red-first-projというリポジトリの名前にします。 Create repository をクリックして作成を実行します。　

![スクリーンショット 2018-03-10 14.35.10.png](https://qiita-image-store.s3.amazonaws.com/0/42829/a52ec87d-b973-2eab-d07f-566e695b7fc1.png "スクリーンショット 2018-03-10 14.35.10.png")

作成が完了すると、次のような画面が出ます。 これで、GitHubのリポジトリの準備は完了です。

![スクリーンショット 2018-03-10 14.41.00.png](https://qiita-image-store.s3.amazonaws.com/0/42829/144ae076-c552-eeec-db82-daf7e024c7df.png "スクリーンショット 2018-03-10 14.41.00.png")



### Node-REDプロジェクトへのリモートリポジトリの登録

プレビュー版のためか、少し操作が分かり難いので、ステップ・バイ・ステップで追って行きます。

簡単なフローを作って、GitHubへ書き込みます。

![スクリーンショット 2018-03-10 15.38.47.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e7d9d506-3798-8c21-3bbb-be07e1219827.png "スクリーンショット 2018-03-10 15.38.47.png")

次は、デプロイされた状態で動作が確認されている状態です。

![スクリーンショット 2018-03-10 15.39.02.png](https://qiita-image-store.s3.amazonaws.com/0/42829/31f75d85-4267-0742-12a6-609856a364cb.png "スクリーンショット 2018-03-10 15.39.02.png")

ヒストリーのタブをクリックして、Local files の　行の右端 「+all」をクリックします。　これでリモート・リポジトリへ送り込む対象となります。


![スクリーンショット 2018-03-10 16.11.27.png](https://qiita-image-store.s3.amazonaws.com/0/42829/47fb243e-745b-1047-e69a-50569d997c3d.png "スクリーンショット 2018-03-10 16.11.27.png")


flow.jsonが、Chages to commit のボックスへ移動します。

![スクリーンショット 2018-03-10 16.11.54.png](https://qiita-image-store.s3.amazonaws.com/0/42829/3abde806-19f3-257c-831d-6cb02d70d188.png "スクリーンショット 2018-03-10 16.11.54.png")


次の 「commit」をクリックして、コミットメッセージを書き込みます。

![スクリーンショット 2018-03-10 16.12.26.png](https://qiita-image-store.s3.amazonaws.com/0/42829/9b35bf61-9a0f-5651-45be-8cfcafd137b1.png "スクリーンショット 2018-03-10 16.12.26.png")


次は、コミットしたファイルをリモートにプッシュします。 このためには、更新マークをクリックして プッシュ&プルのアイコンを表示させます。

![スクリーンショット 2018-03-10 16.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/42829/41ea92e3-c3d5-8f43-1f15-b4df57ff38fb.png "スクリーンショット 2018-03-10 16.12.56.png")


Branch master の 右横 「↑↓」のアイコンをクリックして、origin/masterをインプットして、

![スクリーンショット 2018-03-10 16.13.20.png](https://qiita-image-store.s3.amazonaws.com/0/42829/3dfb6a2c-deb4-433e-06fa-3effccddde42.png "スクリーンショット 2018-03-10 16.13.20.png")


「↑Push」 をクリックして、リモートリポジトリのmasterブランチへ送信します。

![スクリーンショット 2018-03-10 16.13.40.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6a5a7e21-8001-292e-64c3-3364519af87e.png "スクリーンショット 2018-03-10 16.13.40.png")


リポジトリのユーザー名とパスワードをインプットするポップアップが開きますので、GitHubのユーザーIDとパスワードをインプットします。

![スクリーンショット 2018-03-10 15.47.01.png](https://qiita-image-store.s3.amazonaws.com/0/42829/85eeaf5c-8761-c1f1-95c6-b022d9808ba6.png "スクリーンショット 2018-03-10 15.47.01.png")

これで、リモートリポジトリへ書き込みが完了しました。

![スクリーンショット 2018-03-10 16.13.58.png](https://qiita-image-store.s3.amazonaws.com/0/42829/84838932-c7ff-4cae-0683-2eafeb9664c3.png "スクリーンショット 2018-03-10 16.13.58.png")


GitHubのリポジトリで確認すると、次の様に更新されていることが確認できます。

![スクリーンショット 2018-03-10 15.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/42829/86a223f3-e6d0-8ad3-ff17-7f571e18dbdd.png "スクリーンショット 2018-03-10 15.47.53.png")


## GitHubからクローンしてプロジェクトを開く方法

Node-RED v0.1.8.4のプロジェクト管理機能は、まだリリースされたばかりで、プレビュー扱いです。そのため、少し動作が適切でないこともありますが、使えるものは、使っていけば良いと思います。ここでは、既にGitHubに登録されたNode-REDのリポジトリをクローンして利用する方法をみていきます。

メニューから、一旦、適当にプロジェクト情報を設定します。本来ならば、Openでリポジトリからプロジェクトを開くとなるはずですが、現在、Newしか選べないので、New を開いて適当に進めます。

![スクリーンショット 2018-03-10 16.20.07.png](https://qiita-image-store.s3.amazonaws.com/0/42829/0db78fc0-9904-12c1-4228-2a094298200d.png "スクリーンショット 2018-03-10 16.20.07.png")

そして、次のOpenを選んで、リポジトリからプロジェクトを作ります。

![スクリーンショット 2018-03-10 16.21.21.png](https://qiita-image-store.s3.amazonaws.com/0/42829/ad465481-8b58-4ac4-dbc2-4155ad4aa91d.png "スクリーンショット 2018-03-10 16.21.21.png")

プロジェクト名をインプットして、リモートリポジトリのURL、GitHubのユーザー名とパスワードをインプットして、「Clone Project」をクリックします。 

![スクリーンショット 2018-03-10 16.22.51.png](https://qiita-image-store.s3.amazonaws.com/0/42829/83b35ea7-a064-5485-4a71-fe1d4f2cb44d.png "スクリーンショット 2018-03-10 16.22.51.png")

リポジトリからのダウンロードが成功すると、次の様にフロー・エディタの状態が復元されます。

![スクリーンショット 2018-03-10 16.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/42829/296cf387-b2b7-0e66-b9ac-b3600088310d.png "スクリーンショット 2018-03-10 16.23.06.png")



## コンテナのDockerHubへの登録

Node-REDの機能ではなくて、Dockerの機能になりますが、Dockerコマンドを利用して、DockerHubのリポジトリに、ビルドしたコンテナを登録します。 これにより、今回ビルドしたNode-REDが動作するコンテナを配布して、プロジェクトのメンバーで、同じ環境を利用できる様になります。

ビルドしたコンテナを登録する手順は、以下の３ステップです。
* 登録するコンテナを決めます。 ここでは、node-red:1.0 を登録
* DockerHubのアカウントで、ログイン
* タグを付けて、DockerHubへプッシュ

### 登録するコンテナの決定

docker images でイメージのリストを表示します。

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node-red            1.0                 292eab381af8        3 hours ago         542MB
alpine              3.7                 3fd9065eaf02        8 weeks ago         4.15MB
```

### DockerHubにログインします。
事前に作成したDockerHubのユーザーIDとパスワードを利用します。

```console
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (maho): maho
Password: 
Login Succeeded
```

### DockerHubにイメージをアップロード

最初にタグを付与します。 タグのつけ方は、`docker tag ローカルのリポジトリ名；タグ リモートのリポジトリ名:タグ` になります。
タグを付与したら、リモートリポジトリ:タグ をパラメータにして、プッシュします。

```console
$ docker tag node-red:1.0 maho/node-red:1.0
$ docker push maho/node-red:1.0
The push refers to repository [docker.io/maho/node-red]
f6773e4960e6: Pushed 
00d4bd797431: Pushed 
4b74b14e5f43: Pushed 
04a4ca457f5b: Pushed 
cd7100a72410: Mounted from library/alpine 
1.0: digest: sha256:07cfbaa86f5a24155433c7b1b8dc8309cc3858538aa874b40a7511eb814a4116 size: 1372
```

このイメージのDockerHubのURLは、https://hub.docker.com/r/maho/node-red/ になります。

![スクリーンショット 2018-03-10 20.20.23.png](https://qiita-image-store.s3.amazonaws.com/0/42829/35b7af44-581e-e7cb-231b-7de3e08f60cc.png "スクリーンショット 2018-03-10 20.20.23.png")

このコンテナのイメージは、次のコマンドでローカルに落とすことができます。

~~~
docker pull maho/node-red
~~~

そして、次のコマンドで、コンテナとして実行でき、http://localhost:1880/ で、Node-REDを利用できます。

~~~
docker run -d -p 1880:1880 --name nr node-red:1.0
~~~


## 開発したNode-REDのコンテナを保存、リポジトリで共有する方法

前述のプロジェクト管理機能では、GitHubのリポジトリに登録する方法を紹介しましたが、実行中のコンテナを保存して、プロジェクトメンバーでコンテナ・イメージとして共有することができます。例えば、以下の様な開発途上の状態で、コンテナのイメージとして保存することができます。　それでは、コンテナをイメージとして保存する方法を見て行きます。

![スクリーンショット 2018-03-10 20.28.22.png](https://qiita-image-store.s3.amazonaws.com/0/42829/5577b3a1-73c0-c027-f07f-7c0259487408.png "スクリーンショット 2018-03-10 20.28.22.png")


```console
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
1384737ee111        node-red:1.0        "npm start"         4 hours ago         Up 4 hours          0.0.0.0:1880->1880/tcp   nr
```

コンテナを名前を指定して一時停止します。

```console
$ docker stop nr
```

コンテナに、新しいイメージ名：タグ名を指定して、コミットします。

```console
$ docker commit nr node-red-tkr-1:1.0
sha256:3bc7ddb719415c5da5311308e3a964266598960a29279376a104446591953181
```

この結果、以下の様に、リポジトリに、コンテナが保存された事がわかります。

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
node-red-tkr-1      1.0                 3bc7ddb71941        2 minutes ago       542MB
node-red            1.0                 292eab381af8        5 hours ago         542MB
maho/node-red       1.0                 292eab381af8        5 hours ago         542MB
alpine              3.7                 3fd9065eaf02        8 weeks ago         4.15MB
```

これを先ほどと同じ様に、タグを付与して、リモートリポジトリへ、プッシュします。 もりろん、`docker login` は必須です。

```console
$ docker tag node-red-tkr-1:1.0 maho/node-red-tkr-1:1.0
$ docker push maho/node-red-tkr-1:1.0
The push refers to repository [docker.io/maho/node-red-tkr-1]
177b73fad7c8: Pushed 
f6773e4960e6: Mounted from maho/node-red 
00d4bd797431: Mounted from maho/node-red 
4b74b14e5f43: Mounted from maho/node-red 
04a4ca457f5b: Mounted from maho/node-red 
cd7100a72410: Mounted from maho/node-red 
1.0: digest: sha256:0b2b01ff4f80ba7347c37d7fb4f984981b83e1f8a452c0f53f60d03430072839 size: 1581
```


この結果では、リポジトリには、以下の様に登録されます。

![スクリーンショット 2018-03-10 20.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/42829/a3dac82b-0a07-6269-3f04-2539caaf1783.png "スクリーンショット 2018-03-10 20.43.03.png")


## 開発途上のNode-REDコンテナをプルして再実行


下記の様に、コンテナ、および、イメージが無い状態から、DockerHUB コンテナ・リポジトリから、復元します。

```console
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

コンテナイメージを `docker pull リモートリポジトリ名` しておき、`docker run オプション` で実行します。 いきなり `docker run オプション` でも実行できます。


```console
$ docker pull maho/node-red-tkr-1:1.0
1.0: Pulling from maho/node-red-tkr-1
ff3a5c916c92: Pull complete 
f05316bf5ac0: Pull complete 
b82e48d69a34: Pull complete 
1db25dc4e6d5: Pull complete 
ac889504a6a9: Pull complete 
9efccc57c209: Pull complete 
Digest: sha256:0b2b01ff4f80ba7347c37d7fb4f984981b83e1f8a452c0f53f60d03430072839
Status: Downloaded newer image for maho/node-red-tkr-1:1.0

$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
maho/node-red-tkr-1   1.0                 3bc7ddb71941        13 minutes ago      542MB

$ docker run -d -p 1880:1880 --name nr maho/node-red-tkr-1:1.0
70e87e050bf69f55b900c0261053486c1eb5f37a549b04a8078f8c25c4e8257f
```


復元したフロー・エディタ画面は以下になります。

![スクリーンショット 2018-03-10 20.49.56.png](https://qiita-image-store.s3.amazonaws.com/0/42829/0639f6a3-f496-ebe5-5274-726c4e0870b3.png "スクリーンショット 2018-03-10 20.49.56.png")


---

# まとめ (1/3)

Node-RED v0.18のソースコードを フォークして、プロジェクト管理機能を有効化して、修正コードを再び GitHubへ登録して、コンテナをビルド、Node-REDをローカル環境で実行しました。 少し動作に問題はあるものの、Node-REDのプロジェクト管理機能を使って GitHubからクローン、コミット＆プッシュができることを確認しました。 そして、実行中のコンテナを停止させて、DockerHubへ登録する。そして、再びDockerHubからプルして、再実行できる事を確認しました。
IBM Cloud の CloudFoundry アプリとしてだけではなく、Dockerコンテナ上で 最新のNode-REDが利用できる事が確認できたと思います。次回は、Node-REDコンテナとIBM Cloudサービスとの連携、他のコンテナとの連携、さらに、Kubernetes上で利用できる事を確認していきます。

---

# おまけ Dockerコマンドの利用例

以下のnrは、コンテナの名前で、`docker run -d --name コンテナ名 イメージ名：タグ ` として --name で付与するコンテナを一意に識別するための名前です。

* ログの表示 `docker logs nr`
* コンテナの停止 `docker kill nr`
* コンテナの削除 `docker rm nr`
* コンテナの一括削除 `docker rm $(docker ps -a |awk 'NR>1 {print $1}')`
* イメージの一括削除 `docker rmi --force $(docker images |awk 'NR>1 {print $3}')`