Docker容器内的DNS解析速度慢

时间:2017-01-24 06:57:24

标签: docker dns

我注意到在我的docker容器中,主机名的DNS解析速度非常慢,最长可达5秒。在docker主机上,完全相同的主机名的分辨率需要几毫秒,在托管容器中需要4到5秒。

例如:

    dig www.googleapis.com

    ; <<>> DiG 9.9.5-9+deb8u9-Debian <<>> www.googleapis.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50096
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 1480
    ;; QUESTION SECTION:
    ;www.googleapis.com.        IN  A

    ;; ANSWER SECTION:
    www.googleapis.com. 3422    IN  CNAME   googleapis.l.google.com.
    googleapis.l.google.com. 176    IN  A   172.217.16.202
    googleapis.l.google.com. 176    IN  A   172.217.21.202
    googleapis.l.google.com. 176    IN  A   172.217.21.234
    googleapis.l.google.com. 176    IN  A   216.58.214.74
    googleapis.l.google.com. 176    IN  A   172.217.16.170
    googleapis.l.google.com. 176    IN  A   216.58.208.42
    googleapis.l.google.com. 176    IN  A   172.217.22.42
    googleapis.l.google.com. 176    IN  A   172.217.22.74
    googleapis.l.google.com. 176    IN  A   172.217.22.106
    googleapis.l.google.com. 176    IN  A   216.58.206.10
    googleapis.l.google.com. 176    IN  A   172.217.23.170
    googleapis.l.google.com. 176    IN  A   216.58.205.234
    googleapis.l.google.com. 176    IN  A   216.58.210.10

   ;; Query time: 4003 msec
   ;; SERVER: 127.0.0.11#53(127.0.0.11)
   ;; WHEN: Tue Jan 24 06:55:37 UTC 2017
   ;; MSG SIZE  rcvd: 289

请注意查询时间约为4秒。

我的容器的resolv.conf看起来像

    nameserver 127.0.0.11
    options ndots:0

其中127.0.0.11似乎是内部docker dns服务。

我用DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"启动docker-engine,主机运行Ubuntu 16.04 LTS。

有没有办法调试慢速DNS解析或任何已知的解决方法?

2 个答案:

答案 0 :(得分:2)

我遇到了类似的问题。然后我发现了以下问题。 https://github.com/moby/moby/issues/11407

我注意到您已在https://github.com/moby/moby/issues/31960

中发布此问题

懒惰临时解决方法

在我的场景中,这两个解决方法就足够了:

  1. --net "host"命令
  2. 中添加docker run作为参数
  3. 添加--dns "127.0.0.11"
  4. 第一个不安全,它也搞乱了映射端口。但它确实有效。

    第二种是使用dns。 127.0.0.11适用于我的桌面。但在其他服务器上失败了。您可以指定在中国受欢迎的DNS服务器,例如在深圳,202.96.134.133可以正常工作。

    这是因为容器中的DNS 8.8.8.88.8.4.4在中国大陆有着令人难以忍受的延迟。

    您可以使用

    进行实验
    ```bash
    time docker run busybox ping -c 1 www.google.com
    
    time docker run --net "host" busybox ping -c 1 www.google.com
    time docker run --dns "127.0.0.11" busybox ping -c 1 www.google.com
    time docker run --dns "202.96.134.133" busybox ping -c 1 www.google.com
    ```
    

    有趣的事实:在aliyun中,8.8.8.88.8.4.4已经加速了。

    另一种解决方案涉及桥接配置

    https://gist.github.com/etuttle/bc1cd3814b984ec694d6#file-gistfile1-sh-L18-L43

答案 1 :(得分:0)

另一种可能的解决方案是使用一些DNS创建/更新文件/etc/docker/daemon.json

{
  "dns": ["8.8.8.8", "1.1.1.1"]
}

然后重新启动docker daemon:

sudo systemctl restart docker