Bluemix CFアプリの水平分散クラスタを Dockerコンテナに置き換えて構成したメモ


この記事は、[Node.js Express4で Cloudant セッション・ストアの水平分散クラスタを構成する](http://qiita.com/MahoTakara/items/507dacf5a5dc81705d50)の続編で、Bluemix上のDockerコンテナをロードバランサー配下で水平分散クラスタで動作させる事を目的として、Bluemix CFアプリ を ローカル、Bluemix上シングル、Bluemix上マルチ・インスタンスで検証を進めたメモです。

## 目標とすること
Bluemix の DockerコンテナもCFランタイムと同様に、水平分散クラスタを構成して、クリックでインスタンスを増設する構成、いわゆるスケールアウトにより増強できる構成を組むことができます。　この場合の課題も、前述の[Node.js Express4で Cloudant セッション・ストアの水平分散クラスタを構成する](http://qiita.com/MahoTakara/items/507dacf5a5dc81705d50) と同じです。

![スクリーンショット 2017-07-13 20.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e90c0156-1d1e-1014-8804-672deee335e9.png "スクリーンショット 2017-07-13 20.07.11.png")

そこで、CFランタイムのアプリサーバーの代わりに、Dockerコンテナに置き換えて、水平分散クラスタ構成を組んでみます。アプリケーションは、CFランタイム用として作成したものに、Dockerfileを加えて、Dockerコンテナをビルドします。

![スクリーンショット 2017-07-13 20.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/42829/6cffd308-7d61-9b89-848d-7d6c90c9368f.png "スクリーンショット 2017-07-13 20.07.26.png")





## MacのDocker環境でコンテナとして実行

ここでは、記載しませんが、Bluemix CLI で Dockerコンテナのプラグインを動作させるためには、MacにDocker環境を導入して、動作させておく必要があります。

まずは、manifest.ymlと同じディレクトリに、Dockerfileの作成を作成します。


~~~file:Dockerfile
 1  FROM ubuntu
 2  RUN apt-get update
 3  RUN apt-get install curl -y
 4  RUN curl -sL https://deb.nodesource.com/setup_6.x | /bin/bash -
 5  RUN apt-get install nodejs -y
 6  ADD . /app
 7  ENV NODE_ENV production
 8  EXPOSE 3000
 9  CMD ["node", "/app/app.js"]
~~~

コンテナ化する前に、必要なソフトウェア・モジュールをインストールします。

~~~
npm install
~~~

次のコマンドを実行して、コンテナをビルドします。

~~~
docker build -t express-session .
~~~

ローカル環境で、Dockerコンテナとして、動作テストを実施します。

~~~
docker run -p 3000:3000 -t express-session
~~~

ブラウザで、http://localhost:3000/foo をアクセスすると、アクセスカウンターを表示され、リロードでカウンターが加算されます。
                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                    
## Bluemix Docker環境で、シングルのコンテナとして実行

### bxコマンドで、コンテナ環境のセットアップ

作業の前に、Bluemixへログインします。 ここからの作業は、決まりパターンなので、機械的に実行して、セットアップしていきます。

~~~
bx login  
~~~

コンテナ・レジストリへログインします。 ユーザーIDやパスワードを再度入力必要はなく、プラグインの初期化の様な処理です。

~~~
bx cr login  
~~~

Bluemix Docker プラグインを初期化します。 この時、前述の bx cr login が実行されていないと、このコマンドが失敗します。 

~~~
bx ic init
~~~

すでにネームスペースを取っていれば、namespace-get を実行します。　初回は、namespace-set を実行します。

~~~
bx ic namespace-set [my-space-name]
~~~
ネームスペース名を取得します。

~~~
bx ic namespace-get
~~~

### ローカルのコンテナイメージを Bluemix コンテナ・レジストリへ登録
コンテナのイメージをタグ付けします。

~~~
docker tag express-session registry.ng.bluemix.net/[your_name_space]/express-session
~~~

Bluemix のレジストリへ、登録します。

~~~
docker push registry.ng.bluemix.net/[your_name_space]/express-session
~~~


## Bluemix上でコンテナ実行

パブリックIPを取得して、コンテナを実行する際に、付与します。

~~~
bx ic ip-request
~~~


コンテナを起動します。 

~~~
bx ic run --name tkrX -m 128 -p [public_ip_address]:3000:3000 --env "CCS_BIND_SRV=Cloudant NoSQL DB-j9" registry.ng.bluemix.net/takara_node/express-session
~~~

上記を実行する際に、Cloudant のインスタンス名が必要になります。  インスタンス名を取得するには、次のコマンドを利用します。

~~~
bx cf services
~~~


## Bluemix Docker環境で、マルチ・インスタンスのコンテナとして実行

複数のコンテナのインスタンスを起動して、DNS名でサービスを提供するには、次のコマンドで実行します。 オプションの詳細は、参考資料(1)にあります。

~~~
imac:session-cloudant maho$ bx ic group-create --name tkrZ -m 128 -n tkr -d mybluemix.net --min 2 --max 3 --desired 2 -p 3000 --env "CCS_BIND_SRV=Cloudant NoSQL DB-j9" registry.ng.bluemix.net/takara_node/express-session
OK
グループ作成が要求されました。
グループ「tkrZ」 (ID: 2f480275-8c5d-4ce4-aa58-dfbc0927c6ca) が作成されました。
最小コンテナー・インスタンス数: 2
最大コンテナー・インスタンス数: 3
望ましいコンテナー・インスタンス数: 2
~~~


## まとめ

CFコンテナを Docker コンテナとして実行することは、手順が解っていれば簡単ですね。 




# 参考資料

(1) CLI reference for managing single and scalable containers in IBM Bluemix Container Service https://console.bluemix.net/docs/containers/container_cli_reference_cfic.html#container_cli_reference_cfic_deprecated