Docker で汎用開発環境用データベースを作ってみよう!


こんにちは、切口太郎です。

前回は、Docker で Python の汎用開発環境を構築しました。



今回は、足回りの整備でDocker でデータベース環境を構築します。

データベースは、企業システムでは必ず利用されているOracle、オープンシステムで利用される Oracles社の MySql 、Windowsサーバーで利用される Microsoft社のSQL Server がビック3ではないでしょうか。

別格扱いで金融などの大型システムで利用される IBM のDB2 があります。

それぞれ、Docker Hub に コンテナーイメージがあります。
さすがに、DB2 は無いだろうなと思っていましたが、DB2 のコンテナーイメージがIBMから開発用で無償提供されていました。

こんどやってみようかなぁ。。。。

Oracle は、SQL Developer や SQL Developer Data Modeler など、かなり高機能は開発ツールが用意されていますが、これは java で基幹系サービス作るときに良く利用します。
Python で作るシステムに Oracle を使うのはあまり聞いたことがなので、今回はスキップします。


ということで、Python の開発で良く利用される MySQL で汎用開発環境に利用できるデータベースを環境を構築します。


MySQL は、Linux版では、/var/lib/mysql にテーブルスペースを作成します。
この領域を 別のボリュームへマウントすれば、コンンテナー内に閉じていない環境を構築することができます。



MySQLの /var/lib/mysql をHostOSのフォルダーにマウントします。

MySQLはのコンテナー起動は、Docker run .... のパラメータ指定でもできますが、今回は docker compose を利用して行います。

ホスト側で別のデータベースをマウントすることによって、簡単にデータベースを取り替えられます。バックアップや復元が簡単にできるようになります。



1 MYSQLのインストール

データベースの Docker Image は、Docker Hub にある Official Image を使用します。
ダウンロード数がすごいですね。

MySQLは起動できるだけという単純なものにしました。

docker-compose.yml 

version: '3'
services:
   db:
       image: mysql
       container_name: mysql
       ports:
           - "3306:3306"
       environment:
           MYSQL_ROOT_PASSWORD: root
       volumes:
           - "./database:/var/lib/mysql"

Compoe で利用するディレクトリー構成はこのようにしました。
個人利用なので、ユーザーのホームディレクトリーに docker というフォルダーを作成しています。

C:\Users\kirik\docker>tree /F
フォルダー パスの一覧
ボリューム シリアル番号は AAD6-1EEA です
C:.
│  docker-compose.yml
└─database

実際に、 MySQLを Docker Hub からダウンロードして、起動まで行ってみましょう!

C:\Users\kirik\docker>docker-compose up -d
Pulling db (mysql:)...
latest: Pulling from library/mysql
0a4690c5d889: Pull complete
98aa2fc6cbeb: Pull complete
0777e6eb0e6f: Pull complete
2464189c041c: Pull complete
b45df9dc827d: Pull complete
b42b00086160: Pull complete
bb93567627c7: Pull complete
bda91ab2ec35: Pull complete
50b4c0c50b33: Pull complete
70c2999bc788: Pull complete
3cf3e568e51b: Pull complete
c80d654aa77e: Pull complete
Creating mysql ... done

できたようです。

MySQLの初期データが作成されていたか確認します。
作成されていれば、database のディレクトリーに /var/lib/mysql に作成されるファイルがたくさんできています。

C:\Users\kirik\docker>tree /F
フォルダー パスの一覧
ボリューム シリアル番号は AAD6-1EEA です
C:.
│  docker-compose.yml
└─database
   │  auto.cnf
   │  ca-key.pem
   │  ca.pem
   │  client-key.pem
   │  ibdata1
   │  ibtmp1
   │  ib_logfile0
   │  ib_logfile1
   │  mysql.ibd
   │  server-cert.pem
   │  server-key.pem
   │  undo_001
   │  undo_002
   │
   ├─#innodb_temp
   │      temp_1.ibt
   │      temp_10.ibt
   │      temp_2.ibt
   │      temp_3.ibt
   │      temp_4.ibt
   │      temp_5.ibt
   │      temp_6.ibt
   │      temp_7.ibt
   │      temp_8.ibt
   │      temp_9.ibt
   │
   ├─mysql
   └─performance_schema
           accounts_138.sdi
           cond_instances_77.sdi
           data_locks_153.sdi
           data_lock_waits_154.sdi
           events_errors_su_132.sdi
           ・・・中略・・・・
           variables_by_thr_174.sdi
           variables_info_177.sdi

次に MySQLが起動しているか確認します。
赤字部分が MySQLです。起動できていますね。

C:\Users\kirik\docker>docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                               NAMES
e5520e74e440        mysql                   "docker-entrypoint.s…"   12 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql
92798c4c3012        continuumio/anaconda3   "/usr/bin/tini -- /b…"   47 hours ago        Up 47 hours                                             anaconda3

