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

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

问题描述:

我一直在寻找这个答案。对我来说,这似乎是一个明显的问题,但是,答案已经避开了我。不同容器中的应用程序之间的Docker通信

我目前的设置是,我在同一个网桥上有redis,mongodb和两个api服务器。第一台服务器充当一个完成所有认证的网关API,并公开某些API调用。后端API是处理所有数据库交互和数据管理的API。如果我单独打开后端(内部)api,我可以看到内容(在实际生产环境中不会暴露此api)。但是,如果我在网关api内发出相同的请求,我无法访问也是我创建的桥接网络一部分的后端(内部)api。

下面是容器交互的图。

Docker container interaction

+0

Gateway API使用什么地址连接到Inner API?你是在普通的Docker中运行它吗?撰写?你能发布你运行的命令来完成这个设置吗? – johnharris85

+0

我现在拥有的方式是,普通泊坞窗,网关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 - 名称busybox2 -p 8010:8090 busybox“某些命令2” – ericg

我仍在使用旧版链接,但我是一个有点熟悉。我认为问题在于你试图从网关容器中打“localhost”。内部API容器不能在网关API容器内解析为“localhost”。由于端口映射,您可以从主机或外部命中“localhost:8099”,但您的其他容器无法解析该地址/端口,因为它们认为它是远程机器。

这是一种测试我在想什么的方法。在主机的shell中,运行显示为here的桥检查命令。从Containers复制IP地址。 <inner-api-hash>IPV4。然后用docker exec -it <gateway-id> /bin/bash在网关容器中打开一个外壳,然后使用curlwget来查看是否可以点击您复制的IP地址。

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

这开始逃离我的知识范围,但你也可以配置一个容器的DNS。 Configure container DNS

+0

当从网关api调用内部api时,我通过创建容器时给出的名称呼叫内部网关: 'curl -X GET http:// busybox2/api/resource/one' – ericg

+0

我尝试了你的建议,但是,我可以ping busybox2和分配给容器的ip。但名称+端口组合不起作用。我猜如果我有网络桥接设置,我是否必须公开busybox2容器上的端口?或者这个名字能够满足吗? – ericg

+0

文档说:“默认网络中的容器能够使用IP地址相互通信,Docker不支持在默认网桥上自动发现服务。”所以,如果没有进一步的配置,使用这个名字将不起作用。 – gregbert