我正在使用docker compose创建相当复杂的docker容器基础结构。这些容器在4个不同的网络中运行(类似于我模仿的生产环境)。 Docker Compose为我创建了这四个网络,并且一切都运行得很长,因为容器不会尝试与不同网络中的其他容器通信。当他们这样做时,连接被丢弃。 我能够找出它被删除的原因,这是因为Docker将iptables规则添加到DOCKER-ISOLATION链中。 例如:
${jetty.base}/resources/
我编写了一个小脚本,删除了我想删除的规则(并允许在选定的桥之间进行通信),一切都像魅力一样,但不知何故,它们在某些时候由Docker重新创建,即使没有重新创建这些网络,所以它要求我再次运行该脚本,这非常烦人。 有没有办法专门告诉Docker允许两个桥之间的通信?或者也许在使用Docker-Compose启动容器后运行特定的shell脚本有一些技巧?
答案 0 :(得分:3)
如果有人感兴趣,我已设法用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之前在FORWARD链中添加新规则,它强制iptables忽略整个DOCKER-ISOLATION链以进行这些子网之间的任何通信。
答案 1 :(得分:1)
隔离是使用多个网桥的核心原因。在Docker世界中,您应该将您希望在同一网络中相互通信的容器放在一起。
我假设您希望使用4个独立的子网/第2层域复制生产网络,这些域使用路由器相互通信以进行测试和其他目的?尝试使用实验性的ipvlan驱动程序来构建具有4个不同子网的ipvlan L3 network,并将ipvlan驱动程序用作它们之间的路由器。 Here is how you set it up(向下滚动至ipvlan L3。