開発環境であれば、docker化するのはMySQLだけで良いです。
この記事では
・docker上にMySQLコンテナを作成する
・flywayでDDLを実行する
・SpringBootからMySQLに接続する
手順を解説します。
Contents
docker上にMySQLコンテナを作成する
次のようなdocker-compose.ymlを用意します。
version: "3"
services:
db:
container_name: db
image: mysql:8
restart: always
environment:
MYSQL_ROOT_PASSWORD: "rootpass"
MYSQL_DATABASE: "okozukai"
MYSQL_USER: "okozukaiadmin"
MYSQL_PASSWORD: "xxxxx"
ports:
- 3306:3306
volumes:
- db-mysql:/var/lib/mysql
volumes:
db-mysql:
docker-compose.ymlのあるディレクトリで、コンテナを起動します。
// コンテナを起動
$ docker-compose up -d
Creating network "okozukai-docker_default" with the default driver
Creating db ... done
// コンテナの起動確認
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98feeb4ceced mysql:8 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp db
MySQLコンテナ削除後もデータを残すために
volumes:
- db-mysql:/var/lib/mysql
volumes:
db-mysql:
この記述により、ホスト(ローカル)のdocker管理領域にある「db-mysql」というボリュームを、MySQLコンテナの「/var/lib/mysql」にマウントします。
この記述がないと、docker-compose down
したり、コンテナを削除(docker rm
)した時に、DBのデータが消えてしまいます。
但し、コンテナを削除するとDBのデータは消えますが、コンテナを停止(docker stop
)して再度起動(docker start
)した場合はデータは残っています。
SpringBootやflywayからMySQLに接続するために
ports:
- 3306:3306
この記述により、ホスト(ローカル)の3306ポートが、MySQLコンテナの3306ポートに転送されます。
つまり、「localhost:3306」はコンテナの3306ポートを意味するようになります。
この記述がないと、コンテナの3306ポートがホストに公開されず、コンテナの3306ポートにアクセスできません。
flywayでDDLを実行する
MySQLコンテナの3306ポートがホストの3306と紐づいているため、従来通りの方法でflyway migrateなどを行うことができます。
flyway {
url = 'jdbc:mysql://localhost:3306/okozukai'
user = 'okozukaiadmin'
password = 'xxxxx'
schemas = ['okozukai']
}
SpringBootからMySQLに接続する
MySQLコンテナの3306ポートがホストの3306と紐づいているため、従来通りの方法でSpringBootから接続できます。
spring:
dataSource:
url: jdbc:mysql://localhost:3306/okozukai
username: okozukaiadmin
password: xxxxx
driver-class-name: com.mysql.cj.jdbc.Driver
server:
port: 8082
SpringBootからDBに接続できました。
DBツールからMySQLに接続する
MySQLコンテナの3306ポートがホストの3306と紐づいているため、従来通りの方法で各種DBツールから接続できます。