使用docker-compose允许两个docker桥接网络之间的通信

7
我正在使用Docker Compose创建相当复杂的容器基础设施。这些容器在4个不同的网络中运行(类似于我模仿的生产环境)。Docker Compose为我创建了这四个网络,只要容器不尝试与不同网络内的其他容器通信,一切都可以正常工作。但是当它们尝试进行通信时,连接会断开。我已经找到了连接断开的原因,那就是Docker将iptables规则添加到DOCKER-ISOLATION链中。例如:
-A DOCKER-ISOLATION -i br-be010eaddd0e -o br-f788f16ed0dd -j DROP
-A DOCKER-ISOLATION -i br-f788f16ed0dd -o br-be010eaddd0e -j DROP

我写了一个小脚本,用于删除我想要删除的规则(并允许所选桥之间的通信),一切都运行得很好,但不知何故,这些规则在某个时刻由Docker重新创建,即使没有重新创建这些网络,因此我需要再次运行该脚本,这非常令人烦恼。 有没有办法明确告诉Docker允许两个桥之间的通信?或者也许有一些技巧可以在使用Docker-Compose启动容器后运行特定的shell脚本吗?
2个回答

5

如果有人感兴趣,我已经通过iptables处理了这个问题。解决方案是明确允许桥接子网之间的通信(假设它们具有固定的IP地址)。要执行此操作,请发出以下命令(假设桥接子网为172.24.131.0/24和172.24.132.0/24):

iptables -I FORWARD -s 172.24.131.0/24 -d 172.24.132.0/24 -j ACCEPT
iptables -I FORWARD -d 172.24.131.0/24 -s 172.24.132.0/24 -j ACCEPT

这样我们就可以在 DOCKER-ISOLATION 链之前添加新规则,强制 iptables 忽略任何这些子网之间的通信,以便有效实现。


不幸的是,Docker 在某种程度上将其 ISOLATION 链带到了 FORWARD 链的顶部,因此这也必须重复执行 :(. 我想我只会使用 crontab :( - Mikz

1
孤立性是使用多个桥接网络的核心原因。在Docker世界中,您应该将希望彼此通信的容器放置在同一网络中。
我假设您想要复制生产网络,并使用路由器使4个不同子网/第2层域相互通信以进行测试和其他目的?尝试使用实验性ipvlan驱动程序形成ipvlan L3网络,其中有4个不同的子网和ipvlan驱动程序作为它们之间的路由器。 这里是如何设置它(向下滚动到ipvlan L3)。

谢谢,我会试一试,是的 - 就像你所说的那样,我想为测试目的复制生产网络,并且我希望 Docker 配置尽可能接近生产环境。 - Mikz
我刚意识到ipvlan不仅要求我使用实验性的docker(或外部驱动程序),而且还需要升级内核到4.3版本,这对我来说并不完全可能 - 托管在我的公司中的测试和开发环境不能轻易地为了这个单一原因而升级到新内核。看来我只能忍受不断删除iptables规则的痛苦了:(。 - Mikz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接