Docker 通过主机映射端口进行容器到容器的通信
我使用的是Docker版本1.9.1和Docker compose 1.5.2以及--x网络(实验网络) 我用docker compose up启动一个简单的节点应用程序;此应用程序将主机上的端口8000映射到端口9999 从主机我可以卷曲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
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文件中。