2021/10/13

MySQL Workbenchのコンテナ化

MySQLサーバに格納したデータを参照したり、データを追加・更新したりする際、どのように管理するのがよいでしょうか。mysqlコマンドで直接DBサーバにアクセスし、SQLを実行してデータ管理することもあるかもしれませんが、やはり画面付きの管理ツールを利用すると、開発・運用効率はぐっと上がります。

本記事では、MySQLの管理コンソールであるMySQL Workbenchをコンテナ化し、Windows OSにインストールすることなく利用できるようにする方法を説明します。



前提

MySQLサーバの起動

MySQL Workbenchから接続するMySQLサーバを準備します。Dockerコンテナからアクセスできる場所に、MySQLサーバを起動します。本記事では、MySQLサーバのDockerコンテナ化で作成したMySQLサーバコンテナを起動し、3306/tcpで接続を待ち受けます。

  1. コマンドプロンプトを起動します。
  2. MySQLコンテナ用フォルダのパスへカレントディレクトリを移動します。
    cd C:\Work\docker\mysql
  3. MySQLコンテナを起動します。
    docker container run --rm --name mysql-local -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 -d mysql
  4. MySQLコンテナが実行中であることを確認します。
    docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
    4b79cd095af2        mysql               "docker-entrypoint.s…"   18 seconds ago      Up 16 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-local


Xサーバの起動

MySQL Workbenchの画面を表示するために、Xサーバを起動します。本記事ではWindowsでDockerコンテナの画面を表示する方法でご紹介したVcXsrvを起動します。

  1. 「XLaunch」のショートカットをダブルクリックします。

  2. タスクトレイにVcXsrvのアイコンが表示されていることを確認します。


MySQL Workbench Dockerコンテナの作成

MySQL WorkbenchをLinuxコンテナ(Ubuntuベース)にインストールして、コンテナを作成します。

Dockerフォルダの作成

MySQL Workbench用のDockerフォルダを作成します。私の環境では、C:\Work\docker\mysqlworkbenchとしました。このフォルダ内に、この後作成するDockerfileやコンテナ内で利用する関連ファイルを配置していきます。


DEBパッケージの取得

MySQL Workbench公式のインストールパッケージを利用します。コンテナの作成時に、MySQL APTリポジトリを追加し、apt経由でmysql-workbench-communityパッケージをインストールします。ここでは、Ubuntu向けのリリースパッケージ(DEBファイル)をダウンロードします。

参照:MySQL APTリポジトリガイド(英語)

  1. MySQL APTリポジトリのダウンロードページにアクセスします。
  2. MySQL Community Downloadsページで、「No thanks, just start my download.」のリンクをクリックします。Oracle Webアカウントをお持ちの方はログインしてダウンロードすることもできます。


  3. ダウンロードしたDEBファイル(例:mysql-apt-config_0.8.19-1_all.deb)をDockerフォルダ直下に配置します。


Dockerfileの作成

  1. Dockerフォルダ内にdockerfileという名前でファイルを作成します。
  2. 以下をコピー&ペーストしてdockerfileを保存します。3行目のDEBファイル名は環境に合わせて変更してください。
    1. FROM ubuntu:20.04
    2.  
    3. ENV MYSQL_APT_CONFIG_DEB mysql-apt-config_0.8.19-1_all.deb
    4.  
    5. ADD ./${MYSQL_APT_CONFIG_DEB} /tmp/${MYSQL_APT_CONFIG_DEB}
    6.  
    7. RUN apt update && apt install -y \
    8. lsb-release \
    9. wget \
    10. gnupg \
    11. libsecret-1-0 \
    12. dbus-x11 \
    13. gnome-keyring \
    14. && dpkg -i /tmp/${MYSQL_APT_CONFIG_DEB} \
    15. && apt update && apt install -y \
    16. mysql-workbench-community
    17.  
    18. CMD mysql-workbench


参考

