DB2DBA: Docker上でDb2を動かしてみる

同様の記事は他の方が既に書かれていますが、2019年の夏に公式リポジトリが引っ越ししていたので、情報アップデートしておきます。また、おまけのネタもいくつか試してみました。


# Db2コンテナの起動
公式リポジトリに用意された手順に従ってやってみます。

## docker pull
[ibmcom/db2](https://hub.docker.com/r/ibmcom/db2)からDb2 Developer-Cのイメージをpullします。最新版はDb2 11.5.0.0a、サイズは約3GBでした。

```
alpine39:~$ docker pull ibmcom/db2
Using default tag: latest
latest: Pulling from ibmcom/db2
ac9208207ada: Pull complete
db3b974ae005: Pull complete
8b476cfca586: Pull complete
a033f87212a0: Pull complete
6062ba253339: Pull complete
53d54ba98754: Pull complete
8113895a570d: Pull complete
Digest: sha256:e7055e4ee436e3659fbaafdc8c7fe1088f79658ba851024da68ab4e181085f58
Status: Downloaded newer image for ibmcom/db2:latest
alpine39:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ibmcom/db2          latest              66a976f94954        3 months ago        2.96GB
```

## docker run
```
alpine39:~$ docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=$DB2_PASS -e DBNAME=testdb -v $HOME/db2:/database ibmcom/db2
```

## 起動確認
```docker logs```で以下のメッセージを確認。

```
alpine39:~$ docker logs -f mydb2 | grep Setup
(*) Setup has completed.
```

## Db2コンテナへのログイン
```
alpine39:~$ docker exec -ti mydb2 bash -c "su - db2inst1"
Last login: Tue Oct 15 20:24:11 UTC 2019
[db2inst1@083d58c4beb1 ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.0.0
 SQL authorization ID   = DB2INST1
 Local database alias   = TESTDB
```

非常に簡単にDb2環境が構築できました。導入が必要なパッケージがLinuxディストリビューション毎に異なったりするのを考えなくていいのもよいですね。


# おまけ
## 非特権モードでの起動
[Db2 Docker コンテナーを構築してデプロイする際の考慮事項](https://www.ibm.com/developerworks/jp/library/dm-1602-db2-docker-trs/index.html)によると、```--privileged=true```で全ての特権を付与するのではなく、```‑‑ipc=host ‑‑cap‑add=IPC_OWNER```のみで稼働することが可能とのことです。起動からSQLの実行まで出来ることは確認できました。

```
alpine39:~$ docker run -itd --name mydb2 ‑‑ipc=host ‑‑cap‑add=IPC_OWNER -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=$DB2_PASS -e DBNAME=testdb -v $HOME/db2:/database ibmcom/db2
```

## カスタムイメージの作成
/var/customにシェルスクリプトを配置するとDb2セットアップ後に自動実行してくれるので、ibmcom/db2をベースにカスタムイメージを作成する際に便利です。

### シェルスクリプトの作成
DIAGLEVEL変更のスクリプトを実行させてみます。スクリプトはコンテナ内でrootとして実行されるようです。以下のようにdoker runで設定した変数を渡すことが可能でした。

```shell
#!/bin/bash
. /database/config/db2inst1/sqllib/db2profile

db2 "attach to db2inst1 user db2inst1 using $DB2INST1_PASSWORD"
db2 "get dbm cfg" | grep -i diaglevel
db2 "update dbm cfg using diaglevel 4"
db2 "get dbm cfg" | grep -i diaglevel
db2 "detach"
```

### Dockerfileの作成

```
FROM ibmcom/db2

RUN mkdir /var/custom
COPY dbmcfg.sh /var/custom
RUN chmod a+x /var/custom/dbmcfg.sh
```

### カスタムイメージのビルド
```
alpine39:~$ docker build -t svc34/db2 .
Sending build context to Docker daemon  17.92kB
Step 1/4 : FROM ibmcom/db2
 ---> 66a976f94954
Step 2/4 : RUN mkdir /var/custom
 ---> Using cache
 ---> 3d657013dcb4
Step 3/4 : COPY dbmcfg.sh /var/custom
 ---> 085cacb0945c
Step 4/4 : RUN chmod a+x /var/custom/dbmcfg.sh
 ---> Running in 2273bc79988d
Removing intermediate container 2273bc79988d
 ---> 23d2cc871f34
Successfully built 23d2cc871f34
Successfully tagged svc34/db2:latest
```

### カスタムイメージからの起動
```
docker run -itd --name svc34db2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=$DB2_PASS -v $HOME/db2:/database svc34/db2
```

### スクリプト実行結果の確認
```
alpine39:~$ docker logs svc34db2

(*) Running dbmcfg.sh ...

   Instance Attachment Information

 Instance server        = DB2/LINUXX8664 11.5.0.0
 Authorization ID       = DB2INST1
 Local instance alias   = DB2INST1

 Diagnostic error capture level              (DIAGLEVEL) = 3
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
 Diagnostic error capture level              (DIAGLEVEL) = 4
DB20000I  The DETACH command completed successfully.

```

セットアップ後の設定変更が実行されました。


## ライセンスの変更
Db2のDockerイメージはCommunityライセンスで提供されますが、ライセンスファイルを適用することでStandardエディションやAdvancedエディションとして稼働させることも可能です。

Db2 11.5.0.0aからDockerイメージ内に90日間の試用版ライセンスファイルが同梱されているので、今回はそれを利用してみます。

### 変更前のライセンス
メモリ、コア数、表スペースサイズの制限が設定されています。

```
[db2inst1@083d58c4beb1 ~]$ db2licm -l
Product name:                     "IBM DB2 Developer-C Edition"
License type:                     "Community"
Expiry date:                      "Permanent"
Product identifier:               "db2dec"
Version information:              "11.5"
Max amount of memory (GB):        "16"
Max number of cores:              "4"
Max amount of table space (GB):   "100"
```


### ライセンスファイルの変更
同梱されている試用版ライセンスファイルを適用します。

```
alpine39:~$ docker exec -ti mydb2 bash -c "/opt/ibm/db2/V11.5/adm/db2licm -r db2dec && /opt/ibm/db2/V11.5/adm/db2licm -a /var/db2/db2trial.lic"

LIC1403I  License removed successfully.


LIC1427I  This product is now licensed for use as outlined in your License Agreement.  USE OF THE PRODUCT CONSTITUTES ACCEPTANCE OF THE TERMS OF THE IBM LICENSE AGREEMENT, LOCATED IN THE FOLLOWING DIRECTORY: "/opt/ibm/db2/V11.5/license/en_US.iso88591"

LIC1402I  License added successfully.


LIC1426I  This product is now licensed for use as outlined in your License Agreement.  USE OF THE PRODUCT CONSTITUTES ACCEPTANCE OF THE TERMS OF THE IBM LICENSE AGREEMENT, LOCATED IN THE FOLLOWING DIRECTORY: "/opt/ibm/db2/V11.5/license/en_US.iso88591"
```


### 変更後のライセンス
メモリ、コア数、表スペースサイズの制限がなくなっており、有効期限が設定されています。

```
[db2inst1@083d58c4beb1 ~]$ db2licm -l
Product name:                     "DB2 Advanced Enterprise Server Edition"
License type:                     "Trial"
Expiry date:                      "01/12/2020"
Product identifier:               "db2aese"
Version information:              "11.5"
```

# 参考資料
- [ibmcom/db2](https://hub.docker.com/r/ibmcom/db2)
- [Db2 Docker コンテナーを構築してデプロイする際の考慮事項](https://www.ibm.com/developerworks/jp/library/dm-1602-db2-docker-trs/index.html)