SpringBoot向けのMySQLサーバーのセットアップの手順を整理
目的
SpringBoot向けのMySQLサーバーをDockerを使ってセットアップ覚え書き
永続化設定済みでMySQLコンテナ起動確認まで
環境
WSL バージョン: 2.3.26.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.4460
Rancher Desktop V1.16.0
MySQL 8.0
プロジェクト作成
まずはSpringInitializrを使用してプロジェクトのひな形を生成。
今回はDBの起動までなので依存ライブラリの設定などはシンプルに無しで進める。
demoプロジェクト内は以下の構成になっている。
.
├── .mvn
│ └── wrapper
│ └── maven-wrapper.properties
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── demo
│ │ │ └── DemoApplication.java
│ │ └── resources
│ │ └── application.properties
│ └── test
│ └── java
│ └── com
│ └── example
│ └── demo
│ └── DemoApplicationTests.java
├── .gitattributes
├── .gitignore
├── HELP.md
├── mvnw
├── mvnw.cmd
└── pom.xml
srcと同じ階層にinfraフォルダを作成し、さらにdbフォルダを追加。
MySQLコンテナ作成
コンテナの設定とMySQLの設定のために次の2つのファイルを作成する。
- Dockerfile
- my.cnf
my.cnfファイルはMySQLの設定ファイル。
格納先は複数あり、読み込み優先度が異なる。
Dockerfile作成
demo\infra\db\Dockerfile
にDockerfile
を作成する。
FROM mysql:8.0
COPY ./conf.d/my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 etc/mysql/conf.d/my.cnf
RUN mkdir -p /var/log/mysql \
&& chown -hR mysql:mysql /var/log/mysql
Dockerfileの内容
- MySQLのバージョンを指定
- MySQLの設定ファイルをコンテナ内に複製
- 設定ファイルの権限変更
- サブディレクトリを含めて/var/log/mysqlを作成
- ディレクトリとシンボリックリンクの両方の所有者をmysqlに変更
MySQL設定ファイルmy.cnf作成
db
フォルダにconf.d
フォルダを作成する。
conf.d
フォルダにmy.cnf
ファイルを作成する。
my.cnf
のパスはdemo\infra\db\conf.d\my.cnf
となる。
my.cnfの中身は次のように設定する。
[mysqld]はMySQLサーバーが対象の設定を表す。
他に[client]などがあり、[client]の場合はコンテナで使用するMySQLクライアントの設定を表す。
[mysqld]
#error log
log-error = /var/log/mysql/mysql-error.log
#slow query log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1.0
#general log
general_log = 1
general_log_file = /var/log/mysql/mysql-general.log
今回はログの出力先等を設定している。
composeコマンド準備
docker composeのコマンドを使用するための準備。
infraフォルダに次の2つのファイルを作成する。
- compose.yml
- .env
compose.yml
services:
db:
build: ./db
restart: always
container_name: mysql-container
ports:
- "${FORWARD_DB_PORT:-3306}:3306"
environment:
MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}"
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: "${DB_DATABASE}"
MYSQL_USER: "${DB_USER}"
MYSQL_PASSWORD: "${DB_PASSWORD}"
volumes:
- db_store:/var/lib/mysql
- ./db/logs:/var/log/mysql
volumes:
db_store:
build:
の部分で指定したディレクトリをのDockerfileを使用してコンテナを作成できる。
restart: always
でコンテナが停止したときに自動で再起動するように設定。
ports:
の"${FORWARD_DB_PORT:-3306}:3306"
は環境変数FORWARD_DB_PORT
が設定されていない場合デフォルトで3306ポートを使用することを表す。
トップレベルのvolumes:
は複数のコンテナを横断してボリュームを利用する場合必要となる。
.envファイル
FORWARD_DB_PORT= 3306
DB_DATABASE= demoMySQL
DB_USER= demouser
DB_PASSWORD= demopassword
さらにdemoプロジェクト内の.gitignore
ファイルに .envファイルとdbのログフォルダを追加する。
#env
.env
#db logs
demo/infra/db/logs/
イメージ作成
RancherDesktopが起動していることを確認。
次のコマンドを
demo\infra
の階層で実行する。
docker compose build
エラーにならず完了すればOK。
demo\infra\db
でdocker images
のコマンドを打つとビルドされたイメージを確認することができる。
コンテナ起動
作成したイメージをもとにコンテナを作成して起動する。
demo\infra
の階層で次のコマンドを実行することで起動まで行える。
docker compose up
(timezoneを設定していないためtimezone周りの設定をskipするメッセージが出る。)
既にコンテナは起動済み。
次の画像のようにlogsのフォルダが自動で生成されログが格納される。
Ctrl+C
で次のようなメッセージを表示してコンテナを停止できる。
同じコンソールで作業を続けたい場合はdocker compose up -d
でバックグラウンド起動を行う。
コンテナを起動した状態でdemo\infra
でdocker compose ps -a
docker compose ps
に-a
オプションをつけると停止中のコンテナも一覧に表示することができる。(つけていない場合は起動中のコンテナのみ表示される。)
STATUSがUp 27 seconds
となっていて無事コンテナが起動していることが確認できた。
補足
- イメージとコンテナを削除する
docker compose down
- イメージ、コンテナ、ボリュームをまとめて削除する
docker compose down -v
参考