Docker 通过主机映射端口进行容器到容器的通信

Docker 通过主机映射端口进行容器到容器的通信,docker,Docker,我使用的是Docker版本1.9.1和Docker compose 1.5.2以及--x网络(实验网络) 我用docker compose up启动一个简单的节点应用程序;此应用程序将主机上的端口8000映射到端口9999 从主机我可以卷曲http://localhost:9999;或http://[主机ip]:9999;或者主机拥有的172.x.0.1地址中的任何一个,它们都可以工作 我使用docker compose up启动另一个应用程序。如果我试图卷曲http://[host ip]:9

我使用的是Docker版本1.9.1和Docker compose 1.5.2以及--x网络(实验网络)

我用docker compose up启动一个简单的节点应用程序;此应用程序将主机上的端口8000映射到端口9999

从主机我可以卷曲
http://localhost:9999
;或
http://[主机ip]:9999
;或者主机拥有的172.x.0.1地址中的任何一个,它们都可以工作

我使用
docker compose up
启动另一个应用程序。如果我试图卷曲
http://[host ip]:9999
,或任何
http://172.x.0.1
地址由于iptables条目而丢弃数据包——特别是指定从该容器的子网到第一个容器的丢弃的条目

我知道可能不允许容器间通信,但我的第二个容器如何通过主机上映射的端口与第一个容器通信

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  172.17.0.0/16        172.19.0.0/16
DROP       all  --  172.19.0.0/16        172.17.0.0/16
DROP       all  --  172.18.0.0/16        172.19.0.0/16
DROP       all  --  172.19.0.0/16        172.18.0.0/16
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DROP       all  --  172.17.0.0/16        172.18.0.0/16
DROP       all  --  172.18.0.0/16        172.17.0.0/16
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (3 references)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             172.18.0.2           tcp dpt:8000

当然,允许集装箱之间的通信。你可以用防火墙规则等来禁止它。。。 实际上,您需要将这两个容器放在同一个子网中。因此,您需要使用创建子网

docker网络创建——子网=172.18.0.0/16 mySubNet

然后使用

docker运行--net mynet123

就这样。此外,在运行时,您可以使用
--ip
将静态ip分配给容器,使用
--hostname
分配主机名,或者使用
--add host
添加另一个主机条目

编辑:我现在看到了您的docker版本,所以我必须说,我在这里写的内容适用于docker 1.10.x

子网解决方案 您可以为容器创建一个子网,但为了保持干净,您需要为每个分布式应用程序创建一个子网,以便将它们隔离。这不是最简单的方法,也不是最简单的方法

--链接
解决方案
另一个解决方案是链接容器。我建议你阅读,这样我就不会复制/粘贴它的内容;)

简而言之,我正在尝试在同一台主机上运行两个docker compose应用程序,并通过映射的主机端口从一个应用程序到另一个应用程序进行通信。但iptables规则不允许这样做。这很奇怪,我没有相同的iptables规则,而且我不记得两个容器何时不能相互访问。这可能与我正在使用的Docker版本中的实验性网络状态有关——或者当它启动网络模式时似乎是“无”这一事实有关?我已经放弃使用单独的docker compose命令启动两个应用程序,而是通过-f命令行参数将它们合并到一个单独的compose文件中。