Docker 群容器无法访问互联网

Docker swarm containers not able to access internet

我正在尝试在 AWS 中设置 swarm 集群,但是主机中的容器无法访问互联网。用于地址解析或通过 IP 直接连接的 ping 命令在容器内部不起作用。

在创建此工单之前,我查看了 this 问题,但我认为在我的案例中没有 CIDR 重叠。

我有以下配置:

Public Subnet CIDR : 10.2.1.0/24
Namespace server inside this is :10.2.0.2

Ingress overlay network --> 10.255.0.0/16

docker_gwbridge --> 172.18.0.0/1

我也曾尝试创建新的叠加层 (192.168.1.0/24) 和 docker_gwbridge(10.11.0.0/16) 网络,但没有成功。

我正在使用这些选项创建服务(删除 mount 和 env 参数):

docker service create --publish 8098:8098 <Imagename>

请注意,当我自己创建覆盖网络时,我在创建命令中也添加了选项 --network my-overlay

关于我可能 missing/doing 错误的任何指示?

编辑 1 添加更多信息

下面是当我没有创建新的覆盖网络并使用默认覆盖网络时对容器的检查:

"NetworkSettings": {
        "Bridge": "",
        "SandboxID": "eb***",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": {
            "5005/tcp": null,
            "8080/tcp": null
        },
        "SandboxKey": "/var/run/docker/netns/e***9",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": {
            "ingress": {
                "IPAMConfig": {
                    "IPv4Address": "10.255.0.4"
                },
                "Links": null,
                "Aliases": [
                    "30**"
                ],
                "NetworkID": "g7w**",
                "EndpointID": "291***",
                "Gateway": "",
                "IPAddress": "10.255.0.4",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:4***"
            }

下面是我创建覆盖网络时的照片:

"Networks": {
            "ingress": {
                "IPAMConfig": {
                    "IPv4Address": "10.255.0.4"
                },
                "Links": null,
                "Aliases": [
                    "42***"
                ],
                "NetworkID": "jl***3",
                "EndpointID": "792***86c",
                "Gateway": "",
                "IPAddress": "10.255.0.4",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:4***"
            },
            "my-overlay": {
                "IPAMConfig": {
                    "IPv4Address": "192.168.1.3"
                },
                "Links": null,
                "Aliases": [
                    "42**"
                ],
                "NetworkID": "4q***",
                "EndpointID": "4c***503",
                "Gateway": "",
                "IPAddress": "192.168.1.3",
                "IPPrefixLen": 24,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "MacAddress": "02:4***"
            }

我正在回答我的问题,因为我发现这种行为的原因是我为 docker 安装定制的厨师食谱。我在 docker 配置中设置了 iptables=false,因此它不适用于主机网络模式以外的任何 docker 容器。

我从 Bret(Docker 社区中的冠军)那里得到了以下建议,这帮助我找到了问题的根源。简而言之,这是我做错了什么的问题,但是如果您以后想解决此类问题,请在下面发布建议。

嘿马尼什,

建议:先让单个容器在没有 swarm 或 overlay 的情况下正常工作。

所以你应该能够 docker 运行 --rm nginx:alpine ping 8.8.8.8 并得到响应。

验证该主机上的容器是否可以访问互联网。

然后尝试 docker 运行 --rm nginx:alpine ping google.com 并得到响应。

验证 DNS 解析是否正常。

*然后您可以尝试在单个节点群中的一个节点上创建单个覆盖网络:*

*docker 集群初始化 *

*docker 网络创建 --driver overlay --attachable mynet *

*docker 运行 --rm --network mynet nginx:alpine ping google.com *

验证他们在覆盖网络上有互联网和 DNS。

如果您随后添加多个节点并遇到问题,那么您可能需要确保所有 swarm 节点都可以通过 swarm 端口进行通信,您可以在其中找到 link 到防火墙端口列​​表Creating a 3-Node Swarm Cluster 资源下的 Swarm 部分。

正如 Manish 所说,首先尝试 ping public 没有覆盖网络的网络:

docker run --rm nginx:alpine ping 8.8.8.8

如果不起作用,则说明您的防火墙或其他问题。 在我的例子中,iptables 防火墙限制了 DOCKER-USER 链来访问 public 网络。 所以我已经刷新了所有 docker 规则:

sudo iptables -F DOCKER-USER

然后重新初始化:

sudo iptables -I DOCKER-USER -i eth0 -s 0.0.0.0/0 -j ACCEPT