首页 > 解决方案 > 主机上的 Docker DNS 解析速度很慢

问题描述

在 RedHat 7.5 上运行 Docker 18.03,我遇到了从主机到容器的 DNS 解析需要 15-20 秒的问题。所有其他 DNS 查询(包括内部容器)都很好。

我们的设置是一个在容器内运行的 Apache Ignite 集群,在主机上我们运行一个连接到集群的 Java 应用程序。在初始化期间,我们看到应用程序连接到 Ignite 之前大约有一分钟的延迟。几个 jstacks 和对 Ignite 代码的调查表明,当它首次连接到 Ignite 集群时,它正在为一堆 IP 进行 IP -> 主机名解析。

我编写了一个快速测试来模拟主机应用程序在尝试连接到 Ignite 集群时所做的事情:

https://gist.github.com/michael-pratt/a27b10c81b35ada3a4619eb48cad9ae5

该应用程序调用InetAddress.getHostName()所有网络接口的所有非链接本地地址。输出显示所有容器 IP 需要很长时间,而其他 IP 以毫秒为单位解析:

Tue Jul 03 16:27:46 GMT 2018 Resolving hostname for /172.19.0.1
Tue Jul 03 16:28:06 GMT 2018   ---> 172.19.0.1
Tue Jul 03 16:28:06 GMT 2018 Resolving hostname for /172.18.0.1
Tue Jul 03 16:28:25 GMT 2018   ---> 172.18.0.1
Tue Jul 03 16:28:25 GMT 2018 Resolving hostname for /172.19.1.1
Tue Jul 03 16:28:44 GMT 2018   ---> 172.19.1.1
Tue Jul 03 16:28:44 GMT 2018 Resolving hostname for /172.17.0.1
Tue Jul 03 16:29:03 GMT 2018   ---> 172.17.0.1
Tue Jul 03 16:29:26 GMT 2018 Resolving hostname for /0:0:0:0:0:0:0:1%lo
Tue Jul 03 16:29:26 GMT 2018   ---> localhost
Tue Jul 03 16:29:26 GMT 2018 Resolving hostname for /127.0.0.1
Tue Jul 03 16:29:26 GMT 2018   ---> localhost

我们正在运行 2 个 docker 网络(除了创建的标准 docker 网络),都以桥接模式和略有不同的子网:

    "Name": "cache_network",
    "Id": "222e5e722432993bd21fb767e76ee01d8d5b7c135dd6150c4801ee46df396ae3",
    "Created": "2018-06-04T08:31:09.52399079-06:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "172.19.1.0/25",
                "Gateway": "172.19.1.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,

    "Name": "app_network",
    "Id": "f1f304db94ace6495e6db8b8c9e79b8fc5638c40461f3677572b9728d1fea1bc",
    "Created": "2018-06-04T08:31:09.35800211-06:00",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "172.19.0.0/25",
                "Gateway": "172.19.0.1"
            }
        ]
    },
    "Internal": false,
    "Attachable": true,
    "Ingress": false,

值得注意的是,使用 Docker 在本地以及在我们的 Kubernetes 环境中都会出现此问题。我希望我们的 docker 网络设置或 ignite 配置有点傻,因为主机上的所有其他应用程序都可以正常工作。

标签: javadockerdnsignite

解决方案


推荐阅读