java - 主机上的 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 配置有点傻,因为主机上的所有其他应用程序都可以正常工作。
解决方案
推荐阅读
- node.js - 猫鼬填充自定义对象数组
- javascript - macOS 应用程序中的 WKWebView Web 检查器无法呈现和闪烁/闪烁
- java - Springboot+Hibernate 如何修复“传递给持久化的分离实体”
- java - 使用 currentTimeMillis() 比较 concat 和 append
- java - 数组[i] = scnr.nextInt(); 在线程“主”java.util.NoSuchElementException 中导致异常
- git - 如何恢复正常工作的 git 存储库?
- jspdf - 使用 jspdf autotable 绘制无标题表
- c# - 帮助解决 ASP.NET Core 3.1 应用程序中的“已经有一个打开的 DataReader 与此命令关联,必须先关闭”
- mysql - 使用 Svelte 连接数据库
- for-loop - Ocaml中for循环内的模式匹配