在RedHat 7.5上运行Docker 18.03,我遇到一个问题,从主机到容器的DNS解析需要15到20秒。所有其他DNS查询(包括容器内部)都可以。
我们的设置是一个在容器内运行的Apache Ignite集群,在主机上,我们运行一个连接到该集群的Java应用程序。在初始化期间,我们看到将应用程序连接到Ignite之前大约有一分钟的延迟。几个jstack和对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网络设置或点燃配置有些愚蠢,因为主机上的所有其他应用都能正常工作。