DockerでMySQL環境構築
使用する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
と互換性があるとドキュメントに記載があるので、そちらに合わせます。
実際に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
は以下の通りです。
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
については、今回は最低限の設定値のみを指定する以下の内容としています。
開発していて、不都合があれば、適宜修正したいと思います。
[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs # 照合順序
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
上記のdocker-compose.yml
とmy.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をインストールして接続してみたいと思います。
以下からインストーラーをダウンロードして、インストールしました。
インストールしたDBeaverを起動します。
すると以下の画面が表示され、接続するDBタイプはMySQL
を選択します。
Dockerにログインして動作確認した接続情報を入力して、テスト接続
をクリックします。
MySQLのドライバが見つからないということで、ダウンロード画面を表示されます。
JDBCをインストールするようで、Java(かJVMで動く言語)で実装されているようですね、DBeaver。
JDBCのバージョンは8.0.29
ということでサーバー側の8.0.28
より新しいので問題なく動くかと思われるので、そのまま進みます。
ドライバをインストールして、進もうとするとエラーが出ました。
ググるとドライバのプロパティallowPublicKeyRetrieval
をTRUE
にする必要があるようで、設定を変更して、再度テスト接続
ボタンをクリックします。
おぉ、今度は無事接続できました!
さらに進むとデータベース名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日本語ドキュメント
MySQLリファレンス
MySQL Dockerコンテナの公式サイト
Discussion