先日、ネットをみていたところ下記のようなイベントがあり、興味があったのですが仕事がごたついていたときだったので参加できず、資料で我慢するかな~と思っていたのですが、
資料を見るとあーDb2
のライセンスいるのかってことでソっと閉じ…できません😎ということで、今回は自分も初めて使用するIBM Db2
のDockerコンテナ
を使用してみようと思います。今回使用するのではDb2 Community Edition for Docker
になります。Community Edition
はビジネスでは使用できないのであくまでも勉強用ということをお忘れなく。
Db2 Community Edition Docker
のイメージには、以下の制限があります。
* メモリー制限: 16GB
* コア制限: 4コア
今回は以下の情報を参考にWindows上のDocker Desktop
を使用しています。(Docker Desktop
も個人ユーザ向けということで使用していきます)
以下のリンクが詳しいです。アクセスすると日本語訳にしてくれます(便利🤩)
作業フォルダの作成とコンテナイメージの取得
任意のフォルダに今回作業する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を参考にしますが、どうもドキュメントそのままだとエラーがでるようなので、自分で変更して実験しています。(間違っていたらご指摘ください)
原文のまま
日本語翻訳版
自分の修正版
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側のポートを指定することで実行も可能です。もし、コンテナ同士だった場合にはネットワークの設定もしたほうがいいでしょう。
そのあたりも今後実験できるといいですね💪