この記事は、Node.js Express4で Cloudant セッション・ストアの水平分散クラスタを構成するの続編で、Bluemix上のDockerコンテナをロードバランサー配下で水平分散クラスタで動作させる事を目的として、Bluemix CFアプリ を ローカル、Bluemix上シングル、Bluemix上マルチ・インスタンスで検証を進めたメモです。
目標とすること
Bluemix の DockerコンテナもCFランタイムと同様に、水平分散クラスタを構成して、クリックでインスタンスを増設する構成、いわゆるスケールアウトにより増強できる構成を組むことができます。 この場合の課題も、前述のNode.js Express4で Cloudant セッション・ストアの水平分散クラスタを構成する と同じです。
そこで、CFランタイムのアプリサーバーの代わりに、Dockerコンテナに置き換えて、水平分散クラスタ構成を組んでみます。アプリケーションは、CFランタイム用として作成したものに、Dockerfileを加えて、Dockerコンテナをビルドします。
MacのDocker環境でコンテナとして実行
ここでは、記載しませんが、Bluemix CLI で Dockerコンテナのプラグインを動作させるためには、MacにDocker環境を導入して、動作させておく必要があります。
まずは、manifest.ymlと同じディレクトリに、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