【问题标题】:Docker swarm containers not able to access internetDocker swarm 容器无法访问互联网
【发布时间】:2017-09-04 16:31:55
【问题描述】:

我正在尝试在 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

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

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

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

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

关于我可能遗漏/做错了什么的任何指示?

编辑 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***"
            }

【问题讨论】:

  • 你能从节点curl ipinfo.io吗?还有你在安全组中打开了哪些端口?
  • @TarunLalwani curl ipinfo.io 也无法在容器内部工作...我能够从 EC2 主机执行这些命令,但不能在容器内部执行这些命令。同样正常的 ping www.google.com 或 @987654329 @ 命令在 EC2 主机上运行,​​但不是在容器内部运行。

标签: amazon-web-services docker docker-swarm


【解决方案1】:

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

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

嘿,曼尼什,

建议:在尝试之前让单个容器正常工作,而不会出现 swarm 或覆盖。

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

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

然后尝试 docker run --rm nginx:alpine ping google.com 并获得响应。

验证 DNS 解析是否正常。

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

*docker swarm 初始化 *

*docker network create --driver overlay --attachable mynet *

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

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

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

【讨论】:

  • 那位帮我找到了问题
【解决方案2】:

正如Manish所说,首先尝试在没有覆盖网络的情况下ping公共网络:

docker run --rm nginx:alpine ping 8.8.8.8

如果它不起作用,那么你有防火墙或其他问题。 就我而言,iptables 防火墙限制 DOCKER-USER 链访问公共网络。 所以我已经刷新了所有 docker 规则:

sudo iptables -F DOCKER-USER

然后重新初始化:

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

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 2020-10-18
    • 2018-05-01
    • 2014-07-11
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多