docker composeでMySQLの環境構築とデータ永続化 | アントレプログラマー

docker composeでMySQLの環境構築とデータ永続化

Docker

こんにちは、ニキです。

この記事はこんな方におすすめです。

  • docker composeの基本的なことは分かる。
  • docker composeでMySQLの環境構築したい。
  • docker composeでデータを永続化したい。
  • MySQLの設定ファイルmy.cnfの設定内容を学びたい。

今回の記事では、docker composeを使ってMySQLの環境構築とデータ永続化の方法を解説します。

Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

環境情報

  • 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の設定内容を学びたい。
Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
Docker
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました