docker の WAS (traditional)と DB2 (express-c) でアプリを動かした時のメモ

# はじめに
docker hub の [ibmcom](https://hub.docker.com/r/ibmcom) に WAS と DB2 があることを同僚から聞きつけて、そこで DB アクセスする WEB アプリケーション (warファイル) を動かすことにチャレンジした時のメモ。

このところ、普段 Mac 上で開発する際に渇望していたのは、WAS の traditional と DB2 を気軽に使う方法でした。 WAS liberty だと、 Eclipse 上で動くものや、 Bluemix という手があるが、 traditional はお気軽な方法が見当たらなかった。 DB2 に関しても、ちょっと古い Express-C 版が手に入りそうで入らないもどかしい感じ（色々リンクを辿ってサイトをたらい回しになった・・・)。

そこに同僚から、コンテナあるよ、との話を聞きつけて、すぐに飛びついた、という話。

# 固定IPのために

次のコマンドでネットワークを作る。

`docker network create --subnet=192.168.60.0/24 my-net` 

このネットワークに他のコンテナーをつないで、固定の IP を指定する。
実際のコマンドは各コンテナのところで記述。
目指すは次のような格好。172.17.0.0/24 は自動で振られるネットワーク。

![IMG_2017-07-04_04-40-57_午後.png](https://qiita-image-store.s3.amazonaws.com/0/31769/774c6cb8-de2c-6981-44cc-0e199e7e598d.png)


# DB2

docker hub のページは[ここ](https://hub.docker.com/r/ibmcom/db2express-c/)。
そこにも起動方法は書かれているが、自分がやったことのメモとしては以下。

## コンテナ起動

```bash
#コンテナの起動
docker run -it --name mydb -p 50000:50000 -e DB2INST1_PASSWORD=db2inst1-pwd -e LICENSE=accept -v $(pwd):/share  ibmcom/db2express-c:latest bash
#この時点で container 内のプロンプト表示になるので [ctrl]+p [ctrl]+q で抜ける
#固定IPの割り当て
docker network connect --ip 192.168.60.2 my-net mydb
docker exec -it mydb bash  # このあとテーブルなどを作成
```

db2 はコンテナ起動後に DB 作ったり色々することがあるので対話モードで bash を起動。以下を実行後 $(pwd)/share 内のスクリプト類を実行して、DB作成、テーブル作成、データのロードなどを実行。

註 : DB2INST1_PASSWORD に指定している値は、上の例のままだとパスワードにユーザーIDを含むことから不適切。実際上のままコマンドを実行するとエラーが出てパスワード変更に失敗する。docker のベースのOSのパスワードポリシーの問題だとは思うが、ユーザー名を含まない、キーボード配列じゃない、よくある o->0 置換の単語ではない、など、一般的に問題視されないようなパスワードを指定すること。

```bash
su - db2inst1
```

また、`docker run` で初めて image から起動させた場合は DB2 そのものが起動していないので次のコマンドを実行する必要があります。

```bash
db2start
```

対話モードを抜けるには [Ctrl]+p [Ctrl]+q を。
また対話モードで使うには以下。

```bash
docker attach コンテナ名 (またはコンテナID)
```

# WAS

docker hub のページは[ここ](https://hub.docker.com/r/ibmcom/websphere-traditional/)。
そこにも起動方法は書かれているが、自分がやったことのメモとしては以下。

## コンテナ起動

```bash
vi PASSWORD # 適当なパスワードを設定して保存
cp どこかのディレクトリ/db2jcc4.jar .  # あらかじめ用意しておいたものをカレントへ
mkdir logs  # ログ出力先
#コンテナ起動
docker run --name mywas -h myhost -p 9043:9043 -p 9443:9443 -p 9080:9080 -v $(pwd)/PASSWORD:/tmp/PASSWORD -v $(pwd)/db2jcc4.jar:/tmp/db2jcc4.jar -v $(pwd)/logs:/LOG/myapplog -d ibmcom/websphere-traditional:profile 
#固定IPの割り当て
docker network connect --ip 192.168.60.3 my-net mywas
```

たったこれだけで was v9.0.0.2 (試した時の最新) が起動する。便利。
```docker network ...``` で固定のIPを振れるのも嬉しい。

#### ポートの指定について
WAS の管理系のポート 9043, 9443 をホストの同ポートに割り当て。
WAS の仮装ホストのデフォルトに指定されている 9080 も同様に。
これで、 localhost:9080/xxxx でアクセスできる。

#### アプリから使用するファイルについて
jdbc ドライバーの jar ファイル、ログ出力先ディレクトリ、をローカルのものを割り当てる。

#### 管理コンソールの起動
以下のURLをブラウザで開き、ユーザー: wsadmin 、パスワードは $(pwd)/PASSWORD に書いた値でログインする。

```url
https://localhost:9043/ibm/console/login.do?action=secure
```

管理コンソールが起動したら、-v で指定したファイルを使う形で JDBC ドライバー、データソースを作成し、war ファイルをインストールする。
war ファイルは pom.xml で生成した別の場所にあるものでも、管理コンソールでローカル・ファイルを選択することでインストールするのは普通に実行できる。

#### データソース作成時

DB2 のコンテナに固定の IP アドレスを振ったらそれを使えば良いが、振っていない場合は以下のコマンドで IP アドレスがわかるのでそれを指定する。（ただ、起動順で自動で振られる IP は扱いにくいので固定で振るべし)

```bash
docker inspect --format '{{ .NetworkSettings.IPAddress }}' コンテナ名(またはコンテナID)
```

この docker コンテナ間で、自動割り当ての IP アドレスや、追加したネットワークの固定 IP アドレスで通信をする場合 WAS 側のポートとホストのポートは -p 指定で 50000 を何かする必要はない。(もちろん、コンテナをホストのプログラムからアクセスしたければ必要)

# ある程度設定を終えたら

以下のコマンドでイメージをとっておくと、再設定の手間はない。

```bash
docker commit コンテナ名(またはコンテナID) リポジトリ名:タグ名
docker images   # これで確認する
```

これで次回からは設定済みのイメージを起動することができる。既出の ```docker run``` コマンドで起動するリポジトリをここで指定した、リポジトリ名:タグ名 に置き換えれば良い。

# さいごに
デベロッパー向けにベンダーが公式に製品の利用環境を提示してくれるのはとても助かります。今後出荷される fix の追従、 製品の拡充を期待！