🐳

DockerでMySQL環境構築

2022/10/25に公開

使用するDB

次回からSpring BootアプリケーションでDBへの接続する処理を作成したいと思います。

DBについてMySQLを使います。
理由は以下です。

  • 汎用的に使えるRDBMSとする(通常のWebシステムだと、やはりRDBMSが主流なため)
  • 2022年時点で大規模データ、複雑なシステムでもOSS(PostgreSQL、MySQL)が採用されるケースが多い(私の個人的な経験から)
  • 個人的に業務できちんと使ったことがないので、知見を深めたい
  • MariaDBと迷ったがAuroraでの使用を見据えてMySQL

MariaDBについてはオンプレやIaaS上に環境を構築する場合についてはライセンス面含めてメリットが大きいとも思ったのですが、AWSで実際に本番環境として使用する場合、Auroraを採用するケースが多いと思いまして、MySQLにしました。
互換性が高いようなので、とりあえずの勉強用であれば大きな違いは無いと思っています

Docker上で構築

Macを使用しているのですが、一時的な開発用なので、MacOSと独立した環境に構築したいため、Docker上で構築します。
(極力、環境を汚したくない)

環境情報

今回、作業した環境は以下となります。

分類 環境
PC MacBook Air(M1, 2020)
OS macOS Monterey(バージョン12.3.1)
Docker version 20.10.16

DockerでのMySQL環境の構築

実際に環境を構築していきます。

MySQLのバージョン

MySQLのバージョンはAuroraで採用しているバージョンが8.0.28と互換性があるとドキュメントに記載があるので、そちらに合わせます。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.Versions.html

実際にAWSマネジメントコンソールで確認しても、compatible with MySQL 8.0.23と記載されています。
RDSを確認したところ、細かくバージョンが選択できました。

Auroraで選択できるバージョン

RDSで選択できるバージョン

コンテナの作成

構築するMySQLコンテナの設定は以下の通りとします。

設定項目 設定値
コンテナ名 mysql-container
データベース名 demo
rootのパスワード root
TimeZone Asia/Tokyo

設定する値が多くdocker runではつらいので、Docker Composeを使うことにします。
docker-compose.ymlは以下の通りです。

docker-compose.yml
version: "3.9"

services:
  mysql:
    image: mysql:8.0.28
    platform: linux/amd64
    container_name: mysql-container
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: demo
      TZ: "Asia/Tokyo"
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf

M1 Macだとplatformを指定しないとエラーになるようで、明示的に指定しました。
また、コンテナ外からMySQLのクライアントツールやIDE(Intellij IDEA)等から接続するので、ポート番号も指定します。
MySQLの設定値を指定するためにmy.cnfを作成して、所定の場所に配置するようにもしています。

my.cnfについては、今回は最低限の設定値のみを指定する以下の内容としています。
開発していて、不都合があれば、適宜修正したいと思います。

my.cnf
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs # 照合順序

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

上記のdocker-compose.ymlmy.cnfを適当なディレクトリに配置します。
配置したディレクトリで、以下のコマンドを実行して、コンテナを作成します。

# docker-composeでコンテナを起動
docker-compose up -d

# コンテナイメージ一覧
docker image ls

# 実行中のコンテナ一覧
docker ps
実行結果
% docker-compose up -d
Pulling mysql (mysql:8.0.28)...
8.0.28: Pulling from library/mysql
4be315f6562f: Pull complete
96e2eb237a1b: Pull complete
8aa3ac85066b: Pull complete
ac7e524f6c89: Pull complete
f6a88631064f: Pull complete
15bb3ec3ff50: Pull complete
ae65dc337dcb: Pull complete
654aa78d12d6: Pull complete
6dd1a07a253d: Pull complete
a32905dc9e58: Pull complete
152d41026e44: Pull complete
42e0f73ebe32: Pull complete
Digest: sha256:fc77d54cacef90ad3d75964837fad0f2a9a368b69e7d799665a3f4e90e600c2d
Status: Downloaded newer image for mysql:8.0.28
Creating mysql-container ... done

% docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
amazonlinux   2         1c44e7db5ae0   4 weeks ago    194MB
mysql         8.0.28    f2ad9f23df82   6 months ago   521MB

% docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
5bc540ba30d1   mysql:8.0.28   "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-container

作成したMySQLコンテナの確認

コンテナが作成され、コンテナ内でMySQLが正常に稼働しているか確認します。
コンテナにログインした後、ユーザーやOS情報など確認して、MySQLにログインしてみます。

# コンテナにログイン
docker exec -it mysql-container bash

コンテナにログイン後、以下のコマンドを実行。

# ログインユーザの確認
id

