Db2 for Docker を動かす
はじめに
どうやら、RDS で Db2 がサポートされたようです。(DB2 ではなくて Db2 なんですね。最近ですかね)
弊社では、各種 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
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 のドライバは、どうやら、これ↓
で、これの中をよく見ると、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
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ブラウザ等からも落とせます。
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 のドライバで接続した評価の記事を予定しています。
Discussion