無料でdocker hubから取得できるDb2 docker imageを使用して、Db2 on CloudのDBに接続する方法です。 Macからdb2コマンドが使いたい、という方にも有用です。またDb2 on CloudのみならずTCPIP接続できるDb2であれば同じように設定して使用できます。
尚、Db2 docker imageはDb2そのものなので、そこにDBを作成することもできますが、当記事ではあくまでもDb2 on Cloudに接続することのみを目的とし、DB作成は行いません。
この記事はMac Catalinaの環境で実施しました。
1. 前提
dockerが既に導入済みでdocker
コマンドが実行できること。
docker未導入の方はこちらからダウンロード可能です: https://docs.docker.com/get-docker/
2. 事前準備
下記の画面はちょっと古いので
Db2 on CloudのDB接続情報取得も参照してみてください。(2022/7/7追記)
接続情報(ホスト名、ポート番号、データベース名、Liteプランの場合はuseridとpasswordも)とSSL証明書ファイルをweb consoleから取得しておきます。
Standardプラン(多分Enterpriseも同様)の場合
-
「アプリとクライアントを IBM Db2 on Cloud に接続」画面の「接続構成リソース」 にある以下の値をテキストファイルなどにコピーする
- ホスト名
- ポート番号
- データベース名
- SSL証明書をダウンロードする(通常不要 2022/7/7 追記)
Standardの場合はdb2に接続するuseridとpasswordは自分のもの、あるいはDb2 Webコンソール管理者機能で作成したものが使用できます。またはLiteプランと同様にIBM Cloudコンソールから資格情報を作成・参照することで取得できます。
IBM Cloudコンソール管理機能から資格情報を作成する場合(Liteプラン含む)
1. IBM Cloudのダッシュボードの右上のメニューから「リソース・リスト」を選択
5.表示されたサービス資格情報をクリックして、内容を表示する。
- 表示された以下の値をテキストファイルなどにコピーする。
- Host name
- Port number
- Database name
3. 手順
1. Docker imageの作成と起動
以下のコマンドでDocker imageを作成します。
-eで指定する環境変数の詳細はここの Advanced Configuration Options
を参照してください。Windowsの場合はPERSISTENT_HOME=false
が追加で指定する必要がありそうです。
<>
で囲まれた部分は自分で値を入れる必要があります。
- <自分で決めたインスタンスのパスワード>
- <dockerコンテナにマウントする自分のPC上のDirのパス>
docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=<自分で決めたインスタンスのパスワード> -v <dockerコンテナにマウントする自分のPC上のDirのパス>:/mypc ibmcom/db2
Macでの実行例(実行前に~/db2docker_data
の作成が必要です):
- <自分で決めたインスタンスのパスワード>:
Passw0rd
- <dockerコンテナにマウントする自分のPC上のDirのパス>:
~/db2docker_data
docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=Passw0rd -v ~/db2docker_data:/mypc ibmcom/db2
2. 状況確認
以下のコマンドの出力に、Setup has completed
と出力されていれば作成成功です。コマンドはCtrl+C
で抜けてください。
docker logs -f mydb2
3. SSL証明書の設定 (通常不要)
(2022/7/7 追記): 最近IBM DB2製品からのDb2 on Cloudへの接続にはSSL証明書の設定は不要になりました。 よって以下は通常不要です。
StandardまたはEnterpriseプランはSSL接続が必須です。以下の手順を実施してください。
LiteプランでもSSL接続する場合は以下の手順を実施してください。
3.1 ダウンロードしたSSL証明書ファイルを手順#1で指定したdockerコンテナにマウントする自分のPC上のDirのパス
にコピーする。
例:
-
dockerコンテナにマウントする自分のPC上のDirのパス
:~/db2docker_data
- SSL証明書のファイル
DigiCertGlobalRootCA.crt
の場合
cp DigiCertGlobalRootCA.crt ~/db2docker_data
3.2 docker コンテナにログイン
docker exec -ti mydb2 bash -c "su - db2inst1"
3.3 SSL keydb用のDirを作成
名前は任意でよいですが、ここでは以下のように作成し、そのまま設定します。名前を変更した場合は随時コマンドは置き換えてください。
mkdir db2_ssl
作成したDirにcdします。
cd db2_ssl
3.4 SSL keydbを作成し、db managerに登録
pwは任意の文字列に変更して実行してください。
gsk8capicmd_64 -keydb -create -db db2_ssl_client.kdb -pw Passw0rd -stash
3.1でコピーしたSSL証明書のファイル名に最後のDigiCertGlobalRootCA.crt
は変更してください。接続先が2個以上などSSL証明書のファイルが2個以上ある場合は-labelを変更して個数分実行します。
gsk8capicmd_64 -cert -add -db db2_ssl_client.kdb -pw Passw0rd -label BLUDB_SSL -file /mypc/DigiCertGlobalRootCA.crt
db managerに登録します。
db2 update dbm cfg using SSL_CLNT_KEYDB /database/config/db2inst1/db2_ssl/db2_ssl_client.kdb
db2 update dbm cfg using SSL_CLNT_STASH /database/config/db2inst1/db2_ssl/db2_ssl_client.sth
4. nodeとdbを登録
ホスト名、データベース名、ポート番号は2.事前準備で取得したものを使用します。
<任意のnode名>は2つのコマンドで同じにします(8文字以内)。
<任意のDB別名> はデータベース名と同じにしても問題ありません。DB接続時に使用する名前です(8文字以内)。接続先が異なる同じDB名のDBがある場合は、それぞれユニークになるような別名にします。
db2 catalog tcpip node <任意のnode名> remote <ホスト名> server <ポート番号> security ssl
db2 catalog db <データベース名> as <任意のDB別名> at node <任意のnode名>
コマンド例
db2 catalog tcpip node BLUNODE remote xxxxx.yyyyy.databases.appdomain.cloud server 30049 security ssl
db2 catalog db bludb as bludb at node BLUNODE
最後にキャッシュをリフレッシュするため、以下のコマンドを実行します。
db2 terminate
5. dbに接続
Liteプランの場合はuserid, passwordは2.事前準備で取得したものを使用します。
db2 connect to <DB別名> user <userid> using <password>
例:
db2 connect to bludb user nishito using xxxxxxx
6. コンテナからexit
作業が終了したらコンテナからexitします。
exit
#4. その後のコンテナの扱い
##4.1. コンテナを止めておく
メモリーも食うので、使わない時は止めておきます。
docker stop mydb2
4.2. 止めておいたコンテナを起動
使うときに起動します。
docker start mydb2
4.3. 起動しているコンテナにログイン
コンテナは起動させた状態で実行します。
docker exec -ti mydb2 bash -c "su - db2inst1"
4.4. 作成したコンテナを削除
もう使わない、作り直したい等で削除したい場合は、以下のコマンドで削除します。
コンテナは停止させた状態で実行します。
docker rm mydb2
以上です。