7行目以降のapt installでインストールしている各パッケージ(lsb-release他)はDockerを起動中あるいは起動後の操作中にエラーが発生し、その都度、足りないパッケージを追加し、最終的にこのような形になりました。また、MySQL Workbench Requirements on Linuxを参照して追加したものもあります(gnome-keyring)。MySQL Workbenchのメジャーバージョンが上がったりすると、チューニングが必要になるかもしれません。


Dockerコンテナのビルド

それでは、Dockerコンテナをビルドしてみましょう。

  1. コマンドプロンプトを起動します。
  2. MySQL Workbench用のDockerフォルダへカレントディレクトリを移動します。
    cd C:\Work\docker\mysqlworkbench
  3. mysqlworkbenchというイメージ名でビルドします。
    docker build -t mysqlworkbench .


    ビルドが完了するまでに5分程度かかります。コマンド実行から完了までに1,570行のコマンドアウトプットが出ました。(汗)
    Sending build context to Docker daemon  125.4kB
    Step 1/5 : FROM ubuntu:20.04
     ---> adafef2e596e
    Step 2/5 : ENV MYSQL_APT_CONFIG_DEB mysql-apt-config_0.8.19-1_all.deb
     ---> Running in 68129c4a567a
    Removing intermediate container 68129c4a567a
     ---> d06e88ff9cb8
    Step 3/5 : ADD ./${MYSQL_APT_CONFIG_DEB} /tmp/${MYSQL_APT_CONFIG_DEB}
     ---> 8fc247220d89
    Step 4/5 : RUN apt update && apt install -y     lsb-release     wget    gnupg   libsecret-1-0   dbus-x11        gnome-keyring   && dpkg -i /tmp/${MYSQL_APT_CONFIG_DEB}   && apt update && apt install -y     mysql-workbench-community
     ---> Running in 2fa0190499b9
    
    WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
    
    Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
    Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
    Get:3 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1137 kB]
    :
    :
    Setting up libglx0:amd64 (1.3.2-1~ubuntu0.20.04.1) ...
    Setting up mysql-workbench-community (8.0.26-1ubuntu20.04) ...
    Processing triggers for hicolor-icon-theme (0.17-2) ...
    Processing triggers for libc-bin (2.31-0ubuntu9) ...
    Processing triggers for shared-mime-info (1.15-1) ...
    Processing triggers for mime-support (3.64ubuntu1) ...
    Removing intermediate container 2fa0190499b9
     ---> a2b0e5d8d190
    Step 5/5 : CMD mysql-workbench
     ---> Running in 36c6a1f37e18
    Removing intermediate container 36c6a1f37e18
     ---> 390d23f98905
    Successfully built 390d23f98905
    Successfully tagged mysqlworkbench:latest
    SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.


以上で、MySQL WorkbenchのDockerコンテナイメージの作成は完了です。一旦ビルドすれば、次回からはこの時間がかかる処理は不要になります。


動作確認

ビルドしたコンテナイメージを起動し、MySQL Workbenchの画面表示、MySQLサーバとの接続確認を行います。

ビルド後のコマンドプロンプトをそのまま利用します。閉じてしまった場合は、コマンドプロンプトを起動し、カレントディレクトリをMySQL Workbench用のDockerフォルダへ移動してください。

画面表示設定

Xサーバを経由してMySQL Workbenchの画面を表示させるために、環境変数の設定を行います。

  1. ipconfigコマンドを実行し、WindowsホストのIPアドレスを確認します。私の場合、今回は192.168.24.113になります。
  2. DISPLAY環境変数にホストのIPアドレス、ディスプレイ番号、スクリーン番号を指定します。
    set DISPLAY=192.168.24.113:0.0


Docker VMのIPアドレス取得

今回、MySQLサーバには特別なIPアドレスを設定していません。MySQLサーバコンテナ外からアクセスするには、ホストで稼働しているDocker VMのIPアドレスの3306/tcpポートにアクセスすることで、自動的にMySQLサーバコンテナに通信が転送されます。そこで、Docker VMに割り当てられているIPアドレスを調べます。

