Docker上で DB2 を使うべく、色々試した結果です。
オフィシャルのイメージは使わず、自分で構築してみます。
応答ファイル
db2setupコマンドに渡す応答ファイルは以下としました。
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コマンドでやったらうまくいってる。なぜ?
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で公開しました。
11.5.X.X
久しぶりにDB2をいじっています。11.5.8.0をまっさらな環境にインストールしようとしているが、どうも動かない。仕方がないのでオフィシャルイメージをベースに環境構築を試みています。
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にバージョンアップ。