Spring Boot + MySQL docker 容器
Posted
技术标签:
【中文标题】Spring Boot + MySQL docker 容器【英文标题】:Spring Boot + MySQL docker containers 【发布时间】:2022-01-09 00:21:12 【问题描述】:我有两个容器,一个带有 Srping 应用程序,另一个带有 mysql。当我在本地机器上运行 Spring 应用程序时,它成功连接到我在 docker 容器中运行的 MySQL 数据库。启动 Spring 容器后,我收到连接错误,应用程序无法与 MySQL 容器通信。如何配置 Spring 容器与 db 容器通信?我试过创建一个桥接网络无济于事。我相信我的问题是spring.datasource.url=jdbc:mysql://localhost:3309/library
,但是当我尝试使用网络 ID 时,jar 无法构建spring.datasource.url=jdbc:mysql://lms-network/library
。我一直在关注this 教程。码头工人image.
【问题讨论】:
【参考方案1】:有几种方法可以解决。
使用 docker-compose
将两个容器放入 docker-compose 文件中。示例:
version: "3"
services:
spring-boot-service:
build:
context: .
ports:
- 8080:8080
environment:
DB_HOST: mysql-db
DB_NAME: library
DB_USER: <user>
DB_PASSWORD : <pwd>
mysql-db:
image: mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: <db_name>
#... other properties
然后在 application.properties 中,使用连接字符串:
spring.datasource.url=jdbc:mysql://$DB_HOST:3306/$DB_NAME
然后使用docker-compose up
一起运行两个容器。这样他们将通过 docker-compose 共享网络。
使用 host.docker.internal
当您在单独的容器中运行 Spring Boot 应用程序和 mysql 时,您不能再从 localhost 引用 mysql 数据库,因为 localhost 意味着指向您的容器。由于 mysql 在您的主机上运行,您可以通过在连接字符串中使用 host.docker.internal 而不是 localhost 来引用它。
所以你的连接字符串应该是
spring.datasource.url=jdbc:mysql://host.docker.internal:3309/library
【讨论】:
我试过了,但仍然出现连接错误。如果我无法连接到 SQL 数据库,我不明白如何构建图像,因为 Spring 会在生成 jar 之前尝试运行应用程序。 理想的构建不应该依赖于 SQL 连接。您的单元测试可能是针对 MySQL 编写的。您能否分享您所面临错误的日志? 我明白了。谢谢您的帮助。这个视频有帮助 -> youtube.com/watch?v=PAQvxqocb6A以上是关于Spring Boot + MySQL docker 容器的主要内容,如果未能解决你的问题,请参考以下文章
Docker环境下Spring Boot应用内存飙升分析与解决
Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL