結論:docker環境のSpringBootコンテナからMySQLコンテナに接続する場合、docker-compose.ymlのenvironment:
で接続情報を渡す必要があります。
docker-SpringBoot-MySQLでアプリからMySQLに接続できた例
version: "3.8"
services:
app:
tty: true
container_name: okozukai-system
build:
context: ./app
args:
JAR_FILE: ./okozukai-system.jar
ports:
- "8085:8080"
networks:
okozukai-network:
depends_on:
- db
environment:
spring.datasource.driverClassName: "com.mysql.cj.jdbc.Driver"
spring.datasource.url: "jdbc:mysql://db/okozukai"
spring.datasource.username: "okozukaiadmin"
spring.datasource.password: "xxxxxx"
db:
container_name: okozukai-db
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_DATABASE: okozukai
MYSQL_USER: okozukaiadmin
MYSQL_PASSWORD: xxxxxx
MYSQL_ROOT_PASSWORD: rootpassword
platform: linux/x86_64
expose:
- 3306
ports:
- 3306:3306
volumes:
- ./db/data:/var/lib/mysql
networks:
okozukai-network:
application.ymlの設定情報は無視されるようです。
spring:
## DB接続情報
dataSource:
url: jdbc:mysql://localhost/okozukai
username: okozukaiadmin
password: xxxxxx
driver-class-name: com.mysql.cj.jdbc.Driver
docker-SpringBoot-MySQLでアプリからMySQLに接続できなかった例
version: "3.8"
services:
app:
tty: true
container_name: okozukai-system
build:
context: ./app
args:
JAR_FILE: ./okozukai-system.jar
ports:
- "8085:8080"
networks:
okozukai-network:
depends_on:
- db
db:
container_name: okozukai-db
image: mysql:8
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_DATABASE: okozukai
MYSQL_USER: okozukaiadmin
MYSQL_PASSWORD: lknuve7gAre
MYSQL_ROOT_PASSWORD: rootpassword
platform: linux/x86_64
expose:
- 3306
ports:
- 3306:3306
volumes:
- ./db/data:/var/lib/mysql
networks:
okozukai-network:
SpringBootにおいてDBの接続情報はapplication.yml(.properties)に記述していると思います。
spring:
## DB接続情報
dataSource:
url: jdbc:mysql://db/okozukai
username: okozukaiadmin
password: lknuve7gAre
driver-class-name: com.mysql.cj.jdbc.Driver
docker-compose.ymlにMySQLのサービス名は"db"なので、application.ymlの接続URLも"localhost"ではなく、"db"にしていたのですが、これだけ接続できませんでした。
(CommunicationLinkFailureというエラーが発生しました)