100秒でMySQLのローカル環境をDockerで作って、データも自動で入れる。最強のSQL練習環境構築法
特に理由もなくローカルに MySQL を入れて遊びたくなる気持ちって定期的に湧きますよね。
私は湧きます、半年に 1 回ぐらい。
業務ではフロントを触ることが多く、DB はそれほど触りません。
そのため久々に MySQL をローカルで立ち上げようとするといつも手順を忘れてしまっていて、なんやかんや立ち上げまで 15 分ぐらかかってしまいます。
そこで次回 MySQL で遊びたくなった時の自分のために、MySQL を Docker 化してテストデータごと GitHub に保存しておくことにしました。
そうすることによって、いつでもコマンド 1 発で ローカル環境に MySQL が立ち上がり、テストデータも自動的に注入されて、幸せになれます。
いい感じに遊べるデータも入る
今回使用するコードは以下 GitHub リポジトリにアップロードしてあります。
手順
以下のコマンドを Mac のターミナルから実行してください。3 ステップのみです。
- GitHub からリポジトリをクローンする
git clone git@github.com:tadatakuho/mysql-docker.git
- クローンした
mysql-docker
に移動する
cd mysql-docker
- 以下の Docker コマンドで MySQL を起動&データ注入
docker-compose up -d
以上!
これで既に MySQL が立ち上がってデータも入っているので、ポート3306番に接続するとデータを確認することができます。
データ確認方法
データを確認する方法は何でも良いのですが、特にこだわりがなければ MySQL の GUI クライアントアプリSequel Aceが使いやすくてオススメです。
SequelAce
SequelAce を立ち上げて、以下の DB 接続情報を入力します。
Host: localhost
Username: root
Password: root
SequelAce を立ち上げた時に出てくる画面
データベースを選択
からsakila
を選択
データが入っていることが確認できます!
映画の俳優データ
テーブル構造も分かりやすく確認できる
データの内容
今回入れたデータは、MySQL の公式がサンプルとして配布しているsakilaと名付けられた練習用データです。
sakila はレンタルビデオショップのレンタル管理システムのデータです。
いい感じのテーブル数とデータ量が準備されていて、MySQL でクエリを発行して色々遊ぶのに最適です。
ER 図 一部抜粋
SequelAce はクエリを実行することもできるので、クエリを叩いて遊びまくることができます。
レンタルビデオショップで評価 3 以上の映画を抽出
sakila 練習問題
で検索すると、以下のような練習問題を考えてくださってる方の素晴らしい記事に出会えます。
Docker 詳細説明
さて、ここからは今回作った仕組みの実装の中身です。
Docker とは
好きな環境をコマンド一発で作ることができるツールです。
めーっちゃ簡単に言うと、
もろもろ欲しい環境が全て設定済みの pc をまるごと、自分の pc の中に仮想的に一瞬で作れるやつ、みたいな感じです。(正確には違う)
詳しく知りたい方には、以下の記事が分かりやすかったのでおすすめです。
ディレクトリ構成
.
├── init
│ ├── init.sh # Dockerが立ち上がった時に走るシェルスクリプト
│ └── sql
│ ├── sakila-data.sql # テーブル作成用
│ └── sakila-schema.sql # データ注入用
├── docker-compose.yml # Docker設定
└── my.cnf # MySQLの設定ファイル
my.cnf
は文字コード設定のために置いてますが、無くても動くと思います。
my.cnf 詳細
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
寿司ビール問題解消のために置いています。
【参考記事】
docker-compose.yml
Docker の設定です。
docker-compose up -d
実行の時に使われるもので、今回のメインとなるファイルです。
version: "3"
services:
mysql:
image: mysql:latest # プロダクトで使うならバージョンはlatestじゃないほうが良いです
container_name: mysql_container
environment:
MYSQL_ROOT_PASSWORD: root # MySQLパスワード設定
MYSQL_DATABASE: sakila # MySQLデータベース名設定
TZ: "Asia/Tokyo"
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf # MySQLの設定ファイル指定
- ./init:/docker-entrypoint-initdb.d # コンテナ作成時に走るシェルスクリプト指定
ports:
- "3306:3306"
MySQL のイメージでは、docker-entrypoint-initdb.d
ディレクトリ配下に初期化用の SQL やスクリプトを置くことによって、コンテナ作成時にそのファイルが自動的に実行されます。
今回の場合、init.sh
のシェルスクリプトがコンテナ作成時に自動的に実行されます。
init.sh
以下のシェルスクリプトで、sakila
のテーブル作成とデータ流し込みを行っています。
#!/bin/bash
# DDLでテーブルを作成する
mysql -u root -proot sakila < "/docker-entrypoint-initdb.d/sql/sakila-schema.sql"
# データを流し込む
mysql -u root -proot sakila < "/docker-entrypoint-initdb.d/sql/sakila-data.sql"
時間測定!
GitHub リポジトリ ダウンロードから環境が立ち上がるまでのタイムを図ってみると、102 秒でした!
Discussion