【问题标题】:Allow communication between two docker bridge networks using docker-compose允许使用 docker-compose 在两个 docker 桥接网络之间进行通信
【发布时间】:2016-06-06 12:47:46
【问题描述】:

我正在使用 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

我写了一个小脚本,删除了我想要删除的规则(并允许所选网桥之间的通信),一切都像一个魅力,但不知何故,它们在某些时候被 Docker 重新创建,即使没有重新创建这些网络,所以它需要我再次运行该脚本,这很烦人。 有没有办法专门告诉 Docker 允许两个网桥之间的通信?或者在使用 Docker-Compose 启动容器后运行特定的 shell 脚本可能有一些技巧?

【问题讨论】:

    标签: networking docker


    【解决方案1】:

    如果有人感兴趣,我已经设法用 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 链以进行这些子网之间的任何通信。

    【讨论】:

    • 不幸的是 Docker 不知何故将它的 ISOLATION 链带到了 FORWARD 链的顶部,所以这个也必须重复完成:(。我想我会用 crontab :(
    【解决方案2】:

    隔离是使用多个桥接网络的核心原因。在 Docker 世界中,您应该将想要相互通信的容器放在同一个网络中。

    我假设您想复制具有 4 个独立子网/第 2 层域的生产网络,这些域使用路由器相互通信以进行测试和其他目的?尝试使用实验性 ipvlan 驱动程序来形成具有 4 个不同子网的ipvlan L3 network,并将 ipvlan 驱动程序用作它们之间的路由器。 Here is how you set it up(向下滚动到 ipvlan L3。

    【讨论】:

    • 谢谢,我会试一试,是的 - 就像你说的那样,我想复制生产网络以进行测试,并且我希望 Docker 配置尽可能接近生产.
    • 我刚刚意识到 ipvlan 不仅需要我使用实验性 docker(或外部驱动程序),还需要将内核升级到 4.3 版本,这对我来说并不完全可能 - 托管测试和开发环境在我的公司中,仅仅因为这个原因就不能轻易升级到新内核。看来我不得不忍受不断删除 iptables 规则 :(.
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多