IBM Bluemixにとりあえず1つdocker containerを投げ込んで動かす方法


IBMが提供しているBluemix上で自分が作成したコンテナをとりあえず1つ動かすための手順をまとめています。立場上[^1]使い勝手の良し悪しについてはなるべくコメントを控えたいと思いますが、コンテナはメモリ使用量に応じての課金らしく、月ごとに365GB時間無料＝常時512MBまでなら無課金らしいので、とりあえずのWebサービスを動かしたりボットを走らせておく用途としてはいいのでは、と個人的に思います。

作業をするにあたっては以下がすでにそろっているものとします。

- Bluemixに使える有効なアカウント(IBM ID)
- Dockerfileでビルドできるdockerイメージ

## Bluemix CLIのsetup

http://clis.ng.bluemix.net/ui/home.html からCLIのパッケージをダウンロードし、`bx` コマンドをインストールします。macOSとWindowsはインストーラ有り、Linuxは中身を展開して `install_bluemix_cli` を管理者権限で実行します。詳しくはページ内のinstructionを参照

## コンテナサービスのプラグインをインストール

```shell-session
$ bx plugin install IBM-Containers -r Bluemix
Looking up 'IBM-Containers' from repository 'Bluemix'...
Attempting to download the binary file...
10074128 bytes downloaded
Installing binary...
OK
Plug-in 'IBM-Containers 1.0.0' was successfully installed into /Users/mizutani/.bluemix/plugins/IBM-Containers.
```

成功すると一覧に表示されるようになります。

```shell-session
$  bx plugin list
Listing installed plug-ins...

Plugin Name      Version
IBM-Containers   1.0.0
```

## ログインする

CLIから自分のアカウントを操作できるようにするため `~/.bluemix/config.json` にcredential情報を保存するためbxコマンドでログインします。

```shell-session
$ bx login -a api.ng.bluemix.net
API endpoint: api.ng.bluemix.net

Email> mizutani@sfc.wide.ad.jp

Password>
Authenticating...
OK

Select an account (or press enter to skip):
1. Masayoshi Mizutani's Account (7f9dc5344476457f2cxxxxxxxxxxxxx)
Enter a number> 1
Targeted account Masayoshi Mizutani's Account (7f9dc5344476457f2cxxxxxxxxxxxxx)

Targeted org mizutani@sfc.wide.ad.jp

Targeted space dev



API endpoint:   https://api.ng.bluemix.net (API version: 2.54.0)
Region:         us-south
User:           mizutani@sfc.wide.ad.jp
Account:        Masayoshi Mizutani's Account (7f9dc5344476457f2cxxxxxxxxxxxxx)
Org:            mizutani@sfc.wide.ad.jp
Space:          dev
```

途中でIBM IDのメールアドレス、パスワード、使用するアカウントの選択が求められます。個人で使う場合は1つしか選択肢が出てこないと思うので、`1` を選べばOKです。

## コンテナ操作用プラグインの設定

まず自分が使うレジストリの名前を決めます。**なんか後から変えられないらしいのでよく考えて選んでください**

名前を決めたら（今回は `mizutani` とします）namespaceをセットします。

```shell-session
$ bx ic namespace-set mizutani
mizutani
```

設定したあとでplugin用の初期化をします。

```shell-session
$ bx ic init
Deleting old configuration file...
Generating client certificates for IBM Containers...
Client certificates are being stored in /Users/mizutani/.ice/certs/...

Client certificates are being stored in /Users/mizutani/.ice/certs/containers-api.ng.bluemix.net/406c4019-225d-4c7a-be71-a3e09e3d9e8a...

OK
Client certificates were retrieved.

Checking local Docker configuration...
OK

Authenticating with registry at host name registry.ng.bluemix.net
OK
Your container was authenticated with the IBM Containers registry.
Your private Bluemix repository is URL: registry.ng.bluemix.net/mizutani
(後略)
```

## イメージ・コンテナの操作

ここまでくると `docker` の代わりに `bx ic` を使うことでBluemix上のレポジトリを触ることが出来るようになります。例えばイメージ一覧は以下のように取得できます。

