温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - docker: containers in stacks within EC2 instance do not inherit dns nameserver
docker docker-networking

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

发布于 2020-03-29 21:45:28

我已经在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

update_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

update_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

update_3:当我使用docker-compose而不是来启动堆栈时,问题同样存在docker stack deploy似乎不是swarm特定问题;

update_4:我已经明确添加了/etc/docker/daemon.json具有以下内容的gfile

{
    "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:没有答案

但查找仍然失败:

有什么建议为什么会令人沮丧吗?

查看更多

提问者
pkaramol
被浏览
17
Josh 2019-06-19 02:39

我只是遇到了类似的问题。我知道这已经11个月了,但是在此主题上查找信息有些困难,因此我将在此处发布信息。

我的问题原来是docker swarm覆盖网络的默认子网与我的vpcs子网重叠,因此在我的情况下,默认的Amazon ec2 dns服务器(10.0.0.2)混淆了docker守护程序的ip地址路由,使其认为是一群人覆盖本地服务(我认为)。无论如何,我通过通过堆栈文件network:部分更改默认的覆盖子网解决了我的问题,而我的docker守护进程又开始重新解析10.0.0.2 vpc dns服务器。

如果将节点docker守护程序放在调试模块中(在Linux上/etc/docker/daemon.json,添加"debug": true到json),则可以通过在特定系统上记录该守护程序的日志来监视调试输出。如果守护程序是通过systemd运行的,journalctl -u docker则将提供日志。-f将遵循日志。

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