swarm scope的Docker网桥网络不接受子网和驱动程序选项

swarm scope的Docker网桥网络不接受子网和驱动程序选项,docker,docker-swarm,iptables,docker-networking,Docker,Docker Swarm,Iptables,Docker Networking,我想控制哪个外部IP用于从我的swarm容器发送流量,这可以很容易地与桥接网络和iptables规则一起使用 这适用于本地范围的网桥网络: docker network create --driver=bridge --scope=local --subnet=172.123.0.0/16 -o "com.docker.network.bridge.enable_ip_masquerade"="false" -o "com.docker.netw

我想控制哪个外部IP用于从我的swarm容器发送流量,这可以很容易地与
桥接网络
iptables
规则一起使用

这适用于本地范围的网桥网络:

docker network create --driver=bridge --scope=local --subnet=172.123.0.0/16 -o "com.docker.network.bridge.enable_ip_masquerade"="false" -o "com.docker.network.bridge.name"="my_local_bridge" my_local_bridge
iptables
上:

sudo iptables -t nat -A POSTROUTING -s 172.123.0.0/16 ! -o my_local_bridge -j SNAT --to-source <my_external_ip>
但如果我尝试将swarm容器连接到此网络,则会出现以下错误:

网络“my_local_bridge”声明为外部,但它不在正确的范围内:“local”而不是“swarm”

好的,太好了,让我们切换范围到swarm,对吗?错了,错了

创建网络:

docker network create --driver=bridge --scope=swarm --subnet=172.123.0.0/16 -o "com.docker.network.bridge.enable_ip_masquerade"="false" -o "com.docker.network.bridge.name"="my_swarm_bridge" my_swarm_bridge
现在让我们检查一下docker网络检查我的swarm桥:

[
    {
        "Name": "my_local_bridge",
        "Id": "...",
        "Created": "...",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.123.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            ...
        },
        "Options": {
            "com.docker.network.bridge.enable_ip_masquerade": "false",
            "com.docker.network.bridge.name": "my_local_bridge"
        },
        "Labels": {}
    }
]
[
    {
        "Name": "my_swarm_bridge",
        "Id": "...",
        "Created": "...",
        "Scope": "swarm",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            ...
        },
        "Options": {},
        "Labels": {}
    }
]
我现在可以很好地将其连接到swarm容器,但是没有设置
选项
,也没有定义
子网

如何为“群集”范围的网桥网络设置这些选项?或者,如果无法将
com.docker.network.bridge.enable\u IP\u masquerade
设置为false,如何将iptables设置为使用已定义的外部IP

我是否需要制作脚本来检查分配的子网并手动删除iptables
MASQUERADE
规则


谢谢大家

我很确定你不能在swarm中使用桥接驱动程序,你应该使用overlay驱动程序。 来自Docker文档:

网桥网络适用于在同一Docker守护程序主机上运行的容器。对于在不同Docker守护程序主机上运行的容器之间的通信,您可以在操作系统级别管理路由,也可以使用覆盖网络


我可能不理解您的特定用例…

您可以在群中使用“本地”网络,请检查:实现:很高兴知道,谢谢!您是否尝试过将conf放在ConfigOnly网络中,然后使用config from?看起来可能合适。