RHEL9.4でDb2 Community Edition Docker イメージを動かす

以前「[M1 Mac上でcolimaを使ってDb2 Community Edition Docker イメージを動かす](https://qiita.com/nishikyon/items/553b5c4dff473d9b6322)」という記事を投稿しましたが、最近MacではなくRHEL9.4で動かすことが多くなったので、その手順です。最後の方は以前のMac版とほぼ同じです。お手軽にDb2 Client代わりにしています（ただしrootで動かしてしまってます）。

参考:
[Installing the Db2 Community Edition Docker image on Linux systems](https://www.ibm.com/docs/en/db2/12.1?topic=system-linux)


# 1. Docker (podman)のセットアップ
既にセットアップ済みの場合は次の手順「[2. ICR(IBM Cloud Registry) から Db2 Dockerイメージをpull](#2-icribm-cloud-registry-から-db2-dockerイメージをpull)」に進んでください。
参考: https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html-single/building_running_and_managing_containers/index#proc_getting-container-tools_assembly_starting-with-containers

以下rootで実施するか、`sudo `をコマンドの最初につけて実施してください。

## 1.1 container-tools メタパッケージをインストール
`podman`、`buildah`、`skopeo`が導入されるようです。
```
dnf install -y container-tools
```
ただDb2 Community Edition Docker イメージを動かすだけなら、`podman`のみでもいいので、**`podman`のみ導入したい方は以下のコマンドで導入してください**.

```
dnf install -y podman
```

## 1.2 podman-docker パッケージをインストール
podman-docker パッケージは、Docker コマンドラインインターフェイスと docker-api を、同等の Podman コマンドに置き換えます。　Db2ドキュメントはdockerコマンドで書かれているので、こちらも導入しておきます。この記事でもこの先はdockerコマンドで記載しています。

```
dnf install -y podman-docker
```

# 2. ICR(IBM Cloud Registry) から Db2 Dockerイメージをpull
最新版のDb2 Dockerイメージをpullする場合は、以下のコマンドを実行します。
以下rootで実施するか、`sudo `をコマンドの最初につけて実施してください。



```
docker pull icr.io/db2_community/db2
```
2025年3月20日現在の最新版(latest)は12.1.1.0でした。

最新版ではなく特定のバージョンをpullする場合は、「[IBM Cloud Container Registryで提供されているDb2関連のコンテナイメージの一覧とタグ(version)を確認する](https://qiita.com/nishikyon/items/287dffa8459532806a15)」の方法で取得可能なバージョンを確認し、バージョンを指定して、pullします。

2025年3月20日現在の取得可能なバージョンを以下でした:
```
$ ibmcloud cr image-list  --restrict db2_community/db2
イメージをリストしています...

リポジトリー               タグ       ダイジェスト   名前空間        作成日   サイズ   セキュリティー状況
icr.io/db2_community/db2   11.5.5.1   5a15bb3886be   db2_community   -        1.1 kB   -
icr.io/db2_community/db2   11.5.8.0   9002c04b6c0f   db2_community   -        1.1 kB   -
icr.io/db2_community/db2   11.5.9.0   77095d4e04cf   db2_community   -        1.1 kB   -
icr.io/db2_community/db2   12.1.0.0   feaf79431bed   db2_community   -        1.1 kB   -
icr.io/db2_community/db2   12.1.1.0   03654bfdf2f5   db2_community   -        1.1 kB   -
icr.io/db2_community/db2   latest     03654bfdf2f5   db2_community   -        1.1 kB   -

OK
```

例えば11.5.9.0 を取得したい場合は以下のコマンドで取得します:
```
 docker pull icr.io/db2_community/db2:11.5.9.0
 ```

 # 3. Db2 Dockerイメージの起動
 以下rootで実施するか、`sudo `をコマンドの最初につけて実施してください。

 [ドキュメントのプロシージャーのStep5](https://www.ibm.com/docs/en/db2/12.1?topic=system-linux#taskt_install_db2CE_img__steps__1)では環境変数ファイルを作成していますが、ここでは最低限起動するレベルの環境変数を指定します。
環境変数の詳細は[ドキュメントのプロシージャーのStep5](https://www.ibm.com/docs/en/db2/12.1?topic=system-linux#taskt_install_db2CE_img__steps__1)を参照してみてください。

最初にインスタンスのパスワードを決めてください。
ここでは `Passw0rd`としました。

以下のコマンドを実行します。
```sh
docker run -itd -h db2server --name db2server  \
--privileged=true -p 50000:50000 \
-e LICENSE=accept -e DB2INST1_PASSWORD=Passw0rd icr.io/db2_community/db2
```

 `icr.io/db2_community/db2`がイメージ名で何も指定していない場合は、最新版(latest)のイメージが起動します。

---
### 特定のバージョンを使用したい場合
特定のバージョンを使用したい場合は、タグ(=バージョン)をつけてください。
pull済みのイメージのタグは以下のコマンドで表示できます:
```
docker images
```

表示例:
```
# docker images
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
REPOSITORY                TAG         IMAGE ID      CREATED        SIZE
icr.io/db2_community/db2  latest      ad58f98bc527  6 weeks ago    4.04 GB
icr.io/db2_community/db2  11.5.9.0    dee45baf523a  16 months ago  3.2 GB
```

11.5.9.0を使いたい場合はDokerイメージの起動は以下のコマンドになります:
```
docker run -itd -h db2server --name db2server  \
--privileged=true -p 50000:50000 \
-e LICENSE=accept -e DB2INST1_PASSWORD=Passw0rd icr.io/db2_community/db2:11.5.9.0
```
---

### 起動後の確認

事前にpullしてあれば、あっさり瞬時に起動します。

が、内部でTaskが走っているので、以下のコマンドでログに`(*) Setup has completed.`が表示されるまで待ちます:
```
 docker logs -f  db2server
```

出力例：
```
#  docker logs -f  db2server
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
(*) Previous setup has not been detected. Creating the users...
(*) Creating users ...
(*) Creating instance ...
DBI1446I  The db2icrt command is running.


DB2 installation is being initialized.

 Total number of tasks to be performed: 4
Total estimated time for all tasks to be performed: 309 second(s)

Task #1 start
Description: Setting default global profile registry variables
Estimated time 1 second(s)
Task #1 end

Task #2 start
Description: Initializing instance list
Estimated time 5 second(s)
Task #2 end

Task #3 start
Description: Configuring DB2 instances
Estimated time 300 second(s)
Task #3 end

Task #4 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #4 end

The execution completed successfully.

For more information see the DB2 installation log at "/tmp/db2icrt.log.100".
DBI1070I  Program db2icrt completed successfully.


(*) Fixing /etc/services file for DB2 ...
03/21/2025 09:02:06     0   0   SQL1032N  No start database manager command was issued.
SQL1032N  No start database manager command was issued.  SQLSTATE=57019
(*) Cataloging existing databases
ls: cannot access '/database/data/db2inst1/NODE0000': No such file or directory
(*) Applying Db2 license ...
LIC1407N  You are trying to register an invalid license certificate file, "/var/db2_setup/include/db2dec.lic".
(!) There was a failure while applying the Db2 license ...
(*) Updating DBM CFG parameters ...
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
DB20000I  The UPDATE DATABASE MANAGER CONFIGURATION command completed
successfully.
No Cgroup memory limit detected, instance memory will follow automatic tuning
(*) Remounting /database with suid...

DB2 State : Operable
DB2 has not been started
Starting DB2...

03/21/2025 09:02:15     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
(*) All databases are now active.
(*) Setup has completed.
false

2025-03-21-09.02.15.568756+000 I50408E390            LEVEL: Warning
PID     : 13798                TID : 139946957854208 PROC : db2start
INSTANCE: db2inst1             NODE : 000
HOSTNAME: db2server
FUNCTION: DB2 UDB, base sys utilities, sqleReleaseStStLockFile, probe:16126
MESSAGE : Released lock on the file:
DATA #1 : String, 50 bytes
/database/config/db2inst1/sqllib/ctrl/db2strst.lck


```
ログに`(*) Setup has completed.`が表示されたら、Ctrl+Cで抜けます。

下の方の以下の部分に`(*) Setup has completed.`があります:
>03/21/2025 09:02:15     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
(*) All databases are now active.
**(\*) Setup has completed.**

:::note
2025/03/21現在、v12.1では`ZRC=0x870F0042=-2029060030=SQLO_QUE_NOT_EXIST "Queue does not exist"`というエラーメッセージが出てしまうようですが、[Known Issues](https://www.ibm.com/mysupport/s/defect/aCIKe00000006jqOAA/dt425399?language=en_US)で無視していいそうです。
:::

**[volume マウントについて]**
ちなみに[ドキュメントのプロシージャーのStep8](https://www.ibm.com/docs/en/db2/12.1?topic=system-linux#taskt_install_db2CE_img__steps__1)では
`-v /Docker:/database` のように
-vでローカルのディレクトリを/databaseにマウントしています。
しかし、これは不要です。
なにもつけなくても、docker上にvolumeを作成してくれます(/database用と/hadr用)。これによりdocker stopをして再度startした場合も、データの保持はされています。

（ここは検証結果です）
docker run後、2つvolumeが作成されています：
```
 docker volume ls
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
DRIVER      VOLUME NAME
local       a8ea302fcccf04bc8d412f8eb2bf97fdd22100c7a633c1843dd84a4dbb30b481
local       b07a41b11f09ed525ba07adc6a03c18e92dc179212332d8d59e0e29b57ddc224
```

これらのvolumeはコンテナ内の/databaseと/hadrにマウントされていました。
```
#  docker inspect db2server
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
[
     {
          "Id": "15f6fbc9a319ea7c141756f23272f4b96c824532797a07ecf59043a568f25d56",
          "Created": "2025-03-21T09:01:42.555480499Z",
          "Path": "/var/db2_setup/lib/setup_db2_instance.sh",
          "Args": [
               "/var/db2_setup/lib/setup_db2_instance.sh"
          ],
          "State": {
           

（中略）

       "Mounts": [
               {
                    "Type": "volume",
                    "Name": "a8ea302fcccf04bc8d412f8eb2bf97fdd22100c7a633c1843dd84a4dbb30b481",
                    "Source": "/var/lib/containers/storage/volumes/a8ea302fcccf04bc8d412f8eb2bf97fdd22100c7a633c1843dd84a4dbb30b481/_data",
                    "Destination": "/database",
                    "Driver": "local",
                    "Mode": "",
                    "Options": [
                         "nodev",
                         "exec",
                         "nosuid",
                         "rbind"
                    ],
                    "RW": true,
                    "Propagation": "rprivate"
               },
               {
                    "Type": "volume",
                    "Name": "b07a41b11f09ed525ba07adc6a03c18e92dc179212332d8d59e0e29b57ddc224",
                    "Source": "/var/lib/containers/storage/volumes/b07a41b11f09ed525ba07adc6a03c18e92dc179212332d8d59e0e29b57ddc224/_data",
                    "Destination": "/hadr",
                    "Driver": "local",
                    "Mode": "",
                    "Options": [
                         "nodev",
                         "exec",
                         "nosuid",
                         "rbind"
                    ],
                    "RW": true,
                    "Propagation": "rprivate"
               }
          ],
(以下省略)
````
# 4. 稼働確認
以下rootで実施するか、`sudo `をコマンドの最初につけて実施してください。

## 4-1. 起動しているコンテナにログインします。
```
docker exec -ti db2server bash -c "su - db2inst1"
```
出力例:
```
# docker exec -ti db2server bash -c "su - db2inst1"
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Last login: Fri Mar 21 09:08:23 UTC 2025
[db2inst1@db2server ~]$
```


## 4-2. サンプルデータベースを作成してみます
```
db2sampl -force -sql
```

出力例:
```
[[db2inst1@db2server ~]$ db2sampl -force -sql

  Creating database "SAMPLE"...
  Connecting to database "SAMPLE"...
  Creating tables and data in schema "DB2INST1"...

  'db2sampl' processing complete.

[db2inst1@db2server ~]$
```

## 4-3. DBに接続します
```
db2 connect to sample
```
出力例
```
[db2inst1@db2server ~]$ db2 connect to sample

   Database Connection Information

 Database server        = DB2/LINUXX8664 12.1.1.0
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE

[db2inst1@db2server ~]$
```

## 4-4. SELECTしてみます
```
db2 "select * from department" 
```

出力例
```
[db2inst1@db2server ~]$ db2 "select * from department"

DEPTNO DEPTNAME                             MGRNO  ADMRDEPT LOCATION
------ ------------------------------------ ------ -------- ----------------
A00    SPIFFY COMPUTER SERVICE DIV.         000010 A00      -
B01    PLANNING                             000020 A00      -
C01    INFORMATION CENTER                   000030 A00      -
D01    DEVELOPMENT CENTER                   -      A00      -
D11    MANUFACTURING SYSTEMS                000060 D01      -
D21    ADMINISTRATION SYSTEMS               000070 D01      -
E01    SUPPORT SERVICES                     000050 A00      -
E11    OPERATIONS                           000090 E01      -
E21    SOFTWARE SUPPORT                     000100 E01      -
F22    BRANCH OFFICE F2                     -      E01      -
G22    BRANCH OFFICE G2                     -      E01      -
H22    BRANCH OFFICE H2                     -      E01      -
I22    BRANCH OFFICE I2                     -      E01      -
J22    BRANCH OFFICE J2                     -      E01      -

  14 record(s) selected.

[db2inst1@db2server ~]$
```


## 4-5. DB接続を切断します
```
db2 connect reset
```

出力例
```
[db2inst1@db2server ~]$ db2 connect reset
DB20000I  The SQL command completed successfully.
[db2inst1@db2server ~]$
```

## 4-6. コンテナから抜けます
```
exit
```

出力例
```
[db2inst1@db2server ~]$ exit
logout
#
```

# (オプション)コンテナの停止、開始

以下rootで実施するか、`sudo `をコマンドの最初につけて実施してください。

コンテナの停止は以下のコマンドになります(db2特有ではないです。普通のdockerコマンドです):
```
docker stop db2server
```

停止したコンテナの開始は以下のコマンドになります(db2特有ではないです。普通のdockerコマンドです):
```
docker start db2server
```
すぐ開始するのですが、**起動時と同様に内部でTaskが走っているので、以下のコマンドでログに`(*) Setup has completed.`が表示されるまで待ちます**:
```
 docker logs -f  db2server
```
ログに`(*) Setup has completed.`が表示されたら、Ctrl+Cで抜けます。

# (オプション)コンテナの削除
コンテナを削除したい場合は、停止後、削除します。volumeは削除されないので、削除したい場合はコマンドで削除します。

1: コンテナの停止
```
docker stop db2server
```

2: コンテナの削除
```
docker rm db2server
```

3: volumeの削除
以下は使用していないvolumeを全て削除するコマンドです。
削除したくない使用していないvolumeがある場合は個別に`docker rm <volume名>`で削除してください。
```
docker volume prune
```

以上です。