DB2 on Docker

Docker上で DB2 を使うべく、色々試した結果です。
オフィシャルのイメージは使わず、自分で構築してみます。

# 応答ファイル
db2setupコマンドに渡す応答ファイルは以下としました。

```db2expcJP.rsp
PROD                      = EXPRESS_C
LIC_AGREEMENT             = accept
FILE                      = /opt/ibm/db2/V11.1
LANG                      = JP
INSTANCE                  = DB2_INST
DB2_INST.NAME             = db2inst1
DB2_INST.PASSWORD         = db2inst1
DB2_INST.UID              = 501
DB2_INST.GID              = 501
DB2_INST.GROUP_NAME       = db2grp1
DB2_INST.HOME_DIRECTORY   = /home/db2inst1
DB2_INST.SVCENAME         = db2c_db2inst1
DB2_INST.PORT_NUMBER      = 50000
DB2_INST.FCM_PORT_NUMBER  = 60000
DB2_INST.MAX_LOGICAL_NODES = 4
DB2_INST.FENCED_USERNAME  = db2fenc1
DB2_INST.FENCED_PASSWORD  = db2fenc1
DB2_INST.FENCED_UID       = 601
DB2_INST.FENCED_GID       = 601
DB2_INST.FENCED_GROUP_NAME = db2fenc1
DB2_INST.FENCED_HOME_DIRECTORY = /home/db2fenc1
DB2_INST.CONFIGURE_TEXT_SEARCH = NO
```

# Dockerfile
応答ファイル(db2expcJP.rsp)とインストールモジュール(v11.1_linuxx64_expc.tar.gz)を用いて、DB2 Express-CをインストールするDockerfileを作成した。
手動でdb2setupでセットアップを実行したとき、エラーになったんだけど、RUNコマンドでやったらうまくいってる。なぜ？

```docker:Dockerfile
FROM ubuntu:20.04

RUN dpkg --add-architecture i386 \
    && apt-get update \
    && apt-get install -y \
       aria2 \
       libaio1 \
       binutils \
       file \
       libx32stdc++6 \
       numactl \
       libpam0g:i386 \
       language-pack-ja tzdata \
    && update-locale LANG=ja_JP.UTF-8 \
    && rm -rf /var/lib/apt/lists/* \
    && echo "${TZ}" > /etc/timezone \
    && rm -f /etc/localtime \
    && ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && dpkg-reconfigure -f noninteractive tzdata \
    && groupadd --gid 501 db2grp1 \
    && useradd --gid db2grp1 --uid 501 --shell /bin/bash -m db2inst1 \
    && groupadd --gid 601 db2fenc1 \
    && useradd --gid db2fenc1 --uid 601 --shell /bin/bash -m db2fenc1
ADD v11.1_linuxx64_expc.tar.gz /tmp
COPY db2expcJP.rsp /tmp/expc
ENV LANG=ja_JP.utf8
RUN /tmp/expc/db2setup -r /tmp/expc/db2expcJP.rsp && rm -rf /tmp/*
EXPOSE 50000
```
動かしてみる。

