【问题标题】:"com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure"“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障”
【发布时间】:2018-05-11 23:10:15
【问题描述】:

我已经看到了很多关于这个问题的答案,我今天正在尝试解决我的问题。 (我已经花了 2 天以上的时间,但仍然一无所知)。

这是我的情况:

  1. 在我的 Mac 10.13.1 上

  2. MySQL 使用一个 docker 容器运行,我设置了所有这些权限。

  3. docker exec -it mysql bash ==> cd /etc => 我在其中找到了一个my.cnf 文件,我在其中添加了bind-address=127.0.0.1

  4. 我有一个本地 MySQL 工作台,它能够连接到这个 MySQL 服务器 127.0.0.1:3306 并从数据库中获取结果。

  5. 但是,当我的应用程序在第二个 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 启动,我可以从它的日志中找到 msg:

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]
...

任何线索我还可以做什么?

【问题讨论】:

    标签: mysql docker jdbc containers


    【解决方案1】:

    这更像是一个 docker 问题,而不是 MySQL/JDBC 连接。您的第二个 docker 容器无法到达您的第一个,因为那里的 127.0.0.1 指向容器本身,而不是第一个容器。

    首先,您不应该将第一个容器中的bind_address 配置为127.0.0.1。您要么需要忽略它,要么将其设置为0.0.0.0。您可能没有重新启动 MySQL,否则您也无法在自己的机器上从 MySQL Workbench 进行连接。

    通过127.0.0.1 从您的机器连接到在 docker 中运行的应用程序的功能仅在您的机器上可用,而不是在容器之间。

    您的命令行显示您将myApp 容器链接到mysql 容器(使用--link mysql)。这意味着您应该使用连接 URL:

    jdbc:mysql://mysql:3306/mydatabase
    

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

    【讨论】:

    • 非常感谢您的提示。它确实给了我解决问题的正确方向。另外,我刚刚意识到我的jdbc驱动程序是旧版本,而下载的mysql是8+版本。一旦我都更正了,我的案子现在可以工作了!
    • @user3595231 如果我的回答帮助您解决了问题,请点击复选标记接受。
    猜你喜欢
    • 2014-12-31
    • 2011-02-28
    相关资源
    最近更新 更多