🐬

DockerによるMySQL+サンプルDB(sakila, world)環境構築ガイド

に公開

本記事の概要

本記事では、Dockerを活用してMySQLにサンプルDB(sakila, world)をセットアップする方法を解説します。これにより、簡単にローカルでのMySQL環境の構築可能になります。また、sakilaworldは、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を作成します。USERPASSWORDは必要に応じて任意に設定してください。

docker-compose.yml
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を作成します。

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であるsakilaworldを含んだ環境を簡単に構築することができました。これにより、教材やチュートリアルのための学習環境の整備が容易になります。特に、公式イメージに含まれていないサンプルDBの導入をDockerfileinitのスクリプトでカバーすることで、環境構築の手間を削減できます。

Discussion