C:\Users\kirik\docker>

MySQLが正しく動作しているか確認します。

動作している mysql コンテナーで bash を起動します。
mysql クライアントを起動して、ルートユーザーでログインします。

C:\Users\kirik\docker>docker exec -it mysql /bin/bash
root@e5520e74e440:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql クライアンからデータベース一覧を表示します。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
大丈夫みたいですね。

Docker では MySQLのインストールも超簡単でした。

2 MySQL Workbench のインストール

VS COde の拡張機能でも MySQLの拡張機能があります。

なんでもVS Code としたいのですが、この VS Code の拡張機能を動かすには、MySQLのクライアントをインストールしなければなりません。
それほど便利ではなかったので、どうせクライアント入れるんだったら MySQL workbench を入れた方が操作が楽になります。

いろいろなツールを使うと、クライアント側のインストールも大変だし、学習コストもかかるので、人数が多くなると無理やりでも VS Code の拡張機能で・・・という考え方もありますが、
ノマドの場合には、どちらかというと「楽に開発できる」を最重要視したほうがいいと思います。

有名なツールは、結構情報がでているので、使い方を習得するのに時間がかかりませんし、GUIは見た目でわかりやすいのが特徴です。

今回はノマド視点で、Workbench インストールいたします。


ダウンロードは、次のURLから行えます。



32bit 版と 64 bit 版があります。
Hyper-V を利用しているので、当然下の64bit 版をダウンロードします。
上の Windows(x86, 32&64bit), MySQL Installeer MSI というのは、32bit版です。64bit OS でも動きますよ程度なので、下の64bit 版をインストールしましょう!



ダウンロードするには、ログインが必要です。

MySQLは、Oracle社の製品なので Oracle Developer アカウントがあれば、そのまま利用できます。
なければ、アカウントを作る事もできます。

アカウントの作成は無料です。




ログインするとダウンロードできるようになります。


ダウンロードが完了したら、ダウンロードファイルをダブルクリックします。インストーラーが起動します。

インストール場所は、デフォルトで問題ないので [Next] ボタンを押します。



こちらも [Next] ボタンを押します。




「Install] ボタンをクリックします。



しばらくするとインストールが完了します。
[Finish] を押してインストーラーを閉じてください。




インストーラーを閉じると、MySQLワークベンチが起動します。
矢印の部分の (+) をクリックします。




MySQL サーバーへの接続情報の入力ダイアログがポップアップします。
Doker Desktop for Windows で MySQLを起動している場合には、 [Connection Name] だけ入力しればOKです。



Connection Name を root にしました。
[test connection] をクリックして接続の確認をします。



接続できれば、このようなダイアログが表示されます。
[OK] をクリックします。



接続ができない場合には、
docker ps コマンドで、mysql コンテナーが起動しているか確認します。起動していない場合には、 docker start mysql  と入力して mysql コンテナーを起動します。


作成した接続情報が表示されます。
これで、MySQLを利用した開発環境が構築できました。





3 まとめ

今回はシステムの足回りを担当するデータベースエンジンを MySQL Dockerで動かしてみました。
管理用クライアントとして MySQL Workbench をインストールして、Docker に接続するところまでやってみました。

Docker でデータベースのインストールは簡単でいいですね。
データベースを利用しないシステムは、ほとんど無いでしょうからデータベース環境を docker で構築できるのは意義がありますね。

正直 Docker でデータベースはあまり実用的ではないから、それほどコンテナー型データベースは無いだろうなと思っていましたが、Docker Hub でデータベース探したら、ものすごいイメージがあるました!

ちょっと前の話になりますが
① 仮想化は I/O が遅いので、データベースのファイルシステムを置くのには向かない
② データベースは、管理領域のメモリーを大きく取る必要があるので、仮想化には向かない。

と言われていました。

今は、エンタープライズ向けのストレージも高性能になって、HDDからSDDの時代になりました。
メモリーも640G実装できるサーバーもありますので、そんな弱点より、仮想化のメリットの方が高くなったように思えます。

仮想マシンが普及して10年以上経ちますので、次のパラダイムシフトは Docker のようなコンテナー技術なんでしょうね。データーベースベンダーが Official を Docker Hub にこぞってアップしているのは、そういう流れなのかもしれません。

一番ビックリしたのが、これを見つけたときです。


リソースのバカ食い、データベースの王道と言われる Enterprise Edition がコンテナーでデビューです。
これが、普及したら、一気に エンタープライズシステムが docker に流れるかもしれません。

Dockerこれから面白そうです。




コメント

このブログの人気の投稿

Hyper-V で Docker Desktop for Windows を使う(その2)

VS Code で Hyper-V + Docker Desktop for Windows

Python のオブジェクトとクラス