gpt4 book ai didi

docker:EC2 实例中堆栈中的容器不继承 dns 名称服务器

转载 作者:行者123 更新时间:2023-12-01 12:11:31 25 4
gpt4 key购买 nike

我已经在 AWS 上设置了一个 EC2 实例。

已正确设置我的安全组,以便实例能够访问 Internet,例如

ubuntu@ip-10-17-0-78:/data$ ping www.google.com
PING www.google.com (216.58.211.164) 56(84) bytes of data.
64 bytes from dub08s01-in-f4.1e100.net (216.58.211.164): icmp_seq=1 ttl=46 time=1.02 ms
64 bytes from dub08s01-in-f4.1e100.net (216.58.211.164): icmp_seq=2 ttl=46 time=1.00 ms

但是,当我执行到容器中时,这是不可能的:
root@d1ca5ce50d3b:/app# ping www.google.com
ping: www.google.com: Temporary failure in name resolution

更新_1 :连接问题与使用 docker stack deploy 启动的容器有关。 ,在特定的堆栈中;

当我刚刚启动一个独立容器时,就可以连接到 Internet:
ubuntu@ip-10-17-0-78:/data$ docker run -it alpine:latest /bin/ash
/ # ping www.google.gr
PING www.google.gr (209.85.203.94): 56 data bytes
64 bytes from 209.85.203.94: seq=0 ttl=38 time=1.148 ms
64 bytes from 209.85.203.94: seq=1 ttl=38 time=1.071 ms

更新_2 : 经过一番调查,事实证明:
  • 独立容器, 继承 EC2 实例的 dns-nameserver;
  • 容器通过 docker stack deploy 启动做不是 ;

  • 即这是来自 docker swarm - 启动容器:
    ubuntu@ip-10-17-0-78:~$ docker exec -it d1ca5ce50d3b bash
    root@d1ca5ce50d3b:/app# cat /etc/resolv.conf
    search eu-west-1.compute.internal
    nameserver 127.0.0.11
    options ndots:0

    更新_3 : 当我用 docker-compose 启动堆栈时,问题也是一样的。而不是 docker stack deploy ;似乎不是 swarm - 具体问题;

    更新_4 : 我已经明确添加了 gfile /etc/docker/daemon.json内容如下:
    {
    "dns": ["10.0.0.2", "8.8.8.8"]
    }

    ubuntu@ip-10-17-0-78:/data$ docker run busybox nslookup google.com
    服务器:8.8.8.8
    地址:8.8.8.8:53

    非权威答案:
    名称:google.com
    地址:216.58.211.174

    *** 找不到 google.com:没有答案

    但查找仍然失败:

    有什么建议为什么会发生这种情况?

    最佳答案

    我刚刚遇到了类似的问题。我意识到这已经 11 个月大了,但是很难找到关于这个主题的信息,所以我会在这里发布信息。

    我的问题原来是 docker swarm 覆盖网络的默认子网与我的 vpcs 子网重叠,所以在我的情况下,默认的 amazon ec2 dns 服务器(10.0.0.2)混淆了 docker 守护进程的 ip 地址路由认为它是一个群体覆盖本地服务(我认为)。无论如何,我通过我的堆栈文件网络更改默认覆盖子网解决了我的问题:部分和我的 docker 守护程序再次开始解析 10.0.0.2 vpc dns 服务器。

    如果您将节点 docker daemon 放在调试模块中(在 linux /etc/docker/daemon.json 上,将 "debug": true 添加到 json),您可以通过跟踪特定系统上的守护进程日志来监控调试输出。如果守护进程通过 systemd 运行,journalctl -u docker会给你日志。 -f将遵循日志。

    在那里我找到了有关连接问题的信息(docker daemon 无法与 10.0.0.2:54 上的 dns 服务器取得联系——udp dns 端口)。但是,nslookup 在主机操作系统 /etc/resolve.conf 上运行良好。看起来很合适。如果您使用 docker exec 获取交互式 /bin/sh,问题就很明显了。在其中一个正在运行的服务中。 nslookup 对任何外部域都失败,并且 docker 守护进程调试日志吐出更多关于 10.0.0.2 的“连接被拒绝”类型的消息。在查看了 docker 对 dns 解析的支持问题一两个小时后,我发现一条评论指出 docker swarm 虚拟网络是根据一些默认值分配地址的,有时这些默认值与您设置本地子网的方式重叠.我推断如果它们与我的 vpc 上的 dns 服务器重叠,它可能会尝试在群内路由 dns 数据包,而不是解析到 vpc 子网路由。

    关于docker:EC2 实例中堆栈中的容器不继承 dns 名称服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51404544/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com