Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将docker容器与主机连接';是本地主机mysql数据库吗?_Mysql_Docker - Fatal编程技术网

如何将docker容器与主机连接';是本地主机mysql数据库吗?

如何将docker容器与主机连接';是本地主机mysql数据库吗?,mysql,docker,Mysql,Docker,我有一个war文件,它在后端使用MySQL数据库。 我已经在docker容器中部署了我的war文件,我可以从浏览器ping这个文件。 我想将我的应用程序连接到MySQL数据库。此数据库存在于我的主机的localhost:3306 由于我无法从容器的本地主机内部连接它,我尝试的是, 我运行一个命令docker inspect--format'{{.NetworkSettings.IPAddress}}'213be777a837 这个命令给了我一个IP地址172.17.0.2。我转到MySQL服务器

我有一个war文件,它在后端使用MySQL数据库。 我已经在docker容器中部署了我的war文件,我可以从浏览器ping这个文件。 我想将我的应用程序连接到MySQL数据库。此数据库存在于我的主机的
localhost:3306

由于我无法从容器的本地主机内部连接它,我尝试的是, 我运行一个命令
docker inspect--format'{{.NetworkSettings.IPAddress}}'213be777a837
这个命令给了我一个IP地址172.17.0.2。我转到MySQL服务器选项,将这个IP地址放在绑定字段中,然后重新启动服务器。之后,我用
172.17.0.2:3306

但它不起作用。谁能告诉我我错过了什么? 我还尝试添加一个具有root@%权限的新DB用户,然后运行命令allow all permission to‘root@%’,但没有任何效果

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-


2-

您的设置很好。你只需要改变一下

运行应用程序容器(部署war文件的容器)时,需要在其
docker run
命令中添加以下参数

--net=host
例如:

docker run -itd -p 8082:8080 --net=host --name myapp myimage
通过此更改,您还需要而不是来更改连接字符串<代码>本地主机:3306可以正常工作。您将能够设置与MySQL的连接。

按照以下步骤操作:-

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

然后部署。

根据您的问题,我假设您的
war文件
MySQL
都部署在本地,并且您希望将它们连接起来。允许本地部署的两个容器相互通信的一种方法是:

  • 创建您自己的网络
    docker网络创建

  • 然后在运行
    war文件
    MySQL
    时,使用--network部署这两个文件。例如

    • War文件:
      docker run--命名War文件--网络
    • MySQL:
      docker run——名称MySQL——网络
  • 之后,如果您应该能够从war文件docker容器中使用
    MySQL:3306
    连接到MySQL,因为它们都在同一个自定义网络上


  • 如果您想了解更多关于此的信息,可以查看网络上的docker文档。()。

    “不工作?”不是一个有用的术语。那么错误信息是什么呢?你的结果是什么?你期待什么?显示您的dockerfile/如何启动它。我无法获得数据库连接。这些步骤看起来正常吗?这是内部IP地址。环境是什么?启动或运行容器时是否公开或重新映射端口3306?否如果是网络或权限问题,“获取连接”也不明确。特别是对错误消息要特别注意。这就是为什么我要求您提供docker文件以及您是如何启动它的。运行docker容器ls我可以看到容器ID映像命令创建的状态端口名称213be777a837 6ab907c973d2“catalina.sh run”44小时前20分钟0.0.0.0:8082->8080/tcp我的tomcatI am在windows机器上不熟悉Docker for windows,但它看起来像是基于虚拟机的方法。看起来这个问题已经得到了回答。请检查是否有效。你救了我一天。非常感谢。这就是我想要的(这会禁用正常的Docker网络隔离和容器间通信,这不是我推荐的解决方案……但它应该在Linux上工作。)@DavidMaze是的,你是对的。但我很想知道你对此类问题的建议解决方案。谢谢。这里有其他答案,或者是中更详细的解释。