MySQL 検証用 Docker 環境を使って SQL の練習をしよう
こんにちは。株式会社 Interfamilia の Kuma です。
このたび、MySQLのSQLってどんな挙動をするんだっけ?
という自分の疑問を解消するために、気軽に作ったり壊したりできる検証用のMySQL環境をDockerで作成しました。
今後さらに初期データを充実させていきたいと思っています。
当社のGitHubリポジトリで公開しています。ぜひご利用ください。
interfamilia/testing-mysql-docker
MySQL 検証用 Docker 環境
今回の記事では、この検証用環境の使い方と、検証用環境を作った際の小ネタについて紹介していきたいと思います。
※初学者向けの記事になっています。手っ取り早く試してみたい、という方は、リポジトリの README を見て頂ければ十分だと思います。
目次
最新の 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 (従業員の給料)
以下は MySQL Workbench で生成したER図です。
※なぜか employee_address
の PK に鍵マークが付いていませんが、 employee_id
が PK かつ FK です。
※Windowsでの実行例を載せています。
Docker 自体が起動されていないと docker-compose
が失敗します。まずは Docker Desktop を起動しましょう。
clone
してくるディレクトリを作成します。
※ディレクトリ名「git」は任意で作成してください。
C:\Users\Kuma> mkdir git
C:\Users\Kuma> cd ./git
interfamilia/testing-mysql-docker
を git 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 上でコンテナが作成されていることが確認できます。
Docker Desktop で CLI (TERMINAL) を開きます。
(前のバージョンの Docker Desktop では CLI と表現されていました。)
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)
うっかり 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)
検証していて、誤ってテーブルを削除してしまった場合など、データベースを元に戻したい時があります。
(きっとあります)
そんな時は、以下の手順で元に戻ります。
1. コンテナを削除する。
2. docker-compose
を実行する。
それではやってみましょう。
まず、Docker Desktop でコンテナを停止して削除します。
そして、再び 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)
これで何度でもやり直せますね!
Windows で docker-compose up -d
すると
mysqld: [Warning] World-writable config file '/etc/mysql/my.cnf' is ignored.
という警告が出ていて、my.cnf の反映に失敗していました。
これにより、MySQL WorkBench から MySQL にアクセスした際に日本語の値が文字化けする、という事象が発生していたようです。
どうやら my.cnf をデフォルトのパーミッションより緩くしてはいけない、ということのようで
というように、デフォルトでは -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-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」
という警告が表示されますが、今回の検証用途では問題無いので良しとします。
応募フォームには、外部サービスengageを利用しています。
ご応募に際して、何かわからないことなどございましたら こちら
からお気軽にお問い合わせください。