" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通讯链接失败"

时间:2018-05-11 23:10:15

标签: mysql docker jdbc containers

我已经看到了很多关于这个问题的答案,我今天想解决这个问题。 (我已经花了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 Workbench,它可以连接到这个MySQL服务器127.0.0.1:3306并从数据库中获取结果。

  5. 但是,当我的应用程序在第二个Docker容器中启动时,我无法将其连接到MySQL数据库,而MySQL数据库位于不同的容器中。 这是我在应用启动期间使用的命令部分:

    docker run -d ... -e DB_URL=jdbc:mysql://127.0.0.1:3306/mydatabase --name myApp  --restart=always --link mysql myApp_t:latest
    
  6. 但是一旦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]
    ...
    

    还有什么线索我还在做什么?

1 个答案:

答案 0 :(得分:0)

这更像是一个码头问题,而不是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容器的主机名,以便在这两个容器之间进行通信。