# Linuxカーネルの確認
uname -a

# Linuxディストリビューションの確認
cat /etc/os-release

# MySQLのバージョンの確認
mysql --version

# MySQLにログイン
mysql -u root -p
# パスワードを聞かれるので、rootと入力
実行結果
# id
uid=0(root) gid=0(root) groups=0(root)

# uname -a
Linux 7107aeeb38d4 5.10.104-linuxkit #1 SMP PREEMPT Thu Mar 17 17:05:54 UTC 2022 x86_64 GNU/Linux

# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# mysql --version
mysql  Ver 8.0.28 for Linux on x86_64 (MySQL Community Server - GPL)

# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

上記の一番最後の通り、プロンプトがmysql>と表示されれば、SQLが実行できる状態となります。
MySQL上にデータベースが作成されているか確認して、作成されたデータベースの設定が指定した通りのものになっているか確認します。

-- データベース一覧
show databases;

-- データベース切り替え
use demo

-- 接続中のデータベースを確認
select database();

-- 文字コードの確認
show variables like '%char%';

-- 照合順序の確認
show variables like '%collation%';
実行結果
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| demo               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.12 sec)

mysql> use demo
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| demo       |
+------------+
1 row in set (0.00 sec)

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| 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.07 sec)

mysql> show variables like '%collation%';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| collation_connection          | utf8mb4_0900_ai_ci    |
| collation_database            | utf8mb4_ja_0900_as_cs |
| collation_server              | utf8mb4_ja_0900_as_cs |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci    |
+-------------------------------+-----------------------+
4 rows in set (0.02 sec)

select文も正常に実行され、データベースとして正常に動作しているようです。

MySQLクライアントによる接続確認

次にコンテナ外からMySQLに接続できるか確認していきます。
MySQLをきちんと使用するのは初めてだったため、Macで使えるクライアントツールは以下の3つが良さそうでした。

  • MySQL Workbench
  • Sequel Pro(Sequel Ace)
  • DBeaver

DBeaverが軽く、使い心地が良さそうでER図も作成できるようなので、とりあえずDBeaverをインストールして接続してみたいと思います。
以下からインストーラーをダウンロードして、インストールしました。
https://dbeaver.io/

インストールしたDBeaverを起動します。
すると以下の画面が表示され、接続するDBタイプはMySQLを選択します。

Dockerにログインして動作確認した接続情報を入力して、テスト接続をクリックします。

MySQLのドライバが見つからないということで、ダウンロード画面を表示されます。
JDBCをインストールするようで、Java(かJVMで動く言語)で実装されているようですね、DBeaver。
JDBCのバージョンは8.0.29ということでサーバー側の8.0.28より新しいので問題なく動くかと思われるので、そのまま進みます。

ドライバをインストールして、進もうとするとエラーが出ました。

ググるとドライバのプロパティallowPublicKeyRetrievalTRUEにする必要があるようで、設定を変更して、再度テスト接続ボタンをクリックします。

おぉ、今度は無事接続できました!

さらに進むとデータベース名demoが表示され、それっぽい画面が出てきました。

demoを選択して、テーブルを開こうとすると空っぽです。
とりあえずメニューバーのSQLをクリックするとSQL入力画面が出ます。

テーブルなくても通るSQLを発行すると正常にレスポンスが返ってきて、正常に接続できることが確認できました。

最後に基本的なSQLが通るか発行してみます。

create table tab_a(col1 integer);
insert into tab_a (col1) values (1);
select * from tab_a;
rollback;
select * from tab_a;
drop table tab_a;

一通り、正常に動作することが確認できました。

なお、余談ですが、途中rollbackしても次のselect文で値が返ってくるので、AutoCommitされてそうですね。
RDBMS側の仕様なのか、クライアントツールの設定なのか調べてみます。
MySQLはデフォルトでAutoCommitのようなので、RDBMS側の仕様でした。
insert、update、deleteなどDMLを実行する都度コミットされるようです。

まとめ

MySQL環境が構築できました。
個人的にDBは興味があるので、もう少し触ってみたいところですが、一旦おいといて、次回からはSpring BootアプリケーションからMySQLに接続してみたいと思います。

では、今回は以上となります。

参考サイト

参考までに各種公式ドキュメントのリンクです。
docker-compose.ymlやmy.cnfの設定をカスタマイズしたい場合は参照してみてください。

Docker Compose日本語ドキュメント

https://docs.docker.jp/compose/toc.html

MySQLリファレンス

https://dev.mysql.com/doc/refman/8.0/en/
https://dev.mysql.com/doc/refman/8.0/ja/

MySQL Dockerコンテナの公式サイト

https://hub.docker.com/_/mysql

Discussion