初めてのIBM Db2コンテナ作成体験談!Dockerで簡単データベース構築

先日、ネットをみていたところ下記のようなイベントがあり、興味があったのですが仕事がごたついていたときだったので参加できず、資料で我慢するかな~と思っていたのですが、

ibm-developer.connpass.com

資料を見るとあーDb2のライセンスいるのかってことでソっと閉じ…できません😎ということで、今回は自分も初めて使用するIBM Db2Dockerコンテナを使用してみようと思います。今回使用するのではDb2 Community Edition for Dockerになります。Community Editionはビジネスでは使用できないのであくまでも勉強用ということをお忘れなく。

Db2 Community Edition Dockerのイメージには、以下の制限があります。 * メモリー制限: 16GB * コア制限: 4コア

今回は以下の情報を参考にWindows上のDocker Desktopを使用しています。(Docker Desktopも個人ユーザ向けということで使用していきます)

www.ibm.com

以下のリンクが詳しいです。アクセスすると日本語訳にしてくれます(便利🤩)

www.ibm.com

作業フォルダの作成とコンテナイメージの取得

任意のフォルダに今回作業するDb2のフォルダを作成します。ドキュメントにはDockerという名前が使用されていましたが、この名前だと後からみてわからなくなる可能性があるので、私はDb2という名前のフォルダにしました。(具体的にはC:\Db2にしました)作成後にフォルダへ移動します。

PS> mkdir Db2
PS> cd Db2

まずはdocker loginコマンドDocker Hubへログインし、今回使用するのDockerImageであるDb2 CommunityEditionをdocker pullコマンドで取得します。(ログインしなくてもpullできると思います)以前のイメージはibmcomだったような気がしますが、icr.ioに移動したようですね。イメージの所得は結構時間がかかるのでしばし待ちます(ダウンロードイメージは1GBほどあります)。

PS> docker login
PS> docker pull icr.io/db2_community/db2

コマンドラインで実行しても、Docker Desktop側でもイメージの取得されているのがわかります。

インスタンス生成用の環境変数ファイルの準備

続いて環境構築用に環境変数を設定するenv_list.txtを準備します。Windowsなのでviはないと思われるので、Visual Studio Codeなどで編集をします。

PS> code ./env_list.txt

環境変数ファイルは以下のようになります。

env_list.txt

LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=testdb
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=

環境変数とその値、内容は以下のようになります。インスタンスのパスワードが簡単なものになっているので使用は注意ですが、PCに閉じている環境で使用するので今回はこのままでよいでしょう。

環境変数 意味
LICENSE accept 必須フィールド:ライセンスを受諾するために必要な設定
DB2INSTANCE db2inst1 必須フィールド:Db2インスタンスの名前
DB2INST1_PASSWORD password 必須フィールド:Db2インスタンスユーザーのパスワード
DBNAME testdb デフォルトのデータベース名
BLU false BLU アクセラレーション機能の有効化設定
ENABLE_ORACLE_COMPATIBILITY false Oracle互換モードの有効化設定
UPDATEAVAIL NO 利用可能なアップデートの通知設定
TO_CREATE_SAMPLEDB true サンプルデータベースの作成設定
REPODB true レポジトリデータベースの有効化設定
IS_OSXFS false DockerのOSXFS使用の有無設定
PERSISTENT_HOME false ホームディレクトリの永続化設定
HADR_ENABLED false 高可用性災害復旧(HADR)の有効化設定
ETCD_ENDPOINT etcdサービスのエンドポイント(クラスタ構成時に使用)
ETCD_USERNAME etcdサービスのユーザー名(クラスタ構成時に使用)
ETCD_PASSWORD etcdサービスのパスワード(クラスタ構成時に使用)

このファイルを保存します。

インスタンスの作成

以下のdocker runコマンドを実行して、Db2 Community Editionインスタンスを作成します。

PS> docker run -h db2server --name db2server --restart=always --detach --privileged=true -p  50000:50000 --env-file env_list.txt -v C:/Db2:/database icr.io/db2_community/db2

docker runコマンドの各オプションスイッチの意味は以下となります。

オプションスイッチ オプションの値 意味
-h db2server Dockerコンテナに割り当てるホスト名
--name db2server コンテナの名前
--restart always コンテナが停止した場合に常に再起動する設定
--detach - コンテナをバックグラウンドで実行する設定
--privileged true 特権モードでコンテナを開始する設定
-p 50000:50000 ホストのポート50000をコンテナのポート50000にマッピングする設定
--env-file env_list.txt 環境変数ファイルのパス
-v C:/Db2:/database ホストのディレクトリをコンテナのディレクトリにマウントする設定Windows側のフォルダとコンテナ側のディレクトリを:(コロン)で繋いで記述

コマンドラインから実行すると…

Docker Desktop側でもコンテナが作成されたことがわかります。コンテナの生成には自分の環境では約5分ほどかかりました。

コンテナの生成完了はdocker logsコマンドを使用するか、Docker Desktopのlogsタブから確認するとよいでしょう。

PS1> docker logs -f <生成したコンテナ名>

Db2へ接続する

コンテナが生成されたので接続を行います。接続は以下のコマンドで行います。コマンドにある値db2inst1環境変数ファイルで設定したDB2INSTANCEの値になります。

PS1> docker exec -ti db2server bash -c "su - db2inst1"

これでDb2インスタンスコマンドラインから接続ができました。とりあえずサンプル・データベースを作成し、クエリを実行してみたいと思います。

ここからの作業は以下のURLを参考にしますが、どうもドキュメントそのままだとエラーがでるようなので、自分で変更して実験しています。(間違っていたらご指摘ください)

www.ibm.com

原文のまま

日本語翻訳版

自分の修正版

1)以下のコマンドを入力して、サンプル・データベースを作成します。

(注意)原文のままではエラーが発生します。末尾のiを除くと成功します。

[db2inst1@db2server /]$ db2sampl -force -sql

エラーなくサンプル・データベースの作成が完了しました。

2)続いては作成したデータベースに接続します。(この部分のセクションがないので追加しています)

以下のコマンドを実行して、サンプル・データベースへ接続を行います。

[db2inst1@db2server /]$ db2 connect to sample

サンプル・データベースへの接続が完了しました。

3)SQLコマンドの実行

サンプル・データベースに接続したら、次のような SQL ステートメントの実行を開始することができます。

(アクセスの例)テーブルdepartmentからすべての行 ("*" はすべての行を意味する) を選択

[db2inst1@db2server /]$ db2 "select * from department" 

(アクセスの例)テーブル departmentから最初の行を選択して取得

[db2inst1@db2server /]$ db2 "select * from department fetch first 1 rows only"

取得する行数を変更するには、コマンド内の数値を増やします。以下は数値を5に変更した場合の実行例です。

4)データベース接続を終了

データベースが予想した通りの結果を返したら以下のコマンドを実行してを入力してDb2の接続を終了します。

(注意)原文のままではエラーが発生します。末尾の9を除くと成功します。

[db2inst1@db2server /]$ db2 connect reset

4)コンテナへの接続の終了

exitを入力して、 Dockerコンテナとの接続を終了させます。

(注意)原文のままではエラーが発生します。exitに変更すると成功します。

[db2inst1@db2server /]$ exit

おわりに

DB2の使用は初めてだったのですが、データベース用のコンテナの作成からクエリの実行まで無事にできました。コンテナ内の実行ですが、外部からのクエリの実行であればWindows側のポート転送の設定が行われているので、Windows側のポートを指定することで実行も可能です。もし、コンテナ同士だった場合にはネットワークの設定もしたほうがいいでしょう。

参考 uepon.hatenadiary.com

そのあたりも今後実験できるといいですね💪

/* -----codeの行番号----- */