サイト名変更・お引越しのお知らせ

Dockerでデータを永続化しつつMySQLの環境を構築する方法を解説

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アクセス画面

こんな感じで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の環境を構築する方法を解説しました。

参考になれば幸いです!

【Docker】覚えておきたい基本コマンド一覧を解説