```
C:\kazu_DB2\build>docker run -it --rm --privileged=true kazu_db2:11.1.4.4 bash
root@8ae39f020d64:/# su - db2inst1
db2inst1@8ae39f020d64:~$ db2start
SQL1063N  DB2START の処理が正常に終了しました。
db2inst1@8ae39f020d64:~$ db2 create database test
DB20000I  CREATE DATABASE コマンドが正常に完了しました。
db2inst1@8ae39f020d64:~$ db2 connect to test

   データベース接続情報

 データベース・サーバー = DB2/LINUXX8664 11.1.4.4
 SQL 許可 ID            = DB2INST1
 ローカル・データベース別名 = TEST

db2inst1@8ae39f020d64:~$ db2
(c) Copyright IBM Corporation 1993,2007
DB2 クライアント 11.1.4.4 コマンド行プロセッサー

コマンド・プロンプトからデータベース・マネージャーのコ
マンド、 および SQL ステートメントを呼び出せます。 例:
    db2 => connect to sample
    db2 => bind sample.bnd

一般ヘルプには ? をタイプしてください。
コマンドのヘルプには ? command をタイプしてください。
command には、データベース・マネージャー・コマンドの
最初のいくつかのキーワードを入力します。 例:
 ? CATALOG DATABASE は CATALOG DATABASE コマンドのヘルプです。
 ? CATALOG          は全 CATALOG コマンドのヘルプです。

db2 対話モードを抜けるには、コマンド・プロンプトで QUIT
とタイプしてください。
対話モード以外では、すべてのコマンドに接頭語 'db2'
を付ける必要があります。
現在のコマンド・オプションの設定をリストするには、
LIST COMMAND OPTIONS とタイプしてください。

詳細は、「オンライン・リファレンス」を参照してください
。

db2 => create table abc (f1 varchar(10))
DB20000I  SQL コマンドが正常に完了しました。
db2 => insert into abc values('ABC')
DB20000I  SQL コマンドが正常に完了しました。
db2 => insert into abc values('XYZ')
DB20000I  SQL コマンドが正常に完了しました。
db2 => select * from abc

F1
----------
ABC
XYZ

  2 レコードが選択されました。

db2 => terminate
DB20000I  TERMINATE コマンドが正常に完了しました。
db2inst1@8ae39f020d64:~$ db2stop
SQL1064N  DB2STOP の処理が正常に終了しました。
db2inst1@8ae39f020d64:~$
```
Dockerfileと応答ファイル(db2expcJP.rsp)を[github](https://github.com/suzanHud/DB2.git)で公開しました。

# 11.5.X.X
久しぶりにDB2をいじっています。11.5.8.0をまっさらな環境にインストールしようとしているが、どうも動かない。仕方がないのでオフィシャルイメージをベースに環境構築を試みています。

```docker:Dockerfile
FROM ibmcom/db2 as intermediate

FROM centos:7
# from intermediate image copy installation and db2 registry leaving out the installation image
  COPY --from=intermediate /opt /opt
  RUN mkdir -p  /var/db2
  COPY --from=intermediate /var/db2 /var/db2

# update system and install DB2 dependencies again
  RUN yum -y update ; yum -y install file libaio numactl libstdc++.so.6 pam-devel ksh pam-devel.i686 'compat-libstdc++-33-3.2.3-72.*'
  RUN rm /etc/localtime; ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
  RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
  ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"
  RUN useradd db2inst1; groupadd db2iadm1; gpasswd -a db2inst1 db2iadm1
  RUN groupadd db2fadm1; useradd -u 1003 -g db2fadm1 -m -d /home/db2fenc1 db2fenc1
  RUN /opt/ibm/db2/V11.5/instance/db2icrt -u db2fenc1 db2inst1
```
これで作ったイメージでdb2startする前にノード構成ファイル ($INST_HOME/sqllib/db2nodes.cfg)を修正します。2番目のホスト名がdocker build用のホスト名(buildkitsandbox)になっているのでコンテナのホスト名に修正します。

```
[db2inst1@95c01e588ba8 sqllib]$ db2start
01/12/2022 16:50:55     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
[db2inst1@95c01e588ba8 sqllib]$
```

ノード構成ファイル ($INST_HOME/sqllib/db2nodes.cfg)を変更しなくて済む手段を考えました。
・Dockerfileでノード構成ファイルのホスト名を変更する。

```
RUN echo '0 db2 0' > /home/db2inst1/sqllib/db2nodes.cfg
```
Dockerでrunするときに-hオプションでホスト名を指定する。

```
docker run -it -h db2 --privileged=true --name="db2inst1" -p 50000:50000 kazu_db2
```

##変更履歴
(2019/6/4)db2setupの実行を1回とするよう修正。
(2019/6/4)ベースのOS Versionを18.04に修正。
(2019/6/5)ベースのOS Versionを19.10に修正。
(2019/6/5)追加ユーザのログインシェルに/bin/bashを指定。
(2019/6/5)インストール後不要ファイルの削除を追加。
(2019/7/21)githubにファイルを登録しました。
(2020/5/23)ベースのOS Versionを20.04に変更。
(2022/1/12)DB2で11.5.7.0を試した結果を追加。ノード構成ファイル のホスト名更新の記述を追加。
(2022/12/23)DB2を11.5.8.0にバージョンアップ。