Dockerを使って、データを永続化しつつ、MySQLの環境を構築する方法を解説します。
- データ永続化方法
- DockerでMySQLの環境を構築する方法
- MySQL 8.0
全体のディレクトリ・ファイル構成
まずは、わかりやすいように全体のディレクトリ・ファイル構成を説明します。
モグモグさん
ご自身で作成するときの参考にしてください。
docker-compose.yml
mysql/
- config/
- my.conf
- db/
- seed/
- init.sql
- Dockerfile
my.confファイルを作成
MySQLの設定ファイルを作成します。
ここでは文字コードをutf8mb4
としていますが、utf8
にするなどご自身の設定に合わせてください。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
utf8: 1~3バイトまで対応
utf8mb4: 1〜4バイトまで対応
例えば、絵文字などを保存したい場合はutf8ではできないので、utf8mb4に設定する必要があります。
Dockerfileを作成
続いてDockerfileを作成します。
公式のイメージはこちらです。
モグモグさん
コメントにて、簡単な説明を加えていますので参考にしてください。
# Dockerイメージの指定
FROM mysql:8.0
# ポートの開放
EXPOSE 3306
# 設定ファイルのコピー
COPY ./config/my.cnf /etc/mysql/conf.d/my.cnf
# 実行コマンド
CMD ["mysqld"]
docker-compose.ymlを作成
次にdocker-compose.ymlを作成します。
モグモグさん
コメントにて、簡単な説明を加えていますので参考にしてください。
version: "3"
services:
mysql:
build: ./mysql/ # Dockerfileの指定
image: test-mysql-server # イメージ名
container_name: test-mysql-server # コンテナ名
volumes:
- ./mysql/seed:/docker-entrypoint-initdb.d # 初回データ実行
- ./mysql/db:/var/lib/mysql # データ永続化
environment:
- MYSQL_ROOT_PASSWORD=password # パスワード設定
公式のMySQLイメージでは、/docker-entrypoint-initdb.d
に.sql
のデータをマウントすると初回のみ実行してくれるのでそれを利用しています。
参考: 公式ドキュメントのInitializing a fresh instance
セクション
初回データ作成
モグモグさん
初回データが不要な場合は、この手順は不要です!
最後に初回データ流し込み用の.sql
ファイルを用意します。
test
というデータベースを作成し、movies
テーブルにいくつかのデータを挿入しています。
DROP DATABASE IF EXISTS test;
CREATE DATABASE test;
DROP TABLE IF EXISTS movies;
CREATE TABLE `movies` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
`rating` varchar(5) NOT NULL,
`category` varchar(10) NOT NULL,
`purchased` date NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Big Advenure','G','family','2002-03-06');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Shiny Things, The','PG','drama','2002-03-06');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('End of the Line','R','misc','2001-02-05');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('A Rat named Darcy','G','family','2003-04-19');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Head First Rules','R','action','2003-04-19');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Mad Clowns','R','horror','1999-11-20');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Greg: The Untold Story','PG','action','2001-02-05');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Potentially Habitable Planet','PG','scifi','2001-02-05');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Weird Things from Space','PG','scifi','2003-04-19');
INSERT INTO `movies` (`title`,`rating`,`category`,`purchased`) VALUES ('Shark Bait','G','misc','1999-11-20');
コンテナ立ち上げ・MySQLにアクセス
ここまでで、準備ができたのでコンテナを立ち上げてMySQLにアクセスしてみましょう!
コンテナ立ち上げ
$ docker compose up
// もしくはバックグラウンドで実行
$ docker compose up -d
コンテナに入る
$ docker exec -it test-mysql-server /bin/bash
MySQLにアクセス
モグモグさん
パスワードはご自身で設定したものを入力してください。
$ mysql -uroot -ppassword
こんな感じでMySQLに接続できれば完了です!
DBとデータ確認
モグモグさん
初回データが入っているか確認しましょう。
データ確認
MySQLに接続した状態でコマンドを実行してください。
$ show databases;
$ use test;
$ select * from movies;
データベース・テーブル・moviesデータ全て入っていることが確認できますね!
モグモグさん
データは、db/
に永続化されておりコンテナを落としても、データは残ります。
リセット方法
最後に、リセット方法としてコンテナとデータの削除方法を解説します。
コンテナやイメージなど綺麗に削除
$ docker compose down --rmi all --volumes --remove-orphans
永続化データを削除
$ rm -rf mysql/db/*
まとめ
Dockerを使って、データを永続化しつつ、MySQLの環境を構築する方法を解説しました。
参考になれば幸いです!