Db2 Developer-Cのコンテナを動かす

## はじめに
Db2 Developer-C エディションとは、開発者向けにDb2のすべてのコア機能を無料で提供するエディションです。正確な情報は以下の資料などを確認してください。
[Db2 データベース製品のエディションおよび Db2 オファリング](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.licensing.doc/doc/c0058536.html)

Docker Hub上で公開されたイメージがあり、これを利用することが可能です。
[Db2 Developer-C Edition@docker hub](https://hub.docker.com/_/db2-developer-c-edition)

仕事で検証する必要がでてきたため、ささっと確認した内容をメモがてら共有します。

## 事前準備
イメージを利用するにはDocker Hubにログインして、使用条件に同意する必要があります。
1. Docker Hubにログインし、[Db2 Developer-C Edition@docker hub](https://hub.docker.com/_/db2-developer-c-edition)を開きます。
2. [Proceed to Checkout]のボタンをクリックします。
3. [Contact Information]を記入します。（FirstName, LastName, Company, Title, Email, Phone Numberなど）
4. 利用条件について確認し、同意できればチェックを入れ、[Get Content]をクリックします。
5. [Copy and paste to pull this image]に表示されたコマンドをコピーします。

## イメージのpull
1. インターネットに接続可能であり、Dockerコマンドが実行可能な端末上で、先ほどコピーしたpullコマンドを実行します
2. ネットワークの接続状況や端末のスペックに依存する可能性がありますが、pullには感覚的に15分から20分ほどかかりました（計測したわけではないので不正確です）

## コンテナ起動の準備手順
### envファイルの用意
下記の項目が設定可能です。（最新情報は製品情報などを確認してください。）

```ruby:.env_list
LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=testdb
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=false
REPODB=false
IS_OSXFS=false
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=
```

### 起動
```cmd:
$ docker run --name db2server --restart=always --detach --privileged=true -p 50000 --env-file ./db2.env store/ibmcorp/db2_developer_c:{Tag}  
a41146e4187493ccf2835889fb5d75051e6fc627e663a2f2f042a5d76ce14fcb
$ 
$ docker ps
CONTAINER ID        IMAGE                                                           COMMAND                  CREATED             STATUS              PORTS                                                          NAMES
a41146e41874        store/ibmcorp/db2_developer_c:{Tag}                   "/var/db2_setup/lib/…"   3 seconds ago       Up 2 seconds        22/tcp, 55000/tcp, 60006-60007/tcp, 0.0.0.0:32777->50000/tcp   db2server
$
```

## データベースとテーブルの初期セットアップ
ガイドの内容も参照しながら試行錯誤した手順を紹介します。
### 初期データベースの作成
CREATE DATABASEしたい場合は、.envに定義しDocker runのタイミングで読み込ませると作成できました。（CREATE DATABASEをシェルで実行する処理に組み込むと、USER ROOTにはその権限はありません、というエラー。DockerfileのUSERで切り替える等もできないようでした。）

```ruby:.env_list（抜粋）
# create an initial database with the name provided or leave empty
 DBNAME=testdb
```

### 初期データの投入処理
- Docker run時に初期設定したい処理がある場合は、scriptを用意し、/var/customにshell scriptをCOPYする
- shellで読み込ませる処理はCONNECT TO {database}以降の処理
- shellでDB2コマンドを実行させるために「db2profile」を実行したかったがpathがわからなかった。execで入ってfindして確認した。（イメージのバージョンが上がると変わる可能性あり。）

```Dockerfile:Dockerfile
FROM store/ibmcorp/db2_developer_c:XX.X.X.X-x86_64

RUN mkdir /var/custom && mkdir /var/mysql
COPY setupdb.sh /var/custom/
COPY db2.sql /var/mysql
RUN chmod a+x /var/custom/setupdb.sh && chmod a+x /var/mysql/db2.sql
```


```shell:setupdb.sh
#!/bin/bash
set -e
. /database/config/db2inst1/sqllib/db2profile
db2 -stvf /var/mysql/db2.sql
```
※db2profileはbashかKorn shell前提
https://www.ibm.com/support/knowledgecenter/en/SS4Q96_6.1.1/com.ibm.help.scc.install.doc/SCC_Create_DB2_DB_From_Scripts.html


```sql:db2.sql
CONNECT TO testdb;

CREATE TABLE access_event
  (
    timestmp          BIGINT NOT NULL,
    requestURI        VARCHAR(254),
    requestURL        VARCHAR(254),
    remoteHost        VARCHAR(254),
    remoteUser        VARCHAR(254),
    remoteAddr        VARCHAR(254),
    protocol          VARCHAR(254),
    method            VARCHAR(254),
    serverName        VARCHAR(254),
    postContent       VARCHAR(254),
    event_id          INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1)
  );

CREATE TABLE access_event_header
  (
    event_id          INTEGER NOT NULL,
    header_key        VARCHAR(254) NOT NULL,
    header_value      VARCHAR(1024),
    PRIMARY KEY(event_id, header_key)
);

CONNECT RESET;
```

## コンテナ起動
今回は簡易検証だっため、永続化などは特にせずです。

```cmd
$ docker run --name ${container_name} --env-file db2.env --restart=always --detach --privileged=true -p 50000 ${image_name}:${tag}
```


上記のようにコマンドを実行するとコンテナが起動する。
docker logsコマンドでtableの作成などが正常に完了したか確認する。

## 今後の課題
- チュー二ニング方法は要調査。
  - Docker runで完全にDBが起動するまで、docker logsコマンドで確認すると数分かかってしまっていた。
.envで余計な処理も有効にしてしまっていたのかもしれない。