```shell-session
$ bx ic images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
registry.ng.bluemix.net/ibmnode                       v1.2                d7c434e2e040        5 weeks ago         190 MB
registry.ng.bluemix.net/ibmnode                       latest              8cdce2b2ed17        5 weeks ago         196 MB
registry.ng.bluemix.net/ibmnode                       v4                  8cdce2b2ed17        5 weeks ago         196 MB
registry.ng.bluemix.net/ibmnode                       v1.1                43d76a861d88        5 weeks ago         184 MB
registry.ng.bluemix.net/ibmliberty                    latest              6465e344a3af        5 weeks ago         317 MB
registry.ng.bluemix.net/ibmliberty                    javaee7             6465e344a3af        5 weeks ago         317 MB
registry.ng.bluemix.net/ibm-integration-bus           latest              561c7b86d80e        3 weeks ago         700 MB
registry.ng.bluemix.net/ibm-node-strong-pm            latest              3fc4ae24eb0e        2 months ago        259 MB
registry.ng.bluemix.net/ibm_wa_agent                  latest              db7dc2abff64        3 weeks ago         435 MB
registry.ng.bluemix.net/ibm-mq                        latest              222b6a6fea85        5 weeks ago         793 MB
registry.ng.bluemix.net/ibmliberty                    webProfile7         5f815fd6ee3b        5 weeks ago         279 MB
registry.ng.bluemix.net/ibmliberty                    microProfile        4e722eac3f34        5 weeks ago         241 MB
registry.ng.bluemix.net/ibmliberty                    webProfile6         08d61aae8cdf        5 weeks ago         271 MB
registry.ng.bluemix.net/ibm-backup-restore            latest              5875429769e7        8 weeks ago         203 MB
registry.ng.bluemix.net/ibm-websphere-extreme-scale   latest              2585787ad664        4 weeks ago         478 MB
```

デフォルトでIBM謹製のイメージが登録されているのでこれを動かすこともできますが、今回は自分のコンテナを使います。

`bx ic` コマンドを使って自分のイメージをビルドします。Dockerfileは[これ](https://github.com/m-mizutani/msgdump/blob/master/docker/Dockerfile)を使っています。

```shell-session
$ bx ic build -t msgdump .
(中略)
Successfully built 891773cc44d3
The push refers to a repository [registry.ng.bluemix.net/mizutani/msgdump]
31cfab934904: Pushed
3b831e4e6d17: Pushed
a8b10de7fc21: Pushed
e07897579c6d: Pushed
dbcdd639d18f: Pushed
2031d67f02c8: Pushed
23b9c7b43573: Pushed
latest: digest: sha256:4a93f1a954436812f4861db0e9f09d23d91f8fa2b8e8fad2fbd62bca502d74d2 size: 1787
```

これによってイメージが登録されました。

```shell-session
$ bx ic images
REPOSITORY                                            TAG                 IMAGE ID            CREATED              SIZE
(中略)
registry.ng.bluemix.net/mizutani/msgdump              latest              891773cc44d3        About a minute ago   22.8 MB
```

実行してみます。

```shell-session
$ bx ic run -d -p 80:80 -p 24224:24224 mizutani/msgdump
6f72e917-3a2c-45aa-acea-2f657478a5ee
```

- このサービスはポート80番とポート24224を両方使うので2つ指定していますが、通常のwebサービスであれば1つで良いはずです
- buildするときはnamespace必要なしで勝手に保管してくれるのですが（`msgdump` → `mizutani/msgdump`になる）runするときは明示的に `mizutani/msgdump` のように指定しないといけないようです。

[Bluemixのダッシュボード](https://console.ng.bluemix.net/dashboard/apps)に移動してみるとコンテナが立ち上がっているのがわかります。

![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/27627/f44177cc-2818-5672-29b1-3d388ae92bb0.png)

ただしこの状態だとexternal用のIPアドレスが割り当てられていないので、別途割り当てる必要があります。Webダッシュボードからも操作できますが、せっかくなのでCLIから操作します。

```shell-session
$ bx ic ip-request
OK
IP address "169.44.1.38" was obtained.
```

まず自分が使うためのIPアドレスを要求します。今回は `169.44.1.38` が割り当てられました。これを先程の立ち上げたコンテナ (`6f72e917-3a2c-45aa-acea-2f657478a5ee`) と紐付けます。

```shell-session
$ bx ic ip-bind 169.44.1.38 6f72e917-3a2c-45aa-acea-2f657478a5ee
OK
The IP address was bound successfully.
```

これで疎通ができました。http://169.44.1.38/ を開いてみるとちゃんとサービスが表示されています。

![Screen Shot 2017-05-05 at 16.26.14.png](https://qiita-image-store.s3.amazonaws.com/0/27627/f97de26e-0261-a35d-a53c-c01a4dc00103.png)

今回はWebサービス用のコンテナでしたが、ボットや他の目的のコンテナでも同様に動かす事ができると思います。

[^1]: 直接の開発・運用はしていませんが一応中の人です