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

無料でdocker hubから取得できる[Db2 docker image](https://hub.docker.com/r/ibmcom/db2)を使用して、[Db2 on Cloud](https://cloud.ibm.com/catalog/services/db2#about)の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接続情報取得](https://qiita.com/nishikyon/items/69fee851849e7ef7e163)も参照してみてください。(2022/7/7追記)

接続情報(ホスト名、ポート番号、データベース名、Liteプランの場合はuseridとpasswordも)とSSL証明書ファイルをweb consoleから取得しておきます。
### Standardプラン(多分Enterpriseも同様)の場合
1. Db2 Webコンソールを開いて、左側のメニューから歯車のアイコン、「管理」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c3fb0efa-7138-9a6d-29be-818d4a502e89.png)

2. 上部メニューから接続をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b828eb10-7795-c0a0-b8f4-cdda52e13160.png)

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

4. SSL証明書をダウンロードする（通常不要　2022/7/7 追記）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b757956c-2579-4154-ddf1-bdd76b2ef7cc.png)


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

### IBM Cloudコンソール管理機能から資格情報を作成する場合(Liteプラン含む)
1.　IBM Cloudのダッシュボードの右上のメニューから「リソース・リスト」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/f75825b6-3306-bbb0-6ad9-973bb3315b0b.png)


2. 「Services」をクリックして開き、接続したいDb2の名前をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/397edaac-8fa7-5029-6701-d159eed8be59.png)

3.「サービス資格情報」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/4eece130-a691-327e-e749-35215ab97751.png)

4. 資格情報がない場合は、「新規資格情報」をクリックして作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/dd09a142-430f-5c36-9ed5-13605242b681.png)
名前を変更したい場合は変更して、「追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c9ca4dae-3f43-e760-1121-5704880cf335.png)

5.表示されたサービス資格情報をクリックして、内容を表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e743b16d-6580-f805-edb0-ad55707828a4.png)

6. `username`と`password `の値を取得
これが接続時に使用するuseridとpasswordになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/3125771d-f194-5041-9aae-3d88a87e42f4.png)




7. Db2　Webコンソールを開き、右上のメニューをクリックし、「CONNECTION INFO」→「Connection Information」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/221f7f97-fb3c-55eb-7264-9e97289dae83.png)


8. 以下を選択する
 - SSLで接続する場合は`With SSL`
 - SSLなしで接続する場合は`Withｏｕｔ SSL`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/2d9b69e3-8475-dc1c-0aa5-4a0a736ae084.png)

9. 表示された以下の値をテキストファイルなどにコピーする。
 - Host name
 - Port number
 - Database name

10. SSL接続の場合は、SSL証明書をダウンロードする (通常不要 2022/7/7追記)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/20fafbc5-47cc-2d60-0d7f-4694621e829b.png)



# 3. 手順
## 1. Docker imageの作成と起動
以下のコマンドでDocker imageを作成します。
-eで指定する環境変数の詳細は[ここ](https://hub.docker.com/r/ibmcom/db2)の **`Advanced Configuration Options`** を参照してください。Windowsの場合は`PERSISTENT_HOME=false`が追加で指定する必要がありそうです。

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

  - &lt;自分で決めたインスタンスのパスワード&gt;
  - &lt;dockerコンテナにマウントする自分のPC上のDirのパス&gt;

`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`の作成が必要です):

  - &lt;自分で決めたインスタンスのパスワード&gt;: `Passw0rd`
  - &lt;dockerコンテナにマウントする自分のPC上のDirのパス&gt;: `~/db2docker_data`

```sh
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`で抜けてください。

```sh
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`の場合

```sh
cp DigiCertGlobalRootCA.crt ~/db2docker_data
```

### 3.2 docker コンテナにログイン

```sh
docker exec -ti mydb2 bash -c "su - db2inst1"
```

### 3.3 SSL keydb用のDirを作成
名前は任意でよいですが、ここでは以下のように作成し、そのまま設定します。名前を変更した場合は随時コマンドは置き換えてください。

```sh
mkdir db2_ssl
```

作成したDirにcdします。

```sh
cd db2_ssl
```

### 3.4 SSL keydbを作成し、db managerに登録

pwは任意の文字列に変更して実行してください。

```ssh
gsk8capicmd_64 -keydb -create -db db2_ssl_client.kdb -pw Passw0rd -stash
```

3.1でコピーしたSSL証明書のファイル名に最後の`DigiCertGlobalRootCA.crt`は変更してください。接続先が2個以上などSSL証明書のファイルが2個以上ある場合は-labelを変更して個数分実行します。

```ssh
gsk8capicmd_64 -cert -add -db db2_ssl_client.kdb -pw Passw0rd -label BLUDB_SSL -file /mypc/DigiCertGlobalRootCA.crt 
```

db managerに登録します。

```sh
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.事前準備](#2-事前準備)で取得したものを使用します。
&lt;任意のnode名&gt;は2つのコマンドで同じにします(8文字以内)。
&lt;任意のDB別名&gt; はデータベース名と同じにしても問題ありません。DB接続時に使用する名前です(8文字以内)。接続先が異なる同じDB名のDBがある場合は、それぞれユニークになるような別名にします。

`db2 catalog tcpip node <任意のnode名> remote <ホスト名> server <ポート番号> security ssl`

`db2 catalog db <データベース名> as <任意のDB別名> at node <任意のnode名>
`

コマンド例

```sh
db2 catalog tcpip node BLUNODE remote xxxxx.yyyyy.databases.appdomain.cloud server 30049 security ssl
db2 catalog db bludb as bludb at node BLUNODE
```

最後にキャッシュをリフレッシュするため、以下のコマンドを実行します。

```sh
db2 terminate
```

## 5. dbに接続
Liteプランの場合はuserid, passwordは[2.事前準備](#2-事前準備)で取得したものを使用します。

`db2 connect to <DB別名> user <userid> using <password>`

例：

```sh
db2 connect to bludb user nishito using xxxxxxx
```

## 6. コンテナからexit
作業が終了したらコンテナからexitします。

```sh
exit
```

#4. その後のコンテナの扱い
##4.1. コンテナを止めておく
メモリーも食うので、使わない時は止めておきます。

```sh
docker stop mydb2
```

## 4.2. 止めておいたコンテナを起動
使うときに起動します。

```sh
docker start mydb2
```

## 4.3. 起動しているコンテナにログイン
コンテナは起動させた状態で実行します。

```sh
docker exec -ti mydb2 bash -c "su - db2inst1"
```

## 4.4. 作成したコンテナを削除
もう使わない、作り直したい等で削除したい場合は、以下のコマンドで削除します。
コンテナは停止させた状態で実行します。

```sh
docker rm mydb2
```

以上です。