🐬

100秒でMySQLのローカル環境をDockerで作って、データも自動で入れる。最強のSQL練習環境構築法

2022/02/24に公開

特に理由もなくローカルに MySQL を入れて遊びたくなる気持ちって定期的に湧きますよね。
私は湧きます、半年に 1 回ぐらい。

業務ではフロントを触ることが多く、DB はそれほど触りません。
そのため久々に MySQL をローカルで立ち上げようとするといつも手順を忘れてしまっていて、なんやかんや立ち上げまで 15 分ぐらかかってしまいます。

そこで次回 MySQL で遊びたくなった時の自分のために、MySQL を Docker 化してテストデータごと GitHub に保存しておくことにしました。
そうすることによって、いつでもコマンド 1 発で ローカル環境に MySQL が立ち上がり、テストデータも自動的に注入されて、幸せになれます。


いい感じに遊べるデータも入る

今回使用するコードは以下 GitHub リポジトリにアップロードしてあります。

https://github.com/tadatakuho/mysql-docker

手順

以下のコマンドを Mac のターミナルから実行してください。3 ステップのみです。

  1. GitHub からリポジトリをクローンする
git clone git@github.com:tadatakuho/mysql-docker.git
  1. クローンしたmysql-dockerに移動する
cd mysql-docker
  1. 以下の 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図
ER 図 一部抜粋

SequelAce はクエリを実行することもできるので、クエリを叩いて遊びまくることができます。


レンタルビデオショップで評価 3 以上の映画を抽出

sakila 練習問題で検索すると、以下のような練習問題を考えてくださってる方の素晴らしい記事に出会えます。
https://qiita.com/a-pompom/items/0e80fbaeed7657e7b474

Docker 詳細説明

さて、ここからは今回作った仕組みの実装の中身です。

Docker とは

好きな環境をコマンド一発で作ることができるツールです。

めーっちゃ簡単に言うと、
もろもろ欲しい環境が全て設定済みの pc をまるごと、自分の pc の中に仮想的に一瞬で作れるやつ、みたいな感じです。(正確には違う)

詳しく知りたい方には、以下の記事が分かりやすかったのでおすすめです。
https://tech-lab.sios.jp/archives/18811

ディレクトリ構成

ディレクトリ構成
.
├── init
│   ├── init.sh                 # Dockerが立ち上がった時に走るシェルスクリプト
│   └── sql
│       ├── sakila-data.sql     # テーブル作成用
│       └── sakila-schema.sql   # データ注入用
├── docker-compose.yml          # Docker設定
└── my.cnf                      # MySQLの設定ファイル

my.cnf は文字コード設定のために置いてますが、無くても動くと思います。

my.cnf 詳細
my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4

寿司ビール問題解消のために置いています。
【参考記事】
https://qiita.com/kamohicokamo/items/3cc05f63a90148525caf

docker-compose.yml

Docker の設定です。
docker-compose up -d実行の時に使われるもので、今回のメインとなるファイルです。

docker-compose.yml
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 のテーブル作成とデータ流し込みを行っています。

init.sh
#!/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