如何解决Spring Boot容器连接MySQL容器时出现的java.net.UnknownHostException问题?
如何解决Spring Boot容器连接MySQL容器时出现的java.net.UnknownHostException问题?
嘿,我来帮你搞定这个头疼的连接问题!你遇到的java.net.UnknownHostException,大概率是两个常见原因导致的,咱们一步步排查解决:
一、先检查数据库连接URL的主机名
在Docker Compose的自定义网络里,容器之间是通过服务名来互相访问的,你配置的MySQL服务名是mysqldb,所以Spring Boot应用里的数据库连接URL绝对不能写localhost或者127.0.0.1——这些在容器里指向的是容器自己,不是MySQL容器!
你得把JDBC URL改成这样:
jdbc:mysql://mysqldb:3306/mysql-db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
对应到Spring Boot的配置文件(比如application.properties)里,就是:
spring.datasource.url=jdbc:mysql://mysqldb:3306/mysql-db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC spring.datasource.username=user spring.datasource.password=password
这里要注意,URL里的数据库名mysql-db要和你MySQL容器里配置的MYSQL_DATABASE值一致,用户名密码也要对应上你设置的MYSQL_USER和MYSQL_PASSWORD。
二、处理depends_on的“假就绪”问题
你在Compose里加了depends_on: mysqldb,但这个配置只是让Spring Boot容器晚于MySQL容器启动,不代表MySQL服务已经完全就绪了——MySQL启动后还要做初始化(比如创建数据库、加载权限表),这时候应用去连肯定会失败。
给你几个解决办法:
- 临时应急:手动重启一次Spring Boot容器,等MySQL完全初始化好之后再连,一般就能成功。
- 长期靠谱方案1:给Spring Boot加连接重试机制。比如用HikariCP的配置(Spring Boot默认用Hikari),在配置文件里加:
这里spring.datasource.hikari.initialization-fail-timeout=0 spring.datasource.hikari.connection-timeout=20000initialization-fail-timeout=0会让连接池一直重试连接,直到MySQL可用为止。 - 长期靠谱方案2:用脚本检测MySQL就绪状态再启动应用。比如你可以在Dockerfile里加入
wait-for-it.sh脚本,启动应用前先检测mysqldb:3306端口是否能连通,确认MySQL服务 ready 了再启动Spring Boot。
三、确认网络配置没问题
你已经把两个容器都加到local-network这个自定义网络里了,这部分是对的!同一个自定义网络下的容器才能通过服务名互相解析,所以这部分不用改,只要确保配置没写错就行。
按照上面的步骤来,应该就能解决你的UnknownHost问题啦!
备注:内容来源于stack exchange,提问作者Onur Uysal
相关产品推荐
相关产品推荐

