我正在设置一个没有互联网访问的 Docker 容器,而且速度很慢。
容器似乎尝试进行注定会失败并且只会缓慢超时的 DNS 查找。
sudo docker network create --internal test-internal
time sudo docker run --rm --net test-internal -ti alpine ping -c 1 127.0.0.1
# ...
real 0m0.947s
time sudo docker run --rm --net test-internal -ti alpine ping -c 1 google.com
ping: bad address 'google.com'
#...
real 0m5.955s
使用主机名运行 ping 几乎需要多花 5 秒的时间。实际上,DNS 解析超时通常配置为 5 秒。
我尝试将 DNS 服务器设置为不可路由的 IP 地址:
time sudo docker run --rm --net test-internal --dns 240.0.0.1 -ti alpine ping -c 1 google.com
我的理论是 DNS 请求很快就会失败,但事实并非如此。运行仍然需要同样长的时间。
这里的背景是,我正在运行一些集成测试,以验证互联网中断时的稳健性。我希望外部 DNS 查找快速失败,但内部查找(同一网络中的其他 Docker 容器)仍应有效。
有没有办法告诉 Docker 嵌入式 DNS 永远不要尝试外部解析,或者至少立即失败而不是 5 秒后失败?
或者,是否有人知道我可以运行的虚拟 DNS 服务器软件,该软件会返回NXDOMAIN
每个请求?
答案1
回答你的替代问题,听起来很简单。
为 创建一个区域并仅添加 NS 记录
https://hub.docker.com/r/jacobdevans/nxdomain
options {
directory "/var/bind";
listen-on { any; };
listen-on-v6 { any; };
allow-query {
any;
};
allow-transfer {
none;
};
pid-file "/var/run/named/named.pid";
allow-recursion { none; };
recursion no;
};
zone "." IN {
type master;
file "/etc/bind/nxdomain.db";
};
和 nxdomain.db
$ORIGIN .
@ 86400 SOA nxdomain. ( nxdomain 0 86400 600 604800 86400 )
@ NS nxdomain.
nxdomain IN A 127.0.0.1