DockerによるMySQL+サンプルDB(sakila, world)環境構築ガイド
本記事の概要
本記事では、Dockerを活用してMySQLにサンプルDB(sakila
, world
)をセットアップする方法を解説します。これにより、簡単にローカルでのMySQL環境の構築可能になります。また、sakila
とworld
は、MySQLのチュートリアルにもよく利用されますが、Dockerイメージには含まれていないため、環境構築のたびに手動導入する必要があります。本記事では、これらのデータベースもセットアップできるように解説しています。
前提とする環境
- OS: Windows 11
- バージョン: 23H2
- 64ビットオペレーティングシステム、x64ベースプロセッサ
ディレクトリ構成
最終的な構成は次のようになります。
mysql-container/
├── docker-compose.yml
├── Dockerfile
└── initdb/
├── 00-grant-user.sql
├── 01-sakila-schema.sql
├── 02-sakila-data.sql
└── 03-world.sql
docker-compose.ymlの準備
docker-compose.yml
を作成します。USER
やPASSWORD
は必要に応じて任意に設定してください。
version: '3.8'
services:
mysql:
build: .
container_name: mysql_container
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root-password
MYSQL_DATABASE: test_db
MYSQL_USER: user123
MYSQL_PASSWORD: password123
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Dockerfileの準備
Dockerfile
を作成します。
FROM mysql:8.4
COPY initdb /docker-entrypoint-initdb.d
サンプルDBの準備
以下のコマンドを順番に実行することでサンプルDBをダウンロードし、initdb
ディレクトリに配置します。initdb
の実行順を明示的にするためにsqlファイルの頭に番号を振っています。
# sakila
wget https://downloads.mysql.com/docs/sakila-db.zip
unzip sakila-db.zip
mv sakila-db/sakila-schema.sql initdb/01-sakila-schema.sql
mv sakila-db/sakila-data.sql initdb/02-sakila-data.sql
# world
wget https://downloads.mysql.com/docs/world-db.zip
unzip world-db.zip
mv world-db/world.sql initdb/03-world.sql
ユーザー権限設定
MySQLユーザーに各データベースへの権限を付与するため、00-grant-user.sql
を作成して以下の内容を記述します。ユーザー名はdocker-compose.yml
で定義したものと同じにします。
GRANT ALL PRIVILEGES ON sakila.* TO 'user123'@'%';
GRANT ALL PRIVILEGES ON world.* TO 'user123'@'%';
FLUSH PRIVILEGES;
起動と動作確認
Docker環境をビルドして起動します。
docker compose up --build
起動したら、以下のコマンドを実行することでコンテナ内のMySQLに接続し、データベースが正しくセットアップされていることを確認できます。
docker exec -it mysql_container mysql -uuser123 -ppassword123 -e "SHOW TABLES IN world;"
正常に動作していれば、world
データベースのテーブル一覧が表示されます。
まとめ
今回紹介した方法により、MySQLの代表的なサンプルDBであるsakila
とworld
を含んだ環境を簡単に構築することができました。これにより、教材やチュートリアルのための学習環境の整備が容易になります。特に、公式イメージに含まれていないサンプルDBの導入をDockerfile
とinit
のスクリプトでカバーすることで、環境構築の手間を削減できます。
Discussion