如何阻止 Docker 尝试解析外部 DNS 名称?

如何阻止 Docker 尝试解析外部 DNS 名称?

我正在设置一个没有互联网访问的 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

相关内容