Db2 docker から Db2 on CloudのDBに接続


無料で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. 事前準備

接続情報(ホスト名、ポート番号、データベース名、Liteプランの場合はuseridとpasswordも)とSSL証明書ファイルをweb consoleから取得しておきます。

Standardプラン(多分Enterpriseも同様)の場合

  1. Db2 Webコンソールを開いて、左側のメニューから歯車のアイコン、「管理」をクリック

  2. 上部メニューから接続をクリック

  3. 「アプリとクライアントを IBM Db2 on Cloud に接続」画面の「接続構成リソース」 にある以下の値をテキストファイルなどにコピーする

    • ホスト名
    • ポート番号
    • データベース名
  4. SSL証明書をダウンロードする

Standardの場合はdb2に接続するuseridとpasswordは自分のもの、あるいはDb2 Webコンソール管理者機能で作成したものが使用できます。またはLiteプランと同様にIBM Cloudコンソールから資格情報を作成・参照することで取得できます。

Liteプランの場合

1. IBM Cloudのダッシュボードの右上のメニューから「リソース・リスト」を選択

  1. 「Services」をクリックして開き、接続したいDb2の名前をクリック

3.「サービス資格情報」をクリック

  1. 資格情報がない場合は、「新規資格情報」をクリックして作成する 名前を変更したい場合は変更して、「追加」をクリック

5.表示されたサービス資格情報をクリックして、内容を表示する。

  1. usernamepasswordの値を取得
    これが接続時に使用するuseidとpasswordになります

  2. Db2 Webコンソールを開き、右上のメニューをクリックし、「CONNECTION INFO」→「Connection Information」をクリックする

  3. 以下を選択する

    • SSLで接続する場合はWith SSL
    • SSLなしで接続する場合はWithout SSL
  4. 表示された以下の値をテキストファイルなどにコピーする。

    • Host name
    • Port number
    • Database name
  5. SSL接続の場合は、SSL証明書をダウンロードする

3. 手順

1. Docker imageの作成と起動

以下のコマンドでDocker imageを作成します。
-eで指定する環境変数の詳細はここAdvanced Configuration Optionsを参照してください。Windowsの場合はPERSISTENT_HOME=falseが追加で指定する必要がありそうです。

<>で囲まれた部分は自分で値を入れる必要があります。

  • <自分で決めたインスタンスのパスワード>
  • <dokerコンテナにマウントする自分のPC上のDirのパス>

docker run -itd --name mydb2 --privileged=true -p 50000:50000 -e LICENSE=accept -e DB2INST1_PASSWORD=<自分で決めたインスタンスのパスワード> -v <dokerコンテナにマウントする自分のPC上のDirのパス>:/mypc ibmcom/db2

Macでの実行例(実行前に~/db2docker_dataの作成が必要です):

  • <自分で決めたインスタンスのパスワード>: Passw0rd
  • <dokerコンテナにマウントする自分の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証明書の設定

StandardまたはEnterpriseプランはSSL接続が必須です。以下の手順を実施してください。
LiteプランでもSSL接続する場合は以下の手順を実施してください。

3.1 ダウンロードしたSSL証明書ファイルを手順#1で指定したdokerコンテナにマウントする自分のPC上のDirのパスにコピーする。

例:

  • dokerコンテナにマウントする自分の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

以上です。