Db2 Community Edition for DockerでローカルDB2を構築する

## Db2 Community Edition for Dockerの情報

https://www.ibm.com/docs/ja/db2/11.5.x?topic=deployments-db2-community-edition-docker

## 使用するイメージ

icr.io/db2_community/db2

## 参考サイト

https://www.ibm.com/docs/ja/db2/12.1.0?topic=system-linux


## ソース

本記事で利用するソースはGitHubにアップしています。

https://github.com/v1tam1nb2/db2-container

## データ永続化について

```yaml:compose.yaml
services:
  db2:
    image: icr.io/db2_community/db2:latest
    container_name: db2
    privileged: true
    restart: always
    ports:
      - "50000:50000"
    env_file:
      - .env
    volumes:
      - ./db2data:/database
      - ./sample/csv:/var/custom/data
      - ./sample/sql:/var/custom/sql
```

投入したデータは、コンテナ内の`/database`に保存されるので、`./db2data:/database`というマウント設定でローカルに永続化できるようにしています。

また、`/var/custom/data`には投入したいcsvデータを配置し、`/var/custom/sql`にはSQLファイルを配置します。



## 環境変数

必須フィールドとオプション設定があります。

詳細は以下を参考にしてください。

https://uepon.hatenadiary.com/entry/2024/07/05/172413

https://www.ibm.com/docs/ja/db2/12.1.0?topic=system-linux

```.env
# 参考：https://uepon.hatenadiary.com/entry/2024/07/05/172413

# 必須フィールド
# ライセンスの受託
LICENSE=accept
# DB2インスタンス名
DB2INSTANCE=db2inst1
# DB2インスタンスユーザーのパスワード
DB2INST1_PASSWORD=password

# オプション
# デフォルトのデータベース名
DBNAME=USERDB
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=
```

## 投入するデータ

サンプルデータとして以下を利用します。

```csv:insert.csv
test,test,test@test.com,testtest,2025-01-02-11.00.00.000000,2025-01-02-11.00.00.000000
sample,sample,sample@sample.com,samplesample,2025-01-11-11.00.00.000000,2025-01-11-11.00.00.000000
```

`users`テーブルを作成するために、SQLファイルを用意します。

```sql:create_users.sql
CREATE TABLE users (
    id VARCHAR(36) NOT NULL,
    name VARCHAR(40) NOT NULL,
    mail VARCHAR(100) NOT NULL,
    password VARCHAR(30) NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    )
);
```

## DB2コンテナの構築

```shell
git clone https://github.com/v1tam1nb2/db2-container.git
cd db2-container
docker compose up -d
```

## データの投入

```shell
# コンテナ内に入る
docker exec -it db2 bash
# パスを通す
export PATH=/database/config/db2inst1/sqllib/bin/:$PATH
# データベースに接続
db2 connect to USERDB user db2inst1 using password

# テーブル作成
db2 -tvf /var/custom/sql/create_users.sql
# データのインサート
db2 import from /var/custom/data/insert.csv of del insert into users

# Terminate
db2 terminate

# コンテナから出る
exit
```

## サンプルデータの確認

```shell
# db2ins1ユーザーでコンテナに入る
docker exec -it db2 bash -c "su - db2inst1"

# データベースに接続
db2 connect to userdb
# selectの実行
db2 "select * from users"

# Terminate
db2 terminate

# コンテナから出る
exit
```

セレクト結果

```
[db2inst1@9b483c1926bf ~]$ db2 "select * from users"

ID                                   NAME                                     MAIL                                                                                                 PASSWORD                       CREATED_AT                 UPDATED_AT
------------------------------------ ---------------------------------------- ---------------------------------------------------------------------------------------------------- ------------------------------ -------------------------- --------------------------
test                                 test                                     test@test.com                                                                                        testtest                       2025-01-02-11.00.00.000000 2025-01-02-11.00.00.000000
sample                               sample                                   sample@sample.com                                                                                    samplesample                   2025-01-11-11.00.00.000000 2025-01-11-11.00.00.000000

  2 record(s) selected.

[db2inst1@9b483c1926bf ~]$
```

## 最後に

ローカルにDB2コンテナを作成し、サンプルデータを投入するところまでできました。

これでローカル環境でDB2の学習などができるようになりました。