“com.mysql.jdbc.exceptions.jdbc4.communicationsexception:通信链路故障”

bt1cpqcv  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(622)

对于这个问题,我已经看到了许多答案,今天我正在努力解决我的问题我已经花了2天多的时间在这上面了,但仍然不知所措)。
我的情况是:
它在我的mac 10.13.1上
mysql使用一个docker容器运行,我设置了所有这些特权。 docker exec -it mysql bash ==> cd /etc =>我找到了一个 my.cnf 文件,我在其中添加了 bind-address=127.0.0.1 我有一个本地mysql工作台,可以连接到这个mysql服务器, 127.0.0.1:3306 并从数据库中获取结果。
但是,当我的应用程序在第二个docker容器中启动时,我无法将它连接到另一个容器上的mysql数据库。这是我在应用程序启动期间使用的命令部分:

docker run -d ... -e DB_URL=jdbc:mysql://127.0.0.1:3306/mydatabase --name myApp  --restart=always --link mysql myApp_t:latest

但一旦myapp启动,我可以从它的日志中找到如下消息:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_111]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_111]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_111]
...

有什么线索吗?我还能做什么?

68bkxrlz

68bkxrlz1#

这与其说是mysql/jdbc连接,不如说是docker的问题。第二个docker容器无法到达第一个容器,因为那里的127.0.0.1指向容器本身,而不是第一个容器。
首先,您不应该配置 bind_address 在第一个容器中 127.0.0.1 . 你要么把它忘了,要么把它设成 0.0.0.0 . 您可能没有重新启动mysql,否则您也无法在自己的机器上从mysql工作台进行连接。
通过网络连接的能力 127.0.0.1 从您的计算机到在docker中运行的应用程序只能在您的计算机上使用,不能在容器之间使用。
命令行显示链接的 myApp 容器到 mysql 容器(使用 --link mysql ). 这意味着作为连接url,您应该使用:

jdbc:mysql://mysql:3306/mydatabase

即:替换 127.0.0.1mysql 作为mysql容器的主机名,在这两个容器之间进行通信。

相关问题