MacのDockerコンテナで開発したアプリを Bluemix で公開するまでの話し

# 注意 
Bluemix の IBM コンテナ・サービス(bx ic) のサービスは終了しました。 コンテナ・クラスタ・サービス(bx cs)をご利用ください。
この記事のKubernetes版を書きましたので、「[Kubernetesクラスタ Liteプラン(無料)へ自作アプリをデプロイ](http://qiita.com/MahoTakara/items/4a22ff10baae720b030e) 」を参照願います。



## 概要
Mac や Windows PC などで開発したアプリを Bluemix の Dockerコンテナの実行環境で、インターネット上に公開するまでの道筋を確認したメモです。

![スクリーンショット 2017-06-27 10.41.15.png](https://qiita-image-store.s3.amazonaws.com/0/42829/fa2eed2f-8fb4-3bae-d356-66a6ee4fd1f8.png)

サンプルとして、Node.js の Express フレームワークを利用したアプリを Mac 上で開発して、Bluemix で公開するまでのストーリを進めていきます。


## Mac 開発環境の整備
最初に、ノートPCで、Node.js のアプリを開発するための環境、Docker コンテナサービスを実行する環境、Bluemix CLI を実行する環境を整備します。 ここでは本題では無いので、資料のリンク先のご紹介にとどめます。

* ndenv Node.js https://github.com/riywo/ndenv
* express http://expressjs.com/ja/starter/installing.html
* Docker https://docs.docker.com/docker-for-mac/install/
* git xcode https://itunes.apple.com/jp/app/xcode/id497799835?mt=12
* Atom Editor https://atom.io/
* Bluemix CLI  https://clis.ng.bluemix.net/ui/home.html
* Bluemix プラグイン https://console.bluemix.net/docs/containers/container_cli_cfic.html
* Bluemix プラグインレジストリ https://clis.ng.bluemix.net/ui/repository.html#bluemix-plugins


## Macでアプリを開発
Macのターミナルを起動して、開発用のディレクトリを作成して、移動します。

~~~
imac:~ maho$ mkdir docker
imac:~ maho$ cd docker
~~~
express コードジェネレータで、アプリの雛形を生成します。

~~~
imac:docker maho$ express --view=jade --css stylus myapp1

   create : myapp1
   create : myapp1/package.json
   create : myapp1/app.js
   create : myapp1/public
   create : myapp1/views
   create : myapp1/views/index.jade
   create : myapp1/views/layout.jade
   create : myapp1/views/error.jade
   create : myapp1/routes
   create : myapp1/routes/index.js
   create : myapp1/routes/users.js
   create : myapp1/bin
   create : myapp1/bin/www
   create : myapp1/public/javascripts
   create : myapp1/public/images
   create : myapp1/public/stylesheets
   create : myapp1/public/stylesheets/style.styl

   install dependencies:
     $ cd myapp1 && npm install

   run the app:
     $ DEBUG=myapp1:* npm start
~~~
Mac のローカル環境で、アプリ編集して、前提パッケージをインストールして、テスト実行します。

~~~
imac:docker maho$ cd myapp1/
imac:myapp1 maho$ npm install 
<--- 中略 --->
imac:myapp1 maho$ npm start

> myapp1@0.0.0 start /Users/maho/docker/myapp1
> node ./bin/www
~~~
テストが確認できたら、コンテナ化していきます。


## アプリのコンテナ化
最初にDockerコンテナのベースイメージを決めます。 CloudFoundry のコンテナのベースは、Ubuntu でしたので、Docker コンテナも合わせておきたいと思います。 Macのdockerコマンドで、Ubuntu のコンテナ・イメージを取り込みます。 ベースイメージを探す先は、Docker Store がお勧めです。

~~~
imac:docker maho$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
75c416ea735c: Pull complete 
c6ff40b6d658: Pull complete 
a7050fc1f338: Pull complete 
f0ffb5cf6ba9: Pull complete 
be232718519c: Pull complete 
Digest: sha256:a0ee7647e24c8494f1cf6b94f1a3cd127f423268293c25d924fbe18fd82db5a4
Status: Downloaded newer image for ubuntu:latest
~~~
取り込んだらイメージのサイズなど確認しておきます。

~~~
imac:docker maho$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              d355ed3537e9        5 days ago          119 MB
~~~


### Dockerfile の作成
このDockerfile の中で、アプリの実行に必要なソフトウェアのインストール作業を記述します。 ファイルの記述内容について、解説しておきたいと思います。

~~~file:Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install curl -y
RUN curl -sL https://deb.nodesource.com/setup_6.x | /bin/bash -
RUN apt-get install nodejs -y
ADD ./myapp1 /app
ENV NODE_ENV production
EXPOSE 3000
CMD ["node", "/app/bin/www"]
~~~

#### FROM ubuntu
FROMは、コンテナのベース・イメージを指定します。 docker images で表示されるイメージの中から１つを選択します。ベースイメージが存在しなければ、docker store から プルしておくと良いでしょう。

#### RUN apt-get update
Ubuntu Linux を構成するパッケージを最新化します。 これは追加のパッケージをインストールで失敗しないために、必ず実施しておきます。

#### RUN apt-get install curl -y
Ubuntu のベースイメージに、curl が入っていないので、追加しておきます。

#### RUN curl -sL https://deb.nodesource.com/setup_6.x | /bin/bash -
node バージョン6系をインストールするためのセットアップ・ファイルをダウンロードして実行します。 この入手元は、ODESOURCE で 主要なOSに対して、Node.jsのメジャー・バージョン毎に、バイナリやソースを配布するサイトです。

#### RUN apt-get install nodejs -y
このコマンドで、nodeをインストールします。

#### ADD ./myapp1 /app
ローカルの開発用ディレクトリをコンテナの中では、/app としてマウントします。

#### ENV NODE_ENV production
これは環境変数の設定です。 開発環境（development）、ステージ環境（stage）、本番環境（production）のように、環境変数から、プログラム内で環境を検知して動作を切り替えることができます。また、[The drastic effects of omitting NODE_ENV in your Express.js applications](https://www.dynatrace.com/blog/the-drastic-effects-of-omitting-node_env-in-your-express-js-applications/) には、NODE_ENVの環境変数を切り替えることによる、パフォーマンス影響について解説があります。

#### EXPOSE 3000
コンテナから外部へ開放するポート番号です。 Express フレームワークを利用したアプリケーションのサーバーポートの番号と、EXPOSE の番号が一致している必要があります。

#### CMD ["node", "/app/bin/www"]
コンテナが起動する時に実行されコマンドを設定します。 アプリテスト時は、package.json に scripts の定義があり、npm start でサーバーを起動してテストする事が出来ました。CMDには アプリをスタートするコマンドを書いておきます。

~~~file:package.json
{
  "name": "myapp1",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
~~~

Node.js の必要なアプリは、前述のnpm install で作成したものを、そのままコンテナに閉じ込めて利用します。 CFコンテナの場合は、Droplet を作成する際に、package.json ファイルを読んで Bluemix の CF環境内でビルドしていたのですが、Docker では、ローカルの開発環境で作ったものをパッケージを丸ごとコンテナにします。


### コンテナのビルド
ここまでの作業で。コンテナ開発のディレクトリには、次の様に１つのファイルと、アプリのディレクトリが存在しています。この状態からコンテナをビルドしていきます。

~~~
imac:docker maho$ pwd
/Users/maho/docker
imac:docker maho$ ls -al
total 8
drwxr-xr-x    4 maho  staff   136  6 26 20:41 .
drwxr-xr-x+ 119 maho  staff  4046  6 26 20:39 ..
-rw-r--r--    1 maho  staff   236  6 26 20:39 Dockerfile
drwxr-xr-x   10 maho  staff   340  6 26 18:36 myapp1
~~~
次のコマンドでビルドの実行すると、Dockerfile の内容が順番に実行されていきます。

~~~
imac:docker maho$ docker build -t ubuntu-express .
Sending build context to Docker daemon 12.41 MB
Step 1/9 : FROM ubuntu
 ---> d355ed3537e9
Step 2/9 : RUN apt-get update
 ---> Running in f0b9950a66ad
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:3 http://security.ubuntu.com/ubuntu xenial-security/universe Sources [39.4 kB]
Get:4 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [363 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial/universe Sources [9802 kB]
Get:8 http://security.ubuntu.com/ubuntu xenial-security/restricted amd64 Packages [12.8 kB]
Get:9 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [171 kB]
Get:10 http://security.ubuntu.com/ubuntu xenial-security/multiverse amd64 Packages [2937 B]
Get:11 http://archive.ubuntu.com/ubuntu xenial/main amd64 Packages [1558 kB]
Get:12 http://archive.ubuntu.com/ubuntu xenial/restricted amd64 Packages [14.1 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [9827 kB]
Get:14 http://archive.ubuntu.com/ubuntu xenial/multiverse amd64 Packages [176 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial-updates/universe Sources [202 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [719 kB]
Get:17 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [13.2 kB]
Get:18 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [618 kB]
Get:19 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 Packages [9808 B]
Get:20 http://archive.ubuntu.com/ubuntu xenial-backports/main amd64 Packages [4929 B]
Get:21 http://archive.ubuntu.com/ubuntu xenial-backports/universe amd64 Packages [6241 B]
Fetched 24.1 MB in 19s (1255 kB/s)
Reading package lists...
 ---> a32fe8dc0dc8
Removing intermediate container f0b9950a66ad
Step 3/9 : RUN apt-get install curl -y
 ---> Running in 46c41e78445f
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  ca-certificates krb5-locales libasn1-8-heimdal libcurl3-gnutls libffi6
  libgmp10 libgnutls30 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhogweed4 libhx509-5-heimdal
  libidn11 libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3
  libkrb5support0 libldap-2.4-2 libnettle6 libp11-kit0 libroken18-heimdal
  librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0
  libssl1.0.0 libtasn1-6 libwind0-heimdal openssl
Suggested packages:
  gnutls-bin krb5-doc krb5-user libsasl2-modules-otp libsasl2-modules-ldap
  libsasl2-modules-sql libsasl2-modules-gssapi-mit
  | libsasl2-modules-gssapi-heimdal
The following NEW packages will be installed:
  ca-certificates curl krb5-locales libasn1-8-heimdal libcurl3-gnutls libffi6
  libgmp10 libgnutls30 libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal
  libheimbase1-heimdal libheimntlm0-heimdal libhogweed4 libhx509-5-heimdal
  libidn11 libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3
  libkrb5support0 libldap-2.4-2 libnettle6 libp11-kit0 libroken18-heimdal
  librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db libsqlite3-0
  libssl1.0.0 libtasn1-6 libwind0-heimdal openssl
0 upgraded, 34 newly installed, 0 to remove and 0 not upgraded.
Need to get 5363 kB of archives.
After this operation, 19.1 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial/main amd64 libffi6 amd64 3.2.1-4 [17.8 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial/main amd64 libgmp10 amd64 2:6.1.0+dfsg-2 [240 kB]
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libnettle6 amd64 3.2-1ubuntu0.16.04.1 [93.5 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libhogweed4 amd64 3.2-1ubuntu0.16.04.1 [136 kB]
Get:5 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libidn11 amd64 1.32-3ubuntu1.1 [45.6 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libp11-kit0 amd64 0.23.2-5~ubuntu16.04.1 [105 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libtasn1-6 amd64 4.7-3ubuntu0.16.04.2 [43.3 kB]
Get:8 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgnutls30 amd64 3.4.10-4ubuntu1.3 [548 kB]
Get:9 http://archive.ubuntu.com/ubuntu xenial/main amd64 libsqlite3-0 amd64 3.11.0-1ubuntu1 [396 kB]
Get:10 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libssl1.0.0 amd64 1.0.2g-1ubuntu4.8 [1081 kB]
Get:11 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 openssl amd64 1.0.2g-1ubuntu4.8 [492 kB]
Get:12 http://archive.ubuntu.com/ubuntu xenial/main amd64 ca-certificates all 20160104ubuntu1 [191 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 krb5-locales all 1.13.2+dfsg-5ubuntu2 [13.2 kB]
Get:14 http://archive.ubuntu.com/ubuntu xenial/main amd64 libroken18-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [41.2 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial/main amd64 libasn1-8-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [174 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libkrb5support0 amd64 1.13.2+dfsg-5ubuntu2 [30.8 kB]
Get:17 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libk5crypto3 amd64 1.13.2+dfsg-5ubuntu2 [81.2 kB]
Get:18 http://archive.ubuntu.com/ubuntu xenial/main amd64 libkeyutils1 amd64 1.5.9-8ubuntu1 [9904 B]
Get:19 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libkrb5-3 amd64 1.13.2+dfsg-5ubuntu2 [273 kB]
Get:20 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgssapi-krb5-2 amd64 1.13.2+dfsg-5ubuntu2 [120 kB]
Get:21 http://archive.ubuntu.com/ubuntu xenial/main amd64 libhcrypto4-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [84.9 kB]
Get:22 http://archive.ubuntu.com/ubuntu xenial/main amd64 libheimbase1-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [29.2 kB]
Get:23 http://archive.ubuntu.com/ubuntu xenial/main amd64 libwind0-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [48.2 kB]
Get:24 http://archive.ubuntu.com/ubuntu xenial/main amd64 libhx509-5-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [107 kB]
Get:25 http://archive.ubuntu.com/ubuntu xenial/main amd64 libkrb5-26-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [202 kB]
Get:26 http://archive.ubuntu.com/ubuntu xenial/main amd64 libheimntlm0-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [15.1 kB]
Get:27 http://archive.ubuntu.com/ubuntu xenial/main amd64 libgssapi3-heimdal amd64 1.7~git20150920+dfsg-4ubuntu1 [96.1 kB]
Get:28 http://archive.ubuntu.com/ubuntu xenial/main amd64 libsasl2-modules-db amd64 2.1.26.dfsg1-14build1 [14.5 kB]
Get:29 http://archive.ubuntu.com/ubuntu xenial/main amd64 libsasl2-2 amd64 2.1.26.dfsg1-14build1 [48.7 kB]
Get:30 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libldap-2.4-2 amd64 2.4.42+dfsg-2ubuntu3.2 [160 kB]
Get:31 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 librtmp1 amd64 2.4+20151223.gitfa8646d-1ubuntu0.1 [54.4 kB]
Get:32 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcurl3-gnutls amd64 7.47.0-1ubuntu2.2 [184 kB]
Get:33 http://archive.ubuntu.com/ubuntu xenial/main amd64 libsasl2-modules amd64 2.1.26.dfsg1-14build1 [47.5 kB]
Get:34 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 curl amd64 7.47.0-1ubuntu2.2 [139 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 5363 kB in 6s (787 kB/s)
Selecting previously unselected package libffi6:amd64.
(Reading database ... 4764 files and directories currently installed.)
Preparing to unpack .../libffi6_3.2.1-4_amd64.deb ...
Unpacking libffi6:amd64 (3.2.1-4) ...
Selecting previously unselected package libgmp10:amd64.
Preparing to unpack .../libgmp10_2%3a6.1.0+dfsg-2_amd64.deb ...
Unpacking libgmp10:amd64 (2:6.1.0+dfsg-2) ...
Selecting previously unselected package libnettle6:amd64.
Preparing to unpack .../libnettle6_3.2-1ubuntu0.16.04.1_amd64.deb ...
Unpacking libnettle6:amd64 (3.2-1ubuntu0.16.04.1) ...
Selecting previously unselected package libhogweed4:amd64.
Preparing to unpack .../libhogweed4_3.2-1ubuntu0.16.04.1_amd64.deb ...
Unpacking libhogweed4:amd64 (3.2-1ubuntu0.16.04.1) ...
Selecting previously unselected package libidn11:amd64.
Preparing to unpack .../libidn11_1.32-3ubuntu1.1_amd64.deb ...
Unpacking libidn11:amd64 (1.32-3ubuntu1.1) ...
Selecting previously unselected package libp11-kit0:amd64.
Preparing to unpack .../libp11-kit0_0.23.2-5~ubuntu16.04.1_amd64.deb ...
Unpacking libp11-kit0:amd64 (0.23.2-5~ubuntu16.04.1) ...
Selecting previously unselected package libtasn1-6:amd64.
Preparing to unpack .../libtasn1-6_4.7-3ubuntu0.16.04.2_amd64.deb ...
Unpacking libtasn1-6:amd64 (4.7-3ubuntu0.16.04.2) ...
Selecting previously unselected package libgnutls30:amd64.
Preparing to unpack .../libgnutls30_3.4.10-4ubuntu1.3_amd64.deb ...
Unpacking libgnutls30:amd64 (3.4.10-4ubuntu1.3) ...
Selecting previously unselected package libsqlite3-0:amd64.
Preparing to unpack .../libsqlite3-0_3.11.0-1ubuntu1_amd64.deb ...
Unpacking libsqlite3-0:amd64 (3.11.0-1ubuntu1) ...
Selecting previously unselected package libssl1.0.0:amd64.
Preparing to unpack .../libssl1.0.0_1.0.2g-1ubuntu4.8_amd64.deb ...
Unpacking libssl1.0.0:amd64 (1.0.2g-1ubuntu4.8) ...
Selecting previously unselected package openssl.
Preparing to unpack .../openssl_1.0.2g-1ubuntu4.8_amd64.deb ...
Unpacking openssl (1.0.2g-1ubuntu4.8) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../ca-certificates_20160104ubuntu1_all.deb ...
Unpacking ca-certificates (20160104ubuntu1) ...
Selecting previously unselected package krb5-locales.
Preparing to unpack .../krb5-locales_1.13.2+dfsg-5ubuntu2_all.deb ...
Unpacking krb5-locales (1.13.2+dfsg-5ubuntu2) ...
Selecting previously unselected package libroken18-heimdal:amd64.
Preparing to unpack .../libroken18-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libroken18-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libasn1-8-heimdal:amd64.
Preparing to unpack .../libasn1-8-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libasn1-8-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libkrb5support0:amd64.
Preparing to unpack .../libkrb5support0_1.13.2+dfsg-5ubuntu2_amd64.deb ...
Unpacking libkrb5support0:amd64 (1.13.2+dfsg-5ubuntu2) ...
Selecting previously unselected package libk5crypto3:amd64.
Preparing to unpack .../libk5crypto3_1.13.2+dfsg-5ubuntu2_amd64.deb ...
Unpacking libk5crypto3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Selecting previously unselected package libkeyutils1:amd64.
Preparing to unpack .../libkeyutils1_1.5.9-8ubuntu1_amd64.deb ...
Unpacking libkeyutils1:amd64 (1.5.9-8ubuntu1) ...
Selecting previously unselected package libkrb5-3:amd64.
Preparing to unpack .../libkrb5-3_1.13.2+dfsg-5ubuntu2_amd64.deb ...
Unpacking libkrb5-3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Selecting previously unselected package libgssapi-krb5-2:amd64.
Preparing to unpack .../libgssapi-krb5-2_1.13.2+dfsg-5ubuntu2_amd64.deb ...
Unpacking libgssapi-krb5-2:amd64 (1.13.2+dfsg-5ubuntu2) ...
Selecting previously unselected package libhcrypto4-heimdal:amd64.
Preparing to unpack .../libhcrypto4-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libhcrypto4-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libheimbase1-heimdal:amd64.
Preparing to unpack .../libheimbase1-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libheimbase1-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libwind0-heimdal:amd64.
Preparing to unpack .../libwind0-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libwind0-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libhx509-5-heimdal:amd64.
Preparing to unpack .../libhx509-5-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libhx509-5-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libkrb5-26-heimdal:amd64.
Preparing to unpack .../libkrb5-26-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libkrb5-26-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libheimntlm0-heimdal:amd64.
Preparing to unpack .../libheimntlm0-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libheimntlm0-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libgssapi3-heimdal:amd64.
Preparing to unpack .../libgssapi3-heimdal_1.7~git20150920+dfsg-4ubuntu1_amd64.deb ...
Unpacking libgssapi3-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Selecting previously unselected package libsasl2-modules-db:amd64.
Preparing to unpack .../libsasl2-modules-db_2.1.26.dfsg1-14build1_amd64.deb ...
Unpacking libsasl2-modules-db:amd64 (2.1.26.dfsg1-14build1) ...
Selecting previously unselected package libsasl2-2:amd64.
Preparing to unpack .../libsasl2-2_2.1.26.dfsg1-14build1_amd64.deb ...
Unpacking libsasl2-2:amd64 (2.1.26.dfsg1-14build1) ...
Selecting previously unselected package libldap-2.4-2:amd64.
Preparing to unpack .../libldap-2.4-2_2.4.42+dfsg-2ubuntu3.2_amd64.deb ...
Unpacking libldap-2.4-2:amd64 (2.4.42+dfsg-2ubuntu3.2) ...
Selecting previously unselected package librtmp1:amd64.
Preparing to unpack .../librtmp1_2.4+20151223.gitfa8646d-1ubuntu0.1_amd64.deb ...
Unpacking librtmp1:amd64 (2.4+20151223.gitfa8646d-1ubuntu0.1) ...
Selecting previously unselected package libcurl3-gnutls:amd64.
Preparing to unpack .../libcurl3-gnutls_7.47.0-1ubuntu2.2_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.2) ...
Selecting previously unselected package libsasl2-modules:amd64.
Preparing to unpack .../libsasl2-modules_2.1.26.dfsg1-14build1_amd64.deb ...
Unpacking libsasl2-modules:amd64 (2.1.26.dfsg1-14build1) ...
Selecting previously unselected package curl.
Preparing to unpack .../curl_7.47.0-1ubuntu2.2_amd64.deb ...
Unpacking curl (7.47.0-1ubuntu2.2) ...
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Setting up libffi6:amd64 (3.2.1-4) ...
Setting up libgmp10:amd64 (2:6.1.0+dfsg-2) ...
Setting up libnettle6:amd64 (3.2-1ubuntu0.16.04.1) ...
Setting up libhogweed4:amd64 (3.2-1ubuntu0.16.04.1) ...
Setting up libidn11:amd64 (1.32-3ubuntu1.1) ...
Setting up libp11-kit0:amd64 (0.23.2-5~ubuntu16.04.1) ...
Setting up libtasn1-6:amd64 (4.7-3ubuntu0.16.04.2) ...
Setting up libgnutls30:amd64 (3.4.10-4ubuntu1.3) ...
Setting up libsqlite3-0:amd64 (3.11.0-1ubuntu1) ...
Setting up libssl1.0.0:amd64 (1.0.2g-1ubuntu4.8) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up openssl (1.0.2g-1ubuntu4.8) ...
Setting up ca-certificates (20160104ubuntu1) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up krb5-locales (1.13.2+dfsg-5ubuntu2) ...
Setting up libroken18-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libasn1-8-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libkrb5support0:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libk5crypto3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libkeyutils1:amd64 (1.5.9-8ubuntu1) ...
Setting up libkrb5-3:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libgssapi-krb5-2:amd64 (1.13.2+dfsg-5ubuntu2) ...
Setting up libhcrypto4-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libheimbase1-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libwind0-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libhx509-5-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libkrb5-26-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libheimntlm0-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libgssapi3-heimdal:amd64 (1.7~git20150920+dfsg-4ubuntu1) ...
Setting up libsasl2-modules-db:amd64 (2.1.26.dfsg1-14build1) ...
Setting up libsasl2-2:amd64 (2.1.26.dfsg1-14build1) ...
Setting up libldap-2.4-2:amd64 (2.4.42+dfsg-2ubuntu3.2) ...
Setting up librtmp1:amd64 (2.4+20151223.gitfa8646d-1ubuntu0.1) ...
Setting up libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.2) ...
Setting up libsasl2-modules:amd64 (2.1.26.dfsg1-14build1) ...
Setting up curl (7.47.0-1ubuntu2.2) ...
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Processing triggers for ca-certificates (20160104ubuntu1) ...
Updating certificates in /etc/ssl/certs...
173 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.
 ---> 19aef75b6abf
Removing intermediate container 46c41e78445f
Step 4/9 : RUN curl -sL https://deb.nodesource.com/setup_6.x | /bin/bash -
 ---> Running in 403e531bcc8f

## Installing the NodeSource Node.js v6.x repo...


## Populating apt-get cache...

+ apt-get update
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:3 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Get:4 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]
Fetched 306 kB in 1s (157 kB/s)
Reading package lists...

## Installing packages required for setup: apt-transport-https lsb-release...

+ apt-get install -y apt-transport-https lsb-release > /dev/null 2>&1

## Confirming "xenial" is supported...

+ curl -sLf -o /dev/null 'https://deb.nodesource.com/node_6.x/dists/xenial/Release'

## Adding the NodeSource signing key to your keyring...

+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
OK

## Creating apt sources list file for the NodeSource Node.js v6.x repo...

+ echo 'deb https://deb.nodesource.com/node_6.x xenial main' > /etc/apt/sources.list.d/nodesource.list
+ echo 'deb-src https://deb.nodesource.com/node_6.x xenial main' >> /etc/apt/sources.list.d/nodesource.list

## Running `apt-get update` for you...

+ apt-get update
Get:1 https://deb.nodesource.com/node_6.x xenial InRelease [4634 B]
Get:2 https://deb.nodesource.com/node_6.x xenial/main Sources [764 B]
Get:3 https://deb.nodesource.com/node_6.x xenial/main amd64 Packages [962 B]
Hit:4 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:5 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB]
Get:6 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
Get:7 http://archive.ubuntu.com/ubuntu xenial-backports InRelease [102 kB]
Fetched 313 kB in 1s (180 kB/s)
Reading package lists...

## Run `apt-get install nodejs` (as root) to install Node.js v6.x and npm

 ---> c543c9191c29
Removing intermediate container 403e531bcc8f
Step 5/9 : RUN apt-get install nodejs -y
 ---> Running in 742e73bf9554
Reading package lists...
Building dependency tree...
Reading state information...
The following NEW packages will be installed:
  nodejs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 10.1 MB of archives.
After this operation, 50.8 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_6.x xenial/main amd64 nodejs amd64 6.11.0-1nodesource1~xenial1 [10.1 MB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 10.1 MB in 1s (6108 kB/s)
Selecting previously unselected package nodejs.
(Reading database ... 6325 files and directories currently installed.)
Preparing to unpack .../nodejs_6.11.0-1nodesource1~xenial1_amd64.deb ...
Unpacking nodejs (6.11.0-1nodesource1~xenial1) ...
Setting up nodejs (6.11.0-1nodesource1~xenial1) ...
 ---> a8f0a78b8cba
Removing intermediate container 742e73bf9554
Step 6/9 : ADD ./myapp1 /app
 ---> 4525f36d581d
Removing intermediate container 8ebea3b54bbd
Step 7/9 : ENV NODE_ENV production
 ---> Running in 35d5ab75e9ad
 ---> c1a66dcc3e22
Removing intermediate container 35d5ab75e9ad
Step 8/9 : EXPOSE 3000
 ---> Running in 6276f8df2f72
 ---> 89e55e2d83a5
Removing intermediate container 6276f8df2f72
Step 9/9 : CMD node /app/bin/www
 ---> Running in 946e968821e3
 ---> d556c38ae742
Removing intermediate container 946e968821e3
Successfully built d556c38ae742
~~~
コンテナのビルドが完成したので、コンテナのサイズを確認してみます。 今回、作成したコンテナ名は、ubuntu-express です。 Docker Store から利用できる node がパッケージされたコンテナのベースイメージ node のサイズと比較をしてもらうと、コンパクトに仕上がった事が判りますす。

~~~
imac:docker maho$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-express      latest              d556c38ae742        2 minutes ago       268 MB
node                latest              258031686918        3 days ago          667 MB
ubuntu              latest              d355ed3537e9        5 days ago          119 MB
~~~

## ローカル環境でのコンテナの実行
まずは、MacのローカルのDocker で、次のコマンドで実行して動作を確認します。 Macのブラウザから http://localhost:3000/ とする事で、Node.js の画面が表示されます。

~~~
imac:docker maho$ docker run -p 3000:3000 -t ubuntu-express
Warning: connect.session() MemoryStore is not
designed for a production environment, as it will leak
memory, and will not scale past a single process.
GET / 200 255.721 ms - 470
GET /stylesheets/style.css 200 88.156 ms - 154
~~~
これで、コンテナ化が完了したので、次は、Bluemix 上で公開することを進めていきます。


## Bluemix コンテナ・リポジトリへプッシュ
bx コマンドから images をリストすると、Bluemix コンテナ・リポジトリ上のリストが表示されます。このリポジトリに、ローカルで作成したコンテナを登録して、Bluemix 上でデプロイできる様にしていきます。

~~~
imac:~ maho$ bx ic images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
registry.ng.bluemix.net/ibmnode                       latest              469709221e8d        2 weeks ago         190 MB
registry.ng.bluemix.net/ibmnode                       v4                  469709221e8d        2 weeks ago         190 MB
registry.ng.bluemix.net/ibmliberty                    javaee7             162ff4d68d3e        4 weeks ago         303 MB
registry.ng.bluemix.net/ibmliberty                    latest              162ff4d68d3e        4 weeks ago         303 MB
~~~
リポジトリの自己用のネームスペースを取得します。

もう一つの方法として、コンテナ・レジストリ・サービスのプラグインでも同じことができます。

~~~
vagrant@vagrant-ubuntu-trusty-64:~/docker$ bx cr images
Listing images...

REPOSITORY                                            NAMESPACE     TAG      DIGEST         CREATED        SIZE     VULNERABILITY STATUS   
registry.ng.bluemix.net/takara_node/express-session   takara_node   latest   f9c3c632b124   1 month ago    111 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/lets-chat         takara_node   latest   6c660bbee42b   1 month ago    108 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/mongo             takara_node   latest   373cfe7d46d2   2 months ago   128 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/ubuntu            takara_node   latest   b972dda797ef   2 months ago   46 MB    Vulnerable   
registry.ng.bluemix.net/takara_node/ubuntu-express    takara_node   latest   5ee6bdea56e0   2 months ago   111 MB   Vulnerable   

OK
~~~

ICプラグインを利用する方法

~~~
imac:docker maho$ bx ic namespace get
takara_node
~~~

CRプラグインを利用する方法です、takara の部分は自分の名前やプロジェクトの名前に置き換えてくださいね。

~~~
bx cr namespace-add takara
~~~
自分の利用できるネームスペースをリストするには、次のコマンドを利用します。

~~~
bx cr namespace-list
~~~

dockerコマンドで、ローカルで作成したコンテナとBluemixのリポジトリへタグ付けします。

~~~
imac:docker maho$ docker tag ubuntu-express registry.ng.bluemix.net/takara_node/ubuntu-express
~~~
dockerコマンドで、コンテナをBluemix へプッシュします。

~~~
imac:docker maho$ docker push registry.ng.bluemix.net/takara_node/ubuntu-express
The push refers to a repository [registry.ng.bluemix.net/takara_node/ubuntu-express]
2665f2778010: Pushed 
9a367946eb5f: Pushed 
dfb312862e03: Pushed 
5c6af9aca813: Pushed 
71460fe01896: Pushed 
0566c118947e: Pushed 
6f9cf951edf5: Pushed 
182d2a55830d: Pushed 
5a4c2c9a24fc: Pushed 
cb11ba605400: Pushed 
latest: digest: sha256:5ee6bdea56e06c02ae40d179cb269aec6f719eea9d252a3de71e00878c9a6605 size: 2415
~~~
bx ic images コマンドで Bluemix コンテナ・リポジトリへ登録されている事を確認します。

~~~
imac:docker maho$ bx ic images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
<中略>
registry.ng.bluemix.net/takara_node/ubuntu-express    latest              d556c38ae742        13 minutes ago      111 MB
~~~

もう一つの方法です。

~~~
$ bx cr images
Listing images...

REPOSITORY                                            NAMESPACE     TAG      DIGEST         CREATED          SIZE     VULNERABILITY STATUS   
registry.ng.bluemix.net/takara/app-express            takara        latest   48b205a916c6   27 minutes ago   114 MB   Unknown   
registry.ng.bluemix.net/takara_node/express-session   takara_node   latest   f9c3c632b124   1 month ago      111 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/lets-chat         takara_node   latest   6c660bbee42b   1 month ago      108 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/mongo             takara_node   latest   373cfe7d46d2   2 months ago     128 MB   Vulnerable   
registry.ng.bluemix.net/takara_node/ubuntu            takara_node   latest   b972dda797ef   2 months ago     46 MB    Vulnerable   
registry.ng.bluemix.net/takara_node/ubuntu-express    takara_node   latest   5ee6bdea56e0   2 months ago     111 MB   Vulnerable   
~~~


ここまでで、Bluemix のコンテナとして利用できる準備が整いました。 自己のユーザーIDでログインした Bluemix のコンテナーのカタログにも、ここで登録したコンテナが表示される様になります。プライベートなコンテナは、一番下の紫色のアイコンで、「マイ組織」として表示されている部分になります。

![スクリーンショット 2017-06-27 13.28.13.png](https://qiita-image-store.s3.amazonaws.com/0/42829/7081c06e-180b-224e-5370-e91f315217c6.png)


# Bluemix でのコンテナの実行
コンテナの実行方法として、以下の３種類の手段があり、この記事では、上から２つの方法を実行していきます。

* シングル コンテナ
* スケーラブル コンテナ
* Kubernetes クラスタ 


## シングル・コンテナ
章見出しの通り、コンテナ単独で実行するもので、テスト用を前提として提供されています。ホスト名＋ドメイン名でアクセスを提供する機能や HTTPS 暗号化通信 を提供する機能は無く、ブラウザからは、IPアドレスとポート番号を指定してのアクセスとなります。

最初に公開用のIPアドレスを、次のコマンドを利用して、確保しておきます。 

~~~
imac:docker maho$ bx ic ip request
OK
IP アドレス "169.46.28.235" が取得されました。
~~~
次に公開用IPアドレス、接続先サービスを指定して、コンテナを起動します。

~~~
imac:docker maho$ bx ic run --name tkrZ -m 64 -p 169.46.28.235:80:3000 --env "CCS_BIND_SRV=Cloudant NoSQL DB-j9" registry.ng.bluemix.net/takara_node/ubuntu-express
f74500f5-fcb5-4ffd-abbc-9a30da7d4d78
~~~
上記の bx ic run のオプションを以下に解説しておきます。

#### --name tkrZ
コンテナの名前で、Bluemix ポータルに表示される名前です。 次のスクリーン・ショットは参考例です。 
![スクリーンショット 2017-06-27 13.49.38.png](https://qiita-image-store.s3.amazonaws.com/0/42829/987b9d24-1235-b0ef-951c-7340ec6cacaf.png)

#### -m 64
メモリサイズで、単位は MB です。 

#### -p 169.46.28.235:80:3000
左から順番に、公開用IPアドレスとポート番号、そして、コンテナ内部のサーバーポート番号です。 

#### --env "CCS_BIND_SRV=Cloudant NoSQL DB-j9"
Bluemix の 他のサービスと接続するためのサービスの定義です。 ここで、この設定によって、Cloudant NoSQL DB-j9 データベースサービスと接続するためのサービス資格情報が、環境変数で提供される様になります。

#### registry.ng.bluemix.net/takara_node/ubuntu-express
コンテナのリポジトリのパスです。 Macで作成して、Bluemix 登録したコンテナです。


## スケーラブル コンテナ
こちらは、複数のコンテナを起動して、ロードバランサーで要求を分配する事で、処理能力と可用性を高めた構成になります。起動するためには、bx ic group-create を実行します。

~~~
imac:docker maho$ bx ic group-create --name tkr123 -m 64 -n tkr123 -d mybluemix.net --min 1 --max 3 --desired 2 -p 3000 -e "CCS_BIND_SRV=Cloudant NoSQL DB-j9" registry.ng.bluemix.net/takara_node/ubuntu-express
OK
グループ作成が要求されました。
グループ「tkr123」 (ID: a4902d54-1619-44aa-aa60-76b33e6f8a84) が作成されました。
最小コンテナー・インスタンス数: 1
最大コンテナー・インスタンス数: 3
望ましいコンテナー・インスタンス数: 2
~~~
簡単にパラーメータの解説を書いておきます。

#### -n tkr123
ホスト名、コンテナ名として利用される部分です。 

#### -d mybluemix.net
ドメイン名で、CFアプリで利用するもの、カスタムに取得して利用するものなどの中から、選んで付与します。

#### -min 1 --man 3 --desirerd 2
コンテナの最小数、最大数、希望数を設定します。

#### -p 3000
コンテナ内で動作するサーバープロセスのポート番号です。 このオプションを忘れると、サービスのフォサード先が無いことになり、いつまでの起動しないという現象になります。 サービスが開始できないと感じたら、チェックする項目の１つです。

#### -e "CCS_BIND_SRV=Cloudant NoSQL DB-j9"
バインドする Bluemix のサービス名です。

通常のDockerコンテナであれば、一瞬で起動するのですが、このタイプは、ネットワークの設定などがあり、コンテナがグループで起動してくるまでに、１〜２分かかります。

### スケーラブル コンテナの起動確認
次のコマンドで、起動の進捗状況を確認できます。 状況が CREATE_IN_PROGRESS から CREATE_COMPLET になるまで、数回実行して確認すると良いでしょう。

~~~
imac:docker maho$ bx ic groups
グループ ID                            名前     状況                 作成日時                        更新日時   ポート   経路   
a4902d54-1619-44aa-aa60-76b33e6f8a84   tkr123   CREATE_IN_PROGRESS   2017-06-27 09:07:03 +0900 JST              3000     tkr123.mybluemix.net   
~~~
起動完了状態では、状況の欄が CREATE_COMPLETE になる。

~~~
imac:docker maho$ bx ic groups
グループ ID                            名前     状況              作成日時                        更新日時   ポート   経路   
a4902d54-1619-44aa-aa60-76b33e6f8a84   tkr123   CREATE_COMPLETE   2017-06-27 09:07:03 +0900 JST              3000     tkr123.mybluemix.net
~~~
グループを構成するコンテナを確認するには、bx ic ps で確認できます。

~~~   
imac:docker maho$ bx ic ps 
CONTAINER ID        IMAGE                                                       COMMAND             CREATED             STATUS              PORTS                          NAMES
eb8cdb36-0b5        registry.ng.bluemix.net/takara_node/ubuntu-express:latest   ""                  41 minutes ago      Running             3000/tcp                       tk-gu72-wdnhckvon2vk-fanfl5sd6433-server-es766vp2nvkm
fbdb481d-fa3        registry.ng.bluemix.net/takara_node/ubuntu-express:latest   ""                  41 minutes ago      Running             3000/tcp                       tk-gu72-omqk7tk62mfg-g6ngosdthyfn-server-e2dxo52h5lml
~~~

## サービスの接続

現在 (2017/6/27) Bluemix ポータル画面から、接続先のサービスを表示する機能が実装されていないので、コンテナへログインして、環境変数 $VCAP_SERVICES の内容を確認すると、正しく環境変数が提供されていることがわかります。

コンテナへのサービスの接続状況を確認すると、次の様に表示される。
![スクリーンショット 2017-06-27 14.41.34.png](https://qiita-image-store.s3.amazonaws.com/0/42829/2bcbfcb1-482d-ce29-967c-5103dbcbe48d.png)

つぎの様に、コンテナ内の環境変数を確認すると、確かに設定が反映されていることがわかります。

~~~
imac:docker maho$ bx ic exec -it eb8cdb36-0b5 /bin/bash
root@instance-0091ba6b:/# echo $VCAP_SERVICES                                                                                                                                                                                                            
{"cloudantNoSQLDB": [{"binding_guid": "cacd9081-fb52-4e60-84ac-4635d9eb2e93", "metadata": {<中略> "label": "cloudantNoSQLDB", "name": "Cloudant NoSQL DB-j9"}]}
~~~

## iPhone からアプリをアクセス
次のスクリーンショットは、iPhoneのブラウザから、Bluemix の URLのアプリをアクセスしたスクリーンコピーです。

![スクリーンショット 2017-06-27 15.16.31.png](https://qiita-image-store.s3.amazonaws.com/0/42829/b5d685a0-de03-01d4-5bd4-72e8cfc9f3d9.png)


# まとめ
普段使っている自分の Mac でアプリを作って、コンテナとしてBluemixで実行して公開するまでの一連の流れを確認してみました。 CloudFoundry のコンテナと比較すると、簡単にベースイメージをアップデートできる点など、Docker が普及している利点により、扱い易さがある様に思います。  一方で、Bluemix 上で、Dockerは、CloudFoudry のコンテナほど完成されていないというか、他サービスやDevOps機能との連携が未実装な部分も感じられました。
今後、コンテナ技術によって、開発とサービス提供のサイクルの効率化が推進できる様なることを期待したいと思います。


# 参考資料
* Bluemix CLI ホームページ https://clis.ng.bluemix.net/ui/home.html
* Getting started with IBM Bluemix Container Service https://console.bluemix.net/docs/containers/container_index.html
* IBM Bluemix Container Service plug-in for managing single and scalable containers (bx ic) https://console.bluemix.net/docs/containers/container_cli_cfic.html
* IBM Bluemix Container Registry CLI (bx cr) https://console.bluemix.net/docs/cli/plugins/registry/index.html#containerregcli
* IBM Bluemix Container Service plug-in for managing Kubernetes clusters (bx cs) https://console.bluemix.net/docs/containers/cs_cli_devtools.html
* Install Docker for Mac https://docs.docker.com/docker-for-mac/install/
* Install Docker for Windows https://docs.docker.com/docker-for-windows/install/

* docker store Ubuntu https://store.docker.com/images/ubuntu
* Express4 で フラッシュメッセージを利用する方法のメモ http://qiita.com/MahoTakara/items/0a88d05ff93328035ad8
* NodeSource Node.js and io.js Binary Distributions https://github.com/nodesource/distributions
* Binding a service to a container from the CLI https://console.bluemix.net/docs/containers/container_integrations.html#container_integrations_binding
* The drastic effects of omitting NODE_ENV in your Express.js applications https://www.dynatrace.com/blog/the-drastic-effects-of-omitting-node_env-in-your-express-js-applications/