Docker VMの名前を指定しdocker-machine ipコマンドを実行します。この結果から、192.168.17.129がDocker VMのIPアドレスであることが分かりました。

docker-machine ip docker-host
192.168.17.129


MySQL Workbench Dockerコンテナの起動

  1. ビルドしたmysqlworkbenchコンテナを起動するために、以下のコマンドを実行します。
    ※--cap-add="IPC_LOCK"がないと、gnome-keyring-deamnで問題が発生します。
    docker run -d --name mysqlworkbench -e DISPLAY=%DISPLAY% --rm --cap-add="IPC_LOCK" mysqlworkbench
  2. MySQL Workbenchの画面が表示されました!以下のような警告メッセージがでましたが、「Don't show this message again」にチェックを付けて、「OK」ボタンをクリックします。


  3. 早速、稼働中のMySQLサーバコンテナにアクセスしてみましょう。Databaseメニューをクリックし、「Connect to Database...」をクリックします。


  4. 「Connect to Database」ウィンドウで、DB接続情報を入力します。HostnameにはDocker VMのIPアドレス(例:192.168.17.129)、UsernameとPasswordにはMySQL Serverサービスに接続するための情報(例:root/mysql)を指定します。


  5. 初めてMySQL Workbenchコンテナでデータベース接続設定を行う場合は、Keyringのパスワードを指定するように求められます。これは安全にデータベース接続パスワードを保存するためのしくみを使うためのマスターパスワードになります。適当なパスワードを指定します。


  6. 「Connect to Database」ウィンドウで、「OK」ボタンをクリックします。MySQLサーバとの接続が成功すれば、管理コンソールが表示されます。


  7. 左ペインのMANAGEMENT→Server Statusをクリックしてみましょう。このように、問題なくMySQLコンテナ内のMySQLサーバサービスにアクセスできていることが確認できました。


  8. MySQL Workbenchを閉じます。


補足:恒久的に設定情報を保存するには?

MySQL Workbenchを閉じると、Dockerコンテナ起動時に--rmオプションを指定しているためコンテナが消失します。MySQL Workbench上で設定した情報(例:MySQLサーバ接続情報)は削除されます。これらの情報を保存し、次回新規に同コンテナを起動した際に利用できるようにするためには、Dockerコンテナ起動時のコマンドで、ホストとゲスト間でディレクトリを共有するのがよいでしょう。

  1. 以下コマンドでは、-vオプションを使って、ホスト側のC:\Work\docker\mysqlworkbench\configと、MySQL Workbenchの設定情報が格納されるMySQL Workbenchコンテナ内の/root/.mysql/workbenchを共有します。
    docker run -d --name mysqlworkbench -e DISPLAY=%DISPLAY% -v /mnt/hgfs/Work/docker/mysqlworkbench/config:/root/.mysql/workbench --rm --cap-add="IPC_LOCK" mysqlworkbench


  2. ※ホスト側ではVMがC:\Workを/mnt/hgfs/Workとして認識できるように事前設定しています。VMWare Workstationをハイパーバイザーにしている場合の制約で、このマッピング設定が必要だったと認識しています。機会があればどこかで記事にしたいと思います。

  3. 再度DB接続情報を登録します。
  4. MySQL Workbenchを閉じます。(コンテナが削除される)
  5. 再度、手順1のコマンドを実行します。
  6. 接続情報が残っていることが確認できます。



おわりに

今回は、今までに紹介した内容の組み合わせで、スクラッチでLinux上にインストールしたMySQL Workbenchコンテナの画面を表示・操作することができました。何といってもWindows環境を汚さないところがよいですね。また、Dockerコンテナ同士の通信、ホスト―ゲスト間のディレクトリ共有の方法を紹介しました。

Dockerコンテナが複数稼働する環境では、操作ステップ数や順序に気を付けるなど、操作が煩雑になることもわかりました。次のステップとしてdocker-composeを使って簡易・効率的にコンテナを管理することを紹介したいと思います。