こんにちは、ニキです。
この記事はこんな方におすすめです。
- docker composeの基本的なことは分かる。
- docker composeでMySQLの環境構築したい。
- docker composeでデータを永続化したい。
- MySQLの設定ファイルmy.cnfの設定内容を学びたい。
今回の記事では、docker composeを使ってMySQLの環境構築とデータ永続化の方法を解説します。
環境情報
- Chip: Apple M1
- macOS: Ventura 13.2.1
- Docker: 20.10.22
docker composeでMySQLの環境構築
MySQLの設定ファイルmy.cnfを作成
MySQLの設定ファイルとして、my.cnfを作成します。
% touch my.cnf
my.cnfを以下のように編集します。
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
[client]
default-character-set = utf8mb4
compose.yamlの作成
compose.yamlを作成します。
% touch compose.yaml
以下のように編集します。
services:
db:
image: mysql:8.0.34
container_name: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Tokyo
volumes:
- ./data:/var/lib/mysql
- ./my.cnf:/etc/mysql/conf.d/my.cnf
- TZ: Asia/Tokyo
デフォルトのままだとUTCなので、日本時間に変更しています。
- ./data:/var/lib/mysql
データの永続化のために必要です。この設定が無いままコンテナを削除すると、データが消えてしまいます。
- ./my.cnf:/etc/mysql/conf.d/my.cnf
事前に作成したmy.cnfを使用して、コンテナに設定を反映します。
MySQLコンテナの作成
コンテナを作成します。
% docker compose up -d
コンテナのリストを確認します。
% docker compose ps
以下のように表示されていれば、MySQLコンテナは正常に動作しています。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
mysql mysql:8.0.34 "docker-entrypoint.s…" db 52 seconds ago Up 50 seconds 3306/tcp, 33060/tcp
MySQLのDockerコンテナ上のデータ永続化を確認
ここからは、データベースやテーブルの作成ができるかをコマンドラインで確認します。
macOSへMySQLクライアントをインストールする方法を解説します。すでにインストール済みであれば読み飛ばしてください。
macOSにMySQLクライアントをインストール
Homebrewのバージョンを確認します。
% brew -v
執筆時点では最新のバージョンです。
Homebrew 4.1.2
Homebrew/homebrew-core (git revision 45be88f3e52; last commit 2023-02-19)
Homebrew/homebrew-cask (git revision ae2074d43a; last commit 2023-02-18)
mysql-clientをインストールします。
% brew install mysql-client
インストールが完了したら、パスを通します。
% echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.zsh_rc
設定を反映させます。
% source ~/.zsh_rc
MySQLへ接続・データ作成
MySQLに接続します。
% mysql -u root -h 0.0.0.0 -p
パスワードを求められるので入力します。MYSQL_ROOT_PASSWORDで設定した値です。
Enter password:
データベースを作成します。
mysql> create database db;
作成したデータベースに切り替えます。
mysql > use db;
テーブルを作成します。
mysql> create table user (id int, name varchar(10), created_at timestamp, updated_at timestamp);
データを入れます。
mysql> insert into user(id, name, created_at, updated_at) values(1, 'テスト', now(), now());
データを確認します。
mysql> select * from user;
以下のように表示されていればOKです。
+------+-----------+---------------------+---------------------+
| id | name | created_at | updated_at |
+------+-----------+---------------------+---------------------+
| 1 | テスト | 2023-07-30 19:20:34 | 2023-07-30 19:20:34 |
+------+-----------+---------------------+---------------------+
1 row in set (0.01 sec)
永続化の確認
データの永続化を確認するために、コンテナを削除します。
% docker compose down
コンテナを再度作成し、先ほど作成したデータが残っていればOKです。
MySQLの設定ファイルmy.cnfの反映前後を比較
character_setはutf8mb4一択です。
collationは、日本語の複雑さを解決するために多くの選択肢があります。一長一短ありますが、utf8mb4_general_ciはMySQL5系のデフォルトとして活躍し、安定感の面で無難な選択かと思います。
設定ファイルmy.cnfがあるとき
character_setを確認します。
mysql> SHOW VARIABLES LIKE 'character_set_%';
character_setは以下のように、基本的にutf8mb4に設定されています。
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)
collationを確認します。
mysql> SHOW VARIABLES LIKE 'collation_%';
collationは以下のように、utf8mb4_に設定されています。
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.05 sec)
設定ファイルmy.cnfがないとき
character_setを確認します。
mysql> SHOW VARIABLES LIKE 'character_set_%';
character_setは以下のように、utf8mb4に設定されていせん。
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.02 sec)
collationを確認します。
mysql> SHOW VARIABLES LIKE 'collation_%';
collationは以下のような感じです。
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
3 rows in set (0.01 sec)
まとめ
今回の記事では、docker composeを使ってMySQLの環境構築とデータ永続化の方法を解説しました。
以下が達成できていれば幸いです。
- docker composeでMySQLの環境構築したい。
- docker composeでデータを永続化したい。
- MySQLの設定ファイルmy.cnfの設定内容を学びたい。