MySQL 検証用 Docker 環境を使って SQL の練習をしよう

こんにちは。株式会社 Interfamilia の Kuma です。

このたび、MySQLのSQLってどんな挙動をするんだっけ?
という自分の疑問を解消するために、気軽に作ったり壊したりできる検証用のMySQL環境をDockerで作成しました。

今後さらに初期データを充実させていきたいと思っています。
当社のGitHubリポジトリで公開しています。ぜひご利用ください。

interfamilia/testing-mysql-docker
MySQL 検証用 Docker 環境


今回の記事では、この検証用環境の使い方と、検証用環境を作った際の小ネタについて紹介していきたいと思います。
※初学者向けの記事になっています。手っ取り早く試してみたい、という方は、リポジトリの README を見て頂ければ十分だと思います。

目次

MySQL 検証用 Docker 環境について

最新の MySQL がコンテナ上に初期データとともに展開されます。
動作確認は、以下のように Windows と Mac で行っています。

  • Windows 10 Pro
  • MacBook Air (M1, 2020) MacOS Monterey (12.4)

なお、本番環境利用は想定していません。あくまで検証用としてご利用ください。


利用する前に

事前に以下の準備をお願いします。

  • Git がインストールされている。
  • Docker Desktop がインストールされており docker-compose コマンドが使える。

作成されるデータベースについて

データベースとテーブルの構成は以下になっています。

  • データベース
    • company (企業)
  • テーブル
    • prefecture (都道府県)
    • employee (従業員)
    • employee_address (従業員の住所)
    • employee_salary (従業員の給料)

ER図

以下は MySQL Workbench で生成したER図です。
※なぜか employee_address の PK に鍵マークが付いていませんが、 employee_id が PK かつ FK です。

作成されるデータベースのER図
作成されるデータベースのER図

MySQL 検証用 Docker 環境を使ってみる

※Windowsでの実行例を載せています。

1. Docker Desktop を起動する。

Docker 自体が起動されていないと docker-compose が失敗します。まずは Docker Desktop を起動しましょう。

DockerDesktopインストール直後
DockerDesktopインストール直後

2. リポジトリを clone して、 docker-compose を実行する。

clone してくるディレクトリを作成します。
※ディレクトリ名「git」は任意で作成してください。

C:\Users\Kuma> mkdir git
C:\Users\Kuma> cd ./git

interfamilia/testing-mysql-dockergit clone して docker-compose up -d を実行します。

C:\Users\Kuma\git> git clone https://github.com/interfamilia/testing-mysql-docker.git
C:\Users\Kuma\git> cd ./testing-mysql-docker
C:\Users\Kuma\git\testing-mysql-docker> docker-compose up -d

Docker Desktop 上でコンテナが作成されていることが確認できます。

DockerDesktopコンテナ作成後
DockerDesktopコンテナ作成後

3. Docker Desktop の CLI (TERMINAL) で MySQL にアクセスしてみる。

Docker Desktop で CLI (TERMINAL) を開きます。
(前のバージョンの Docker Desktop では CLI と表現されていました。)

DockerDesktopでターミナルを開く
DockerDesktopでターミナルを開く

mysql コマンドで root ログインする。

# mysql -u root -p
Enter password: (rootと入力する)

use 文で company データベースを選択し、テーブルが作成されている確認します。
下記のように、4つのテーブルが作成されていれば成功です。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| company            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use company;
Database changed

mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| employee          |
| employee_address  |
| employee_salary   |
| prefecture        |
+-------------------+
4 rows in set (0.00 sec)

employee テーブルに7人の従業員情報が登録されています。
※データは全てダミーデータです。

mysql> select count(*) from employee;
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.01 sec)

mysql> select * from employee limit 1 \G
*************************** 1. row ***************************
        id: 1
    number: DEV-0001
      name: 山田 太郎
     email: taro@example.com
      role: developer
  position: manager
 hire_date: 2020-01-01
created_at: 2022-06-06 12:54:51.015374
updated_at: 2022-06-06 12:54:51.015374
1 row in set (0.00 sec)

4. うっかりテーブルを削除してみる。

うっかり employee_address テーブルを DROP してしまいました。

mysql> drop table employee_address;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| employee          |
| employee_salary   |
| prefecture        |
+-------------------+
3 rows in set (0.00 sec)

5. Docker 環境を作り直す。

検証していて、誤ってテーブルを削除してしまった場合など、データベースを元に戻したい時があります。
(きっとあります)

そんな時は、以下の手順で元に戻ります。

1. コンテナを削除する。
2. docker-compose を実行する。

それではやってみましょう。

まず、Docker Desktop でコンテナを停止して削除します。

DockerDesktopでコンテナを削除する
DockerDesktopでコンテナを削除する

そして、再び docker-compose up -d を実行します。

C:\Users\Kuma\git> cd ./testing-mysql-docker
C:\Users\Kuma\git\testing-mysql-docker> docker-compose up -d

コンテナが再び作成されているので、CLI (TERMINAL) で MySQL にアクセスします。

(早くアクセスしすぎて、 MySQL が起動できておらずエラーになっても焦らないようにしましょう)

# mysql -u root -p
Enter password: (rootと入力する)

テーブルが復活していることが確認できます。

mysql> use company;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| employee          |
| employee_address  |
| employee_salary   |
| prefecture        |
+-------------------+
4 rows in set (0.00 sec)

これで何度でもやり直せますね!


MySQL 検証用 Docker 環境作成時の小ネタ

MySQL WorkBench で参照すると日本語が文字化けする件

Windows で docker-compose up -d すると

mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.

という警告が出ていて、my.cnf の反映に失敗していました。
これにより、MySQL WorkBench から MySQL にアクセスした際に日本語の値が文字化けする、という事象が発生していたようです。

どうやら my.cnf をデフォルトのパーミッションより緩くしてはいけない、ということのようで

デフォルトのmy.cnfのPermissionは「664」
デフォルトのmy.cnfのPermissionは「664」

というように、デフォルトでは -rw-rw-r-- (664) の設定ですが、 Windows から反映しようとすると -rwxrwxrwx 777 になってしまっていて反映できなかったようです。

対策として、 Dockerfile を用意して、

FROM mysql:latest

ADD ./env/my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf

というように、 my.cnf のパーミッションを変更してあげることで解消できました。

ちなみに、デフォルトのパーミッションが -rw-rw-r-- (664) なので、

RUN chmod 664 /etc/mysql/conf.d/my.cnf

でも動きましたが、もっと厳しい -rw-r--r-- (644) でも動くのなら -rw-r--r-- (644) にしようと思い、そうしています。

M1 Mac でDockerイメージが取得できない件

M1 Mac で docker-compose up -d すると

ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries

とエラーになり起動できません。

これは、 M1 Mac の CPU linux/arm64/v8 に対応した MySQL の latest image が無いことで発生しているようでした。

解消するために docker-compose.yml に以下のように記述して、

platform: linux/x86_64

のように platform を記載して、 linux/amd64 を指定することで動くようになりました。

platform: linux/amd64 と記載しても同様に動きます。

ちなみに、 amd64 のイメージを利用すると、
「Image may have poor performance, or fail, if run via emulation」
という警告が表示されますが、今回の検証用途では問題無いので良しとします。

amd64のイメージを利用すると警告が表示される
amd64のイメージを利用すると警告が表示される

最後に

会社を一緒に盛り上げてくれる仲間を募集しています!

応募フォームには、外部サービスengageを利用しています。
ご応募に際して、何かわからないことなどございましたら こちら からお気軽にお問い合わせください。