【大坑!已解决】docker容器jar包连不上另一个容器的mysql

docker容器jar包连不上另一个容器的mysql

最终解决方案

mysql 版本 l8.0.35,驱动是 8.0.26,com.mysql.cj.jdbc.Driver

jdbc 的 url:

jdbc:mysql://云服务器的主机地址(127.0.0.1 和 localhost 都不行):3306/hotkey_db?useUnicode=true&characterEncoding=utf-8&useSSL=true&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT&useTimezone=true

(有些参数应该是没用的,但是懒得改了,能跑就行)

问题场景

这两天在云服务器的 docker 上部署了 jar 包,jar 包要连另一个容器的 mysql,在本地测试过本地运行的 jar 包可以连接云服务器的 mysql,但是云服务器的 docker 的 jar 包连不上。具体展示如下:jar 包成功运行后登录时就会报这样的错误,执行 sql 查询失败,说是连不上 mysql ,以下是 jar 包的部分日志。

报错日志

登录时执行 mysql 查询失败,因为连不上 mysql,用 docker network 查看了网络信息,这些个容器启动时候已经在同一个 docker 网络了,并且在 jar 包的容器中可以 ping 通 mysql 的网关

mysql 连接报错

communications link failure,很经典的错误,去网上查了很多解决办法,包括但不限于修改 jar 包的 jdbc 的 url 连接参数,比如 useSSL=false、时区 serverTimeZone、localhost 和 127.0.0.1,甚至是 mysql 的配置文件 my.cnf,说是因为连接池连接过期的,要修改 wait_timeout。结果没一个能解决问题的,后来问了一个朋友,他正好遇见过同样的问题,之前还给我说过但是我没记住 🤣,他的解决方案就是把 jdbc 的 url 换成云服务器的主机地址,而非 127.0.0.4 或 localhost。至此问题解决。

分析

docker 的每个容器之间是进程隔离的,每个容器都相当于一个独立的主机,我的 jar 和 mysql 不在同一个容器,相当于 mysql 和 jar 包不在一个主机上,那么 jar 包里的 127.0.0.1:3306 显然是连不到 mysql 的。

最后又试了试,如果 jar 包和 mysql 不在同一个 docker 网络,也是可以正常运行的,因为 jar 已经通过主机地址访问到 mysql 了

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计