我有一个war文件,该文件在后端使用MySQL数据库。
我已将我的war文件部署在docker容器中,并且能够从浏览器ping通此文件。
我想将我的应用程序与MySQL数据库连接。该数据库位于我的主机的localhost:3306
由于我无法从容器的本地主机中连接它,所以我尝试的是
我运行命令docker inspect --format '{{ .NetworkSettings.IPAddress }}' 213be777a837
该命令为我提供了一个IP地址 172.17.0.2 。我转到了MySQL服务器选项,并将此IP地址放在bind字段中,然后重新启动了服务器。之后,我用172.17.0.2:3306
但是它不起作用。谁能告诉我我想念的东西吗? 我也尝试过使用root @%添加一个新的数据库用户,然后运行命令'all @%'的所有权限,但没有任何效果。
答案 0 :(得分:1)
执行以下步骤:-
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet
docker run -p 8082:8080 --network dockernet -d 6ab907c973d2
in your project set connection string : jdbc:mysql://host.docker.internal:3306/....
然后部署。
答案 1 :(得分:1)
根据您的问题,我假设您的war file
和MySQL
都部署在本地,并且您想将它们连接起来。允许本地部署的两个容器相互通信的一种方法是:
创建自己的网络docker network create <network-name>
然后,当您运行war file
和MySQL
时,请使用--network部署它们两者。例如
docker run --name war-file --network <network-name> <war file image>
docker run --name mysql --network <network-name> <MySQL image>
之后,如果您应该能够从战争文件docker容器中使用mysql:3306
连接到MySQL,因为它们都在同一自定义网络上。
如果您想阅读更多有关此的内容,可以查看网络上的docker文档。 (https://docs.docker.com/network/bridge/)。
答案 2 :(得分:0)
tl; dr :如果您使用的是Linux,请使用172.17.0.1:3306
。
详细说明:
据我了解,您需要做的是将Docker容器连接到主机端口。但是,您要做的是尝试将主机进程(MySQL)绑定到容器网络接口。不确定主机进程试图绑定到另一个主机进程网络名称空间有什么含义,但是IIUC您的MySQL进程应该无法绑定到该地址。
在使用默认设置启动MySQL并将其绑定到0.0.0.0
时,它可通过Docker虚拟网桥用于Docker容器。因此,您应该做的是通过该虚拟网桥将请求从WAR进程路由到主机进程(如果这是您正在使用的联网模式。如果您没有更改任何Docker联网设置,应该使用它)。通过将网桥网关地址指定为MySQL地址及其启动的端口来完成此操作。
您可以通过检查网络接口来获取网桥IP地址。安装Docker时,默认情况下会配置虚拟网桥,如果您使用Linux,它将显示为docker0
。此IP地址很可能是172.17.0.1
。因此,从容器的角度来看,您的MySQL地址为jdbc:mysql://172.17.0.1:3306/...
。
1-https://docs.docker.com/network/
2-{{3}}
答案 3 :(得分:0)
您的设置很好。您只需要进行这一更改。
在运行应用程序容器(用于部署war文件的容器)时,您需要在其docker run
命令中添加以下参数。
--net=host
示例:
docker run -itd -p 8082:8080 --net=host --name myapp myimage
进行此更改后,您还不需要不需要来更改连接字符串。 localhost:3306
可以正常工作。您将能够与MySQL建立连接。