Db2 for Docker を動かす

2023/12/16に公開

はじめに

どうやら、RDS で Db2 がサポートされたようです。(DB2 ではなくて Db2 なんですね。最近ですかね)

https://jp.newsroom.ibm.com/2023-12-05-IBM-Collaborates-with-AWS-to-Launch-a-New-Cloud-Database-Offering

弊社では、各種 RDBMS のテスト環境を RDS で用意しているので、これは試しておくかなと見てみたのですが、対象は、Standard 版と Advanced 版で、Community 版は対象外でした。

でも、折角やる気になったことでもあるので、Community 版を試してみることにしました。

やってみた

Community 版には、Docker イメージもあったので、これがいいんじゃん。RDS じゃなくても、ECS + EFS を上げ下げすれば良いかも。ということでやってみました。

最終目標は、ECS + EFS で Db2 だった(ネタバレ的には動きませんでした)のですが、まずは、EC2 から。

Amazon Linux 2023

全く関係ないのですが、lambda の runtime として provided.al2023 がサポートされるようになったので、Node.js 問題やら、golang 1.20 の glibc 問題とかを過去のものにするため、Amazon Linux 2023 にお引越しを始めたところでもあり、まぁ、壊れたらサクッとスクラップ&ビルドしちゃえということで、Amazon Linux 2023 です。

まぁ、だいたいココに書いてあるとおりにやれば動きます。

$ cd ~/work
$ mkdir db2
$ cd db2
$ mkdir Docker
$ cd Docker
$ vi .env_list
.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=
$ docker pull icr.io/db2_community/db2
$ docker run -h  db2server --name db2server --restart=always --detach --privileged=true -p 50000:50000 --env-file .env_list -v ~/work/db2/Docker:/database icr.io/db2_community/db2

これで動くのですが、ココにサンプルDB も作れるよと書いてあるので、じゃやりますか。ということで。

$ docker exec -ti db2server bash -c "su - db2inst1"

ここからコンテナの中で、

$ db2sampl -force -sql
$ db2 connect to sample
$ db2 "select * from department"
$ db2 "select * from department fetch first 1 rows only"
$ db2 connect reset
$ exit

などとして動いているのが確認できます。
ここまでで満足であれば、後は、以下のように片づけます。さようなら。

$ docker stop db2server
$ docker rm db2server
$ docker images
$ docker rmi "上のimageid"

もうちょっとお付き合い頂ける場合は、以下のように停止と開始ができます。

$ docker stop db2server
$ docker start db2server

odbc cli driver

別記事にしたいと思いますが、はじめにで、テストしていると書いた製品は、golang 製なので、golang から Db2 にアクセスするのですが、golang のドライバは、どうやら、これ↓

https://github.com/ibmdb/go_ibm_db

で、これの中をよく見ると、IBM Data Server Driver for ODBC and CLI のライブラリと cgo しているようです。ということで、上記の golang ドライバの中で odbc ドライバをインストールしているプログラム(なんともわかりにくい)がインストールしている方法を解読して、Amazon Linux 2023 x64 版にインストールしてみます。

$ cd ~/work/db2
$ wget https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/linuxx64_odbc_cli.tar.gz
$ tar xvzf linuxx64_odbc_cli.tar.gz
$ vi ~/.bash_profile
.bash_profile
export IBM_DB_HOME=~/work/db2/clidriver
export CGO_CFLAGS=-I$IBM_DB_HOME/include
export CGO_LDFLAGS=-L$IBM_DB_HOME/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$IBM_DB_HOME/lib
export PATH=$PATH:$IBM_DB_HOME/bin
$ db2cli validate -database SAMPLE:localhost:50000 -connect -user db2inst1 -passwd password

Windows(Amazon WorkSpaces)

ODBC だったら、Windows 上の A5:SQL からでも行けるんじゃね?ということで、Windows です。Windows 用のドライバはWebブラウザ等からも落とせます。

https://public.dhe.ibm.com/ibmdl/export/pub/software/data/db2/drivers/odbc_cli/

zip で落として、展開して、PATH に追加すると動きます。

> db2cli validate -database SAMPLE:localhost:50000 -connect -user db2inst1 -passwd password

ここで、localhost なのは、VSCode の Remote Development のポート転送を使っているからですが、これも後でハマります。

さて、ODBC ドライバを Windows に認識させるためには、コマンドプロンプトを「管理者として実行」します。

> db2cli install -setup

これを「管理者として実行」しなくてもエラーとかにならず、ただただ ODBC ドライバが登録されずに途方にくれます。そして、A5:SQL から接続するのですが、先ほどのネタバレのとおり、VSCode のポート転送ではダメで、Db2 コンテナを動かした Linux の IPアドレスを指定すると接続できます。

ECS + EFS

さて、ECS ですが、ECS の設定を EC2 上の docker コマンドと同様にしたら動きそうなものですが、残念ながら、動きませんでした。たぶん、以下のログの部分がダメなのだと思います。

(*) Remounting /database with suid... 
mount: /database: permission denied.
(*) Nothing appears in the Db2 directory. will skip update/upgrade.
(*) Code level is the same. No update/upgrade needed.
DB2 State : Operable
DB2 has not been started

で、EFS を mount させたのが悪いと思って、動いているタイミングで EC2 側でも /database に mount させた EFS を見ていると、ディレクトリ構造もファイルもできているので、単に EFS の設定が悪いという問題でもなさそうですが、ここでタイムオーバーでギブアップすることにしました。

おわりに

Db2 の Docker コンテナを動かすこと自体は、各種ドキュメントの間違いなどを除けば、それほど難しくはなかったのですが、残念ながら ECS 化はできませんでした。

次回は、Db2 が動いたので、golang のドライバで接続した評価の記事を予定しています。

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion