我正在使用docker compose创建相当复杂的docker容器基础架构。这些容器在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
Run Code Online (Sandbox Code Playgroud)
我写了一个小脚本,删除了我想删除的规则(并允许在选定的网桥之间进行通信),并且所有内容都像魅力一样起作用,但是无论如何,它们在某种程度上都是由Docker重新创建的,即使没有重新创建这些网络,因此它需要我再次运行该脚本,这很烦人。有什么办法专门告诉Docker允许两个网桥之间的通信吗?也许在使用Docker-Compose启动容器之后,有一些技巧可以运行特定的shell脚本?
如果有人感兴趣,我已经设法用 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
Run Code Online (Sandbox Code Playgroud)
这样,我们就在 DOCKER-ISOLATION 之前在 FORWARD 链中添加新规则,它会强制 iptables 忽略这些子网之间的任何通信的整个 DOCKER-ISOLATION 链。
隔离是使用多个桥接网络的核心原因。在 Docker 世界中,您应该将想要相互通信的容器放在同一网络中。
我假设您想复制具有 4 个独立子网/第 2 层域的生产网络,这些子网/第 2 层域使用路由器相互通信以进行测试和其他目的?尝试使用实验性 ipvlan 驱动程序形成具有 4 个不同子网的ipvlan L3 网络,并使用 ipvlan 驱动程序充当它们之间的路由器。以下是设置方法(向下滚动到 ipvlan L3.
| 归档时间: |
|
| 查看次数: |
1455 次 |
| 最近记录: |