『初めてのSQL』を進めるためのMySQL環境をDockerで構築する
この記事にはアフィリエイトリンクが含まれています。
はじめに
しばらくの間ずっと設計の勉強をしているが、最近は設計関連でリレーショナルモデルの学習の一環としてDBのインプットをしている。
その教材の一つとして、最近は『初めてのSQL』を読み始めた。
この本ではMySQLを使って解説を進めるようなので、Dockerを使ってその環境構築をすることにした。
レポジトリはこちら↓
サンプルデータをダウンロード
MySQLの公式ページからsakila
というサンプルデータをダウンロードしておく。
環境構築
docker-compose.yml
に環境を記述していく。開発環境なのでパスワードはむき出しだ。
version: '3.1'
services:
mysql:
image: mysql:8.0.29
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: sakila
TZ: 'Asia/Tokyo'
volumes:
- ./init:/docker-entrypoint-initdb.d
ports:
- '3306:3306'
DockerのMySQLイメージでは、docker-entrypoint-initdb.d
にマウントしたディレクリに初期化用のスクリプトなどを置いておくと、コンテナ作成時にそれらを読み込んで実行してくれるらしい。
次に、docker-entrypoint-initdb.d
で読み込む初期化ファイルと、先ほどダウンロードした初期データとして流し込むサンプルデータを設定する。
init.sh
に初期化スクリプトを、./init/sql
配下にサンプルデータとスキーマを配置する。
.
├── init
│ ├── init.sh
│ └── sql
│ ├── sakila-data.sql
│ └── sakila-schema.sql
以下のスクリプトでサンプルのスキーマとデータを流し込む。
#!/bin/bash
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"
実行
以下のコマンドを実行するとMySQLサーバーが実行される。一緒にサンプルデータの流し込みも完了した。
docker-compose up -d
コンテナ内からMySQLサーバーに接続するには以下のコマンドでコンテナに入り、
docker-compose run mysql bash
以下のコマンドでサーバーにログインする。
mysql -u root -h host.docker.internal -p
コンテナ内からのログインなので、ホストはhost.docker.internal
を指定する(これに気づくのにすごく時間を溶かした)。
この指定をしなかったせいでとSQLサーバーにアクセスできず以下のようなエラーに悩まされ時間が溶けていった。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (99)
おわり
これでできたのは環境構築にすぎない。これから本格的にDBの世界に潜り込んでいきたい。