Mac M1 Docker DesktopでDb2を動かす

Db2はmacOSをサポートしていないのだが、Dockerを使えばMac上でもDb2を動かすことができる。
M1 MacにDocker Desktopを導入し、Db2 Community Edition for Dockerを動かしてみたので、紹介する。

## 目次
[はじめに](#はじめに)
[1. Docker Desktopの導入](#1-docker-desktopの導入)
[2. Db2 for Dockerのダウンロードとコンテナ作成](#2-db2-for-dockerのダウンロードとコンテナ作成)
[3. Db2 for Dockerの使用](#3-db2-for-dockerの使用)
[4. Docker Desktopの使用](#4-docker-desktopの使用)

# はじめに
Db2にはDocker版があり、Db2 Community Edition for Docker (以下、Db2 for Docker) という。
Db2 for Dockerについては、以下に情報がある。
[Db2 Community Edition for Docker](https://www.ibm.com/docs/ja/db2/11.5?topic=deployments-db2-community-edition-docker)
macOS上での導入手順はこちらに書かれている。
[macOS システムへの Db2 Community Edition Docker イメージのインストール](https://www.ibm.com/docs/ja/db2/11.5?topic=system-macos)

まとめると、次の2ステップとなる。
1. Docker Destopの導入
2. Db2 for Dockerイメージのダウンロードとコンテナの作成

注意点は、Db2 for Dockerには、amd64, ppc64le (IBM Power System Little Endian Linux用), s390x (IBM Z, LinuxOne用)版しかないとことだ。
Mac M1/M2では、arm64用のDockerイメージが必要となるので、Db2 for Dockerを動かすことは出来なさそうだ。しかしこれは、docker pull, docker runコマンドで、--platformオプションをつけることにより解決できる。
以下に、M1 Mac上で、Docker Desktopを使用し、Db2 for Dockerを稼働させる手順をまとめる。

なお、この記事では以下の環境を使用している。
-Mac Book Pro 2020
 チップ：　Appl M1
 メモリ：　8G
 OS：　macOS Ventura 13.5.1
-Db2 Community Edition for Docker
 バージョン： 11.5.8 (記事執筆時点でのlatest)
 アーキテクチャ： amd64

# 1. Docker Desktopの導入
以下の文書の手順に従い、Docker Desktopを導入する。
[Docker Desktop の Mac へのインストール](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/8ff864e3-7670-f12e-7c0a-47b6dea1a41b.png)

(1). Rosetta 2のインストール
上記URLの「システム要件」で、「Apple siliconのMac」タブを確認すると、Rosetta 2の導入が推奨されているので、以下のようにRosetta 2をインストールする。
```
% softwareupdate --install-rosetta
I have read and agree to the terms of the software license agreement. A list of Apple SLAs may be found here: https://www.apple.com/legal/sla/
Type A and press return to agree: a
Install of Rosetta 2 finished successfully
```

(2). Docker Desktopのダウンロード
[Docker DesktopのMacへのインストール](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/install/)画面より、「ApplチップのMac」を選んでダウンロード。

(3). Docker Desktopの導入
ダウンロード先のフォルダにある`Docker.dmg`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/d1e422b7-43c7-2b09-40e3-598a88567aab.png)
画面に従って、Dockerをアプリケーションにコピー。
![スクリーンショット 2023-09-15 18.58.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/b26d17df-080c-52b4-44f1-454247716901.png)
アプリケーションから、Dockerをダブルクリックして、起動。
「インターネットからダウンロードされたアプリケーションです。開いてもよろしいですか?」と聞かれるので、「開く」。
以下のDocker Subscription Service Terms（サブスクリプションサービス条件）画面が出るので、「Accept」。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/823725e5-a160-451f-d5d2-57b56bff9dd3.png)
Docker Desktopアプリの構成について聞かれるので、どちらでもよいが、デフォルトのまま「Use recommended settings」を選択して、「Finish」を押す。
![スクリーンショット 2023-09-15 19.13.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/4070e4ae-23de-04e1-c0af-8158ac2bb64e.png)
Macのパスワードを聞かれるので、入れて進む。

以下のようにDockerへのサインインが求められるので、すでにDockerアカウントを持っていれば、サインインし、持っていなければ、登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/33f0ae64-b884-695c-762d-0bfe3cf06ac9.png)

Docker Desktopが開始され、最初にチュートリアル画面などが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/fe81c680-a888-85c3-d8da-2d404d38dcf9.png)

(4). Dockerの稼働確認
ここで、導入されたDockerをターミナルから使用できることを確認する。
ターミナルを開き、Docker versionコマンドを実行してみる。
```
% docker version
Client:
 Cloud integration: v1.0.35+desktop.4
 Version:           24.0.6
 API version:       1.43
 Go version:        go1.20.7
 Git commit:        ed223bc
 Built:             Mon Sep  4 12:28:49 2023
 OS/Arch:           darwin/arm64
 Context:           desktop-linux

Server: Docker Desktop 4.23.0 (120376)
 Engine:
  Version:          24.0.6
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.7
  Git commit:       1a79695
  Built:            Mon Sep  4 12:31:36 2023
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.22
  GitCommit:        8165feabfdfe38c65b599c4993d227328c231fca
 runc:
  Version:          1.1.8
  GitCommit:        v1.1.8-0-g82f18fe
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```
Docker Desktopが導入され、Dockerが使用できるようになった。

# 2. Db2 for Dockerのダウンロードとコンテナ作成
上述のマニュアルページ
[macOS システムへの Db2 Community Edition Docker イメージのインストール](https://www.ibm.com/docs/ja/db2/11.5?topic=system-macos)
を参考にして進める。

## (1). docker pull
`docker pull`コマンドを使用して、Db2 for Dockerイメージをダウンロードする。

```.tsx:docker pull platformオプションあり
% docker pull --platform=linux/amd64 icr.io/db2_community/db2 
Using default tag: latest
latest: Pulling from db2_community/db2
20270d11ada0: Pull complete 
c5eac4706f98: Pull complete 
6a61e43fbbe8: Pull complete 
1b76a59db2b7: Pull complete 
21e0bc77e537: Pull complete 
f0519f8d2d69: Pull complete 
2a8bfb7e103b: Pull complete 
7d9f144c10a5: Pull complete 
b9e3cafdc1f2: Pull complete 
bb7800c71111: Pull complete 
572de593c4f0: Pull complete 
b217e986c2dc: Pull complete 
Digest: sha256:9002c04b6c0f11e72531b6bb72f33119aaf25f965afb29d8951cfb4a2f5d715c
Status: Downloaded newer image for icr.io/db2_community/db2:latest
icr.io/db2_community/db2:latest
```
ポイントは、[はじめに](#はじめに) で述べたとおり、<font color="red">--platform=linux/amd64</font>を付けること。
これをつけないと、arm64版をpullしようとするので、以下のようにエラーになる。
```.tsx:docker pull エラー
% docker pull --platform=linux/amd64 icr.io/db2_community/db2
Using default tag: latest
latest: Pulling from db2_community/db2
no matching manifest for linux/arm64/v8 in the manifest list entries
```

## (2). docker run
先に`docker pull`で入手したイメージを使い、`docker run`によってコンテナを作成して起動する。
### (a). 環境変数の準備
docker run実行用の環境変数リストを作る。作らなくても、docker runのコマンドラインで必要な変数を渡してやれば起動できる。しかし、環境変数が多い場合は、作っておくほうが間違いが少ない。
viで環境変数ファイルを編集する。
```
% vi .env_list
```
以下の内容を記入する。
```
LICENSE=accept
DB2INSTANCE=db2i115
DB2INST1_PASSWORD=db2i115Pwd
DBNAME=
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
UPDATEAVAIL=NO
TO_CREATE_SAMPLEDB=false
REPODB=false
IS_OSXFS=true
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=
```
ここでは、必須または主要な変数のみ解説する。
LICENSE=accept(必須)：ライセンスを受諾する。この通り書く。書かないと起動しない。
DB2INSTANCE=インスタンス名：コンテナ内に作成されるDb2のインスタンス名。デフォルトはdb2inst1
DB2INST1_PASSWORD=任意の文字列(必須)：DB2INSTANCEで指定したインスタンス名のユーザー（つまり、インスタンスオーナー)のパスワードになる。インスタンス名が、db2inst1ではない場合も、環境変数名は、DB2INST1_PASSWORDを使う。
DBNAME=データベース名(任意)：データベースを作成したい場合、そのDB名。指定しなければ、DBが作成されない。
TO_CREATE_SAMPLEDB=false：サンプルDBを作成するかどうか。
IS_OSXFS=true：macOSではtrue.
PERSISTENT_HOME=true：ホームディレクトリを永続ストレージとするか。
HADR_ENABLED=false：HADR高可用性構成をとるか。HADRを使用しない場合、ETCD_xxxの変数は設定不要。

この環境変数リストでは、起動時にデータベースを作らない設定としている。(DBNAME指定なし, TO_CREATE_SAMPLEDB=false)
Db2 dockerコンテナを初めて起動すると、まず、Db2インスタンスを作成し、データベースを作成しようとする。初期設定時間を短くして、さっと起動してもらいたいので、この時点でDBは作成しない。
DBはコンテナが起動したら、コンテナに入って後でDBを作成できる。
### (b). ボリュームの準備
マニュアルでは、データベース等のコンテナデータを置く場所としてフォルダを作成し、docker run -vオプションで、これをコンテナ内の/databaseのマウントポイントとしている。しかし、あらかじめボリュームを作っておいたほうが、後で見てわかりやすいので、ここではボリュームを作る。
名前は任意だが、コンテナ名をdb2sererとする予定なので、ボリューム名をv_db2serverとしている。
```
% docker volume create v_db2server
```
作成したボリューム v_db2server の情報を確認する。
```
% docker volume inspect v_db2server
[
    {
        "CreatedAt": "2023-09-19T01:59:07Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/v_db2server/_data",
        "Name": "v_db2server",
        "Options": null,
        "Scope": "local"
    }
]
```
v_db2serverが/var/lib/docker/volumesの下に作成されている。

### (c). docker runの実行

```
% docker run -itd -h db2server --name db2server --restart=always \
--privileged=true -p 50000:50000 --env-file .env_list \
-v v_db2server:/database --platform=linux/amd64 \
icr.io/db2_community/db2
dbd8738c4d29dc90a2ea5f10ea0e707c16f68c6a9d737d984c5153e5c6334d12
%
```
コンテナ名db2serverのコンテナを作成し、バックグラウンド(-d), 特権モード(--privileged=true)で実行させる。
-pはアサインするポートの番号を指定。
[(a).環境変数の準備](#a-環境変数の準備)で作成した環境変数ファイル.env_listを、--env-fileオプションで与えている。
-vオプションで、[(b).ボリュームの準備](#b-ボリュームの準備)で作成したv_db2serverボリュームに、コンテナ内の/databaseディレクトリをマウントするよう指定している。
<font color="red">--platform=linux/amd64</font> を指定して、amd64版のイメージを起動させる。
バックグラウンドモードなので、docker runコマンドはすぐに終了するが、コンテナ内では、Db2インスタンスの作成が行われている。これにはしばらくかかるので、以下のコマンドを実行し、インスタンス作成終了を待つ。

```
docker logs -f db2server
(*) 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 

    :
    中略
    :

The execution completed successfully.

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


(*) Fixing /etc/services file for DB2 ... 
09/19/2023 05:51:07     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/db2i115/NODE0000': No such file or directory
(*) Applying Db2 license ...

LIC1402I  License added successfully.

    :
　　　　　　中略
    :

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

09/19/2023 05:52:18     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.
```
以下のメッセージが出ていれば、終了。

09/19/2023 05:52:18     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.

# 3. Db2 for Dockerの使用

## (1). Db2コンテナに入る
以下のコマンドで、Db2コンテナに入り、インスタンスオーナーにスイッチする。
ここでは、コンテナ名はdb2server、インスタンスオーナー名はdb2i115である。
```
% docker exec -it db2server /bin/bash
[root@db2server /]# su - db2i115
Last login: Tue Sep 19 07:19:18 UTC 2023
[db2i115@db2server ~]$ 
```
初期設定で、データベースを作らなかったので、Db2インスタンスは作成済み/起動済みで、DBは存在しない状態になっているはずである。状況を確認する。
```
[db2i115@db2server ~]$ db2start
09/19/2023 07:23:33     0   0   SQL1026N  The database manager is already active.
SQL1026N  The database manager is already active.
[db2i115@db2server ~]$ db2 list db directory
SQL1031N  The database directory cannot be found on the indicated file system. 
SQLSTATE=58031
[db2i115@db2server ~]$ 
```
db2startは、インスタンスを起動するコマンド。これに対して、"already active"起動中というメッセージが返される。
また、db2 list db directoryは、作成済みDBの一覧を表示するコマンドだが、現在はDBが無い。
## (2). データベースの作成と操作
データベースが無いので、作成する。
```
[db2i115@db2server ~]$ db2 create db testdb
DB20000I  The CREATE DATABASE command completed successfully.
```
データベースに接続する。
```
[db2i115@db2server ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.8.0
 SQL authorization ID   = DB2I115
 Local database alias   = TESTDB

[db2i115@db2server ~]$ 
```
表を作って、適当にデータを入れて、selectしてみる。
```
[db2i115@db2server ~]$ db2 "create table testtbl (id int not null, txt varchar(256))"
DB20000I  The SQL command completed successfully.
[db2i115@db2server ~]$ db2 "insert into testtbl values(1, 'コンテナ動いてます。')"
DB20000I  The SQL command completed successfully.
[db2i115@db2server ~]$ db2 "select * from testtbl"

ID          TXT             
----------- ----------------------------------------------------------
          1 コンテナ動いてます。                                                                            
  1 record(s) selected.

[db2i115@db2server ~]$ 
```
Db2の操作に不慣れな方は、以下のQuiita記事を参考にしてほしい。
[はじめて使うDb2 - コマンドの実行、基本操作](https://qiita.com/kayokok/items/ffd37a6f40cb714412f6)

## (3). コンテナの再起動とデータの確認
先ほど投入したデータが永続しているか確認する。
まずは、コンテナから抜ける。
```
[db2i115@db2server ~]$ exit
logout
[root@db2server /]# exit
exit
% 
```
コンテナを停止する。
```
% docker stop db2server
db2server
```
コンテナを起動する。
```
% docker start db2server
db2server
```
コンテナに入る。
```
% docker exec -it db2server /bin/bash -c "su - db2i115"
Last login: Tue Sep 19 07:44:08 UTC 2023 on pts/0
```
[(c). docker runの実行](#c-docker-runの実行)でコンテナを作成した際は、コンテナが立ち上がった時にはDb2インスタンスが起動された状態だった。`docker start`によるコンテナ起動時には、デフォルトではインスタンスが起動されていない状態で、コンテナが立ち上がる。
したがって、まずはインスタンスを起動する。
```
[db2i115@db2server ~]$ db2start
09/19/2023 07:44:52     0   0   SQL1063N  DB2START processing was successful.
SQL1063N  DB2START processing was successful.
```
[(2).データベースの作成と操作](#2-データベースの作成と操作)で作成した表をselectし、データを確認する。
```
[db2i115@db2server ~]$ db2 connect to testdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.8.0
 SQL authorization ID   = DB2I115
 Local database alias   = TESTDB

[db2i115@db2server ~]$ db2 "select * from testtbl"

ID          TXT                                       
----------- ----------------------------------------------------------
          1 コンテナ動いてます。                                                                        

  1 record(s) selected.
```
コンテナを停止/再起動してもデータは永続している。

# 4. Docker Desktopの使用
Dockerの操作はコマンドでできるが、せっかくDocker Desktopを導入したので、GUIでの操作をまとめておく。
Macのアプリケーション、または、Dockから、Docker Desktopを起動する。Dockerダッシュボードの画面が表示されるので、ここからコンテナ、イメージ、ボリュームの状況確認や簡単な操作を行うことができる。
## (1). イメージの確認
イメージ画面から、docker pullで入手したdockerイメージを確認できる。
![スクリーンショット 2023-09-19 17.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/fbd956b8-e144-bad2-7b5a-6eb3096fcc11.png)
ここでは、db2のdockerイメージがリストされている。amd64版であることを示す赤い表示がある。
## (2). コンテナの確認と操作
コンテナ画面では、コンテナの稼働状況が表示され、コンテナの操作も可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/58daf885-2302-eabf-4726-b7b7bb74e59e.png)
コンテナ名の行のActions列のボタンは、起動中は四角ボタン、停止中は三角になっているが、このボタンによりコンテナの起動<->停止ができる。
右端のゴミ箱ボタンを押すことにより、コンテナを削除できる。
コンテナ名をクリックすると、コンテナの詳細情報が表示される。
以下の画面は、Logs画面であるが、docker logsコマンドと同様にコンテナのログ情報を参照できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/e297b7b3-6a09-a568-9182-91d40ddcf082.png)
また、Exec画面では、docker execでコンテナに入るのと同じように、コンテナ内のコマンド実行が可能である。
## (3). ボリュームの確認と操作
Volumes画面では、ボリュームの作成、削除、情報の表示ができる。
以下では、v_db2serverボリュームが表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/bb3b847d-1873-4d33-4ae5-aebf413dcdde.png)
ボリューム名をクリックすると、以下の様にボリューム内のディレクトリやファイル内容を参照することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189034/a2955d20-18a3-2a78-8bc9-20134f53c7de.png)

ここまで、Mac上で、Docker Desktopを使用し、Db2 for Dockerを起動する方法をご紹介した。

以上