web-dev-qa-db-ja.com

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秒後ではなく即座に失敗するように指示する方法はありますか?

あるいは、リクエストごとにNXDOMAINを返す、実行できるダミーのDNSサーバーソフトウェアを知っている人はいますか?

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
1
Jacob Evans