docker
Bluemix

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

More than 1 year has passed since last update.

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

目標とすること

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

スクリーンショット 2017-07-13 20.07.11.png

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

スクリーンショット 2017-07-13 20.07.26.png

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

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

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

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