我已经看到了很多关于这个问题的答案,我今天想解决这个问题。 (我已经花了2天多时间,但仍然无能为力)。
以下是我的情况:
它在我的Mac 10.13.1
MySQL运行时有一个docker容器,我已设置了所有这些权限。
docker exec -it mysql bash
==> cd /etc
=>我在哪里找到my.cnf
文件,其中添加了bind-address=127.0.0.1
我有一个本地MySQL Workbench,它可以连接到这个MySQL服务器127.0.0.1:3306
并从数据库中获取结果。
但是,当我的应用程序在第二个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
但是一旦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]
...
还有什么线索我还在做什么?
答案 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容器的主机名,以便在这两个容器之间进行通信。