Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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通信_Docker_Docker Networking - Fatal编程技术网

不同容器中应用程序之间的Docker通信

不同容器中应用程序之间的Docker通信,docker,docker-networking,Docker,Docker Networking,我一直在到处寻找这个答案。对我来说,这似乎是一个显而易见的问题,然而,答案却让我难以捉摸 我目前的设置是,我在同一网桥网络上有redis、mongodb和两个api服务器。第一个服务器充当网关api,执行所有身份验证,并公开某些api调用。后端api是处理所有db交互和数据屏蔽的api。如果我单独点击后端(内部)api,我就能看到内容(该api不会在实际生产环境中公开)。但是,如果我从网关api中发出相同的请求,我将无法访问后端(内部)api,该api也是我创建的桥接网络的一部分 下面是容器交互

我一直在到处寻找这个答案。对我来说,这似乎是一个显而易见的问题,然而,答案却让我难以捉摸

我目前的设置是,我在同一网桥网络上有redis、mongodb和两个api服务器。第一个服务器充当网关api,执行所有身份验证,并公开某些api调用。后端api是处理所有db交互和数据屏蔽的api。如果我单独点击后端(内部)api,我就能看到内容(该api不会在实际生产环境中公开)。但是,如果我从网关api中发出相同的请求,我将无法访问后端(内部)api,该api也是我创建的桥接网络的一部分

下面是容器交互的示意图


我仍然使用传统链接,但我对此有点熟悉。我认为问题在于,您试图从网关容器内部点击“localhost”。无法将内部API容器解析为网关API容器内部的“localhost”。由于端口映射,您可以从主机或外部点击“localhost:8099”,但其他容器都无法解析该地址/端口,因为它们“认为”它是远程计算机

这里有一个方法来测试我的想法。在主机的shell中,运行所示的bridge inspect命令。从
容器中复制IP地址
IPV4
。然后用
docker exec-it/bin/bash
打开网关容器中的shell,然后使用
curl
wget
查看是否可以点击复制的IP地址

如果我的想法是正确的,您将看到必须使用内部API节点的Docker从其他容器分配的IP地址。在其他选项中,您可以使用静态IP地址启动容器,如图所示


这已开始超出我的知识范围,但您也可以配置容器DNS

网关API用于连接到内部API的地址是什么?你是用普通的Docker做的吗?组成你能发布你运行的命令来启动这个设置吗?我现在的方式是,普通docker,网关API在0.0.0.0:8090公开,内部API在0.0.0.0:8099公开
docker-run--net=isolated_-network-itd-v/volume:/opt/volume--name busybox1-p 8010:8090 busybox“some command”docker-run--net=isolated_-network-itd-v/volume2:/opt/volume2--name busybox2-p 8010:8090 busybox“some command 2”
从网关api调用内部api时,我使用创建容器时给出的名称调用内部网关:
curl-xgethttp://busybox2/api/resource/one
我尝试了您的建议,但是,我可以ping busybox2和分配给容器的ip。但是名称+端口组合不起作用。我想如果我有一个网桥设置,我必须公开busybox2容器上的端口吗?或者名称就足够了?文档中说“此默认网络中的容器可以使用IP地址相互通信。Docker不支持默认网桥网络上的自动服务发现。”因此,如果没有进一步的配置,仅使用名称将无法工作。我不确定您是否仍然需要端口映射。在你的Docker网络中,容器将能够通信(通过IP地址),而无需手动暴露任何端口。只要确保没有港口碰撞。如果您想公开一个端口,即您的GatewayAPI,您仍然可以在网络之外公开该端口,并将其映射到您想要的任何位置。