Slackの様な Let's-Chat をBluemix で動作させたメモ 

Bluemix で Dockerコンテナを利用する事の利点とは、なんでしょうか？　もちろん、Docker のホスト基盤が、フルマネージで提供されるという利点もありますが、何と言っても、企業が提供する公式な実行イメージを含むコンテナ、10万件を超えるコミュニティーや企業が提供するフリーのコンテナが、すぐに利用出来る点だと思います。 これらのコンテナを組み合わせて、速攻でアプリが立ち上げられる点は、とても便利だと思います。

![スクリーンショット 2017-06-28 9.18.23.png](https://qiita-image-store.s3.amazonaws.com/0/42829/d1eec480-638f-7467-c873-51c05cf813ff.png)

今回は、取り上げませんが、CloudFoundy コンテナ用に開発したアプリを Docker コンテナ用に変更は簡単ですから、障壁なく活用を広げていけると思います。


## 今回、実現すること
[Let's Chat](https://sdelements.github.io/lets-chat/)という  Slack に良く似たアプリケーションを Bluemix コンテナサービス上で動作させます。 今回は、テスト用環境として、シングルコンテナ、HTTPS暗号化なし、IPアドレスとポート番号のじか打ちアクセス環境とします。　そして次回は、本番サービス環境として考えていきたいと思います。

![スクリーンショット 2017-06-28 9.33.40.png](https://qiita-image-store.s3.amazonaws.com/0/42829/5979dc99-4c93-e4b4-855f-7095005a5afb.png)



# 準備作業

当たり前すぎて、書くのもなんですが、最初にBluemix CLI にログインします。

~~~
$ bx login
API エンドポイント: https://api.ng.bluemix.net
~~~
コンテナのリポジトリ用ネームスペースを取得します。 環境変数化する方法もありますが、解りやすくするためにベタに書いていきます。実施する場合は、"takara_node" に当たる部分をご自身のネームスペース名に置き換えてくださいね。

~~~
$ bx ic namespace-get
takara_node
~~~
ここで、Bluemix CLI コマンド や IC プラグインを導入していない方は、[Bluemix CLI ホーム](https://clis.ng.bluemix.net/ui/home.html) から導入をお願いします。

コンテナ操作サブコマンドを初期化しておきます。

~~~
imac:lets-chat maho$ bx ic init
古い構成ファイルを削除中です...
open /Users/maho/.cf/config.json: no such file or directory
IBM Containers のクライアント証明書を生成中です...
クライアント証明書を /Users/maho/.ice/certs/ に格納中です...

クライアント証明書を /Users/maho/.ice/certs/containers-api.ng.bluemix.net/1bae5719-f9bf-4914-9d7c-67f8ba52f0c3 に格納中です...

OK
クライアント証明書が取得されました。

ローカルの Docker 構成を確認中です...
ご使用のシステムは IBM Containers API で認証されましたが、
これを IBM Containers レジストリーで認証するためにローカル Docker デーモンにアクセスすることが
できません。 クラウド上で IBM Containers を実行することはできますが、
イメージのプッシュおよびプルはできません。

IBM Containers と共に Docker CLI を使用するには、次の 2 つの方法から選択することができます。


オプション 1: このオプションでは、ローカル Docker ホストを管理するために Docker CLI を直接使用しながら、IBM Containers 上のコンテナーを管理するための「bluemix ic」を使用できます。
	この Cloud Foundry IBM Containers プラグインは、ローカル Docker 環境に影響を与えることなく使用してください。


	使用法の例:
	bluemix ic ps
	bluemix ic images

オプション 2: Docker CLI を直接使用します。 このシェルでは、これらの変数を設定することにより、ローカル Docker 環境をオーバーライドして IBM Containers に接続します。 以下のコマンドをコピーして貼り付けてください。
	注: このオプションでサポートされるのは、後ろに (Docker) が付く Docker コマンドのみです。 
 	export DOCKER_HOST=tcp://containers-api.ng.bluemix.net:8443
 	export DOCKER_CERT_PATH=/Users/maho/.ice/certs/containers-api.ng.bluemix.net/1bae5719-f9bf-4914-9d7c-67f8ba52f0c3
 	export DOCKER_TLS_VERIFY=1

	使用法の例:
	docker ps
	docker images

~~~
ためしに、Bluemix のコンテナのイメージをリストしてみましょう。

~~~
$ bx ic images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
registry.ng.bluemix.net/ibmliberty                    latest              162ff4d68d3e        5 weeks ago         303 MB
registry.ng.bluemix.net/ibmliberty                    javaee7             162ff4d68d3e        5 weeks ago         303 MB
registry.ng.bluemix.net/ibmliberty                    microProfile        b4d2655a3469        5 weeks ago         226 MB
registry.ng.bluemix.net/ibmliberty                    webProfile7         e200c1fd4471        5 weeks ago         264 MB
registry.ng.bluemix.net/ibmliberty                    webProfile6         298bd664e3fe        5 weeks ago         256 MB
~~~

# 既成コンテナの収集
ここでは、mongo のコンテナ、Let' Chat のコンテナを IBM Bluemix レジストリへ登録して、準備を進めます。

Docker Store の mongo コンテナ https://store.docker.com/images/mongo を Bluemix のレジストリへコピーします。 このとき、アドレスの takara_node 部分は、自身のネームスペース名と置き換えます。

~~~
$ bx ic cpi mongo registry.ng.bluemix.net/takara_node/mongo
~~~
Let's Chat コンテナを少し修正してビルドするために、次のDockerfile を作成します。

~~~file:Dockerfile
FROM sdelements/lets-chat:latest
CMD (sleep 60; npm start)
~~~
この Dockerfile のあるディレクトリで、次のコマンドを実行して、コンテナをビルドします。

~~~
$ bx ic build -t registry.ng.bluemix.net/takara_node/lets-chat .
~~~


# コンテナの実行
最初に mongo を起動して、Let's Chat を起動します。
**Mongoコンテナの起動**

~~~
$ bx ic run --name lc-mongo -p 27017 -m 128 registry.ng.bluemix.net/takara_node/mongo
~~~
**Let's Chatコンテナの起動**

~~~
$ bx ic run --name lets-chat --link lc-mongo:mongo -p 8080 -m 128 registry.ng.bluemix.net/takara_node/lets-chat
~~~

# パブリックIPアドレスの割り当て
ここまででは、まだ、パブリックIPアドレスと対応付けが無いために、インターネットからアクセスできません。そこで、次のコマンドで、パブリックIPアドレスをリクエストします。

~~~
$ bx ic ip-request
~~~
次のコマンドで、利用出来るパブリックIPをリストすることもできます。

~~~
$ bx ic ips
~~~
次のコマンドについて、IPアドレス部分を得られたパブリックIPアドレスに置き換えて、割り当てを実施します。

~~~
bx ic ip-bind 192.0.1.10 lets-chat
~~~

# Let's-chat へのアクセス
PC や スマホのブラウザから、次の様な画面が表示されれば、起動成功です。

![スクリーンショット 2017-06-28 1.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/42829/77c4a8b6-1b23-23ac-5ffd-26f99a79e2b6.png)


# コンテナの停止と削除
コンテナが増えるとお金も掛かるので、不要になったら消します。

停止

~~~
$ bx ic stop lets-chat lc-mongo
~~~
削除

~~~
$ bx ic rm lets-chat lc-mongo
~~~

# Docker-Compose を利用した一括起動法
ICサブコマンドの初期化を実施して、オプション２で表示される環境変数をexport からコピペして設定します。 

~~~
$ bx ic init
<中略>
export DOCKER_HOST=tcp://containers-api.ng.bluemix.net:8443[ENTERを押す]
export DOCKER_CERT_PATH=/Users/maho/.ice/certs/containers-api.ng.bluemix.net/1bae5719-f9bf-4914-9d7c-67f8ba52f0c3[ENTERを押す]
export DOCKER_TLS_VERIFY=1[ENTERを押す]
~~~

これで、自分の Mac環境のdockerコマンドが、Bluemix の docker と接続できる様になりました。 docker images や docker ps を叩いて確認すると良いでしょう。

次に、docker-compose.yml を作成します。 image のレジストリのネームスペース部分は、自分のネームスペース名に置き換えてくださいね。

~~~file:docker-compose.yml
app:
  image: registry.ng.bluemix.net/takara_node/lets-chat
  links:
    - mongo
  ports:
    - 8080:8080
    - 5222:5222

mongo:
  image: registry.ng.bluemix.net/takara_node/mongo
~~~
これのYAMLファイルのある場所で、次のコマンド実行すると、前提となる起動順を考慮して一括で起動してきます。

~~~
$ docker-compose up -d
Creating letschat_mongo_1
Creating letschat_app_1
~~~
こんな感じです。

~~~
$ docker ps
CONTAINER ID        IMAGE                                                       COMMAND             CREATED             STATUS              PORTS                          NAMES
4936e1a5-daf        registry.ng.bluemix.net/takara_node/lets-chat:latest        ""                  11 minutes ago      Running             5222/tcp, 8080/tcp             letschat_app_1
b1fab7fb-02f        registry.ng.bluemix.net/takara_node/mongo:latest            ""                  12 minutes ago      Running                                            letschat_mongo_1
~~~
Bluemix のダッシュボードの表示でもみれます。あとは前述の方法でパブリックIPをアサインすることで、外部からアクセスできる様になります。

![スクリーンショット 2017-06-28 10.32.06.png](https://qiita-image-store.s3.amazonaws.com/0/42829/75f5cf5c-e642-c118-b00e-0f7d208f23cc.png)


# まとめ
Bluemix のフルマネージドな実行環境を利用して、迅速にDockerコンテナ化された既成のマイクロサービスを組み合わせて、サービスが起動できる事が確認できました。 Dockerコンテナは、ローカルでも、仮想サーバーや物理サーバーで動作しますから、ニーズに合わせて配置でき、生産性を向上させるために役立つと思います。

次は、本番サービスを想定したスケーラブルな環境で実行してみたいと思います。

# 参考資料
* Running short-term tasks as single containers https://console.bluemix.net/docs/containers/container_single_ui.html#container_gettingstarted_tutorial