Docker Embedded DNS は、逆 ns ルックアップを実行すると切り捨てられたドメイン名を返します。

Docker Embedded DNS は、逆 ns ルックアップを実行すると切り捨てられたドメイン名を返します。

コンテナ内にドメイン名を設定し、組み込みの Docker DNS がそれらの設定をどのように処理するかを確認しようとしています。しかし、逆 ns ルックアップを実行したときに切り捨てられたドメイン名のみが提供されることに驚きました。

fqdn を次のように設定しました。コンテナ内のldec<i>.n18.org コマンドは期待どおりに結果を返し、ping はfqdn が適切に解決されて期待どおりに機能しています。hostname --fqdnldec1.n18.orgping ldec1.n18.org

しかし、 のような逆 ns ルックアップを実行すると、ではなく のようdig -x <container_ip>な切り捨てられたドメイン名が常に返されます。ldec3.n18ldec3.n18.org

root@ldec3:/# dig -x 172.18.0.4

; <<>> DiG 9.16.37-Debian <<>> -x 172.18.0.4 
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21081
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;4.0.18.172.in-addr.arpa.       IN      PTR

;; ANSWER SECTION:
4.0.18.172.in-addr.arpa. 600    IN      PTR     ldec3.n18.

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Apr 17 18:59:38 UTC 2023
;; MSG SIZE  rcvd: 87

では、なぜ dig は切り捨てられたドメイン名を返すのでしょうか?

イメージを構築するには

docker build --tag=debian:11-lde - <<EOF
FROM debian:11

ARG DEBIAN_FRONTEND=noninteractive 

ENV APT_CMD="apt-get install -y --no-install-recommends"
# SHELL ["/bin/bash", "-x", "-c"]

RUN echo "===> Add tools..."  \
  && apt-get update  \
  && apt-get install -y --no-install-recommends \
    iputils-ping bind9-dnsutils lsof \
    openssh-*   \
    wget curl  \
    iptables whois iproute2 net-tools \
    vim less sudo bash-completion patch \
    ca-certificates \
  && apt-get autoremove -y \
  && echo OK
EOF

同じネットワーク上の3つのコンテナを起動するには

docker network create --driver=bridge n18 --subnet=172.18.0.0/24 || true

for i in $(seq 1 1 3)
do
  docker rm -f "ldec${i}" || true
  declare domain="n18.org"
  docker run --interactive --tty --detach --rm --name "ldec${i}" \
            --network=n18 --hostname="ldec${i}.${domain}" \
            --dns="8.8.8.8" \
            debian:11-lde
done

答え1

自分の質問に答えるために、Podman V3とdnsnameプラグイン、ホスト上のdnsmasqでテストしたところ、ようやく期待通りの結果が出ました。

...
;; QUESTION SECTION:
;4.0.5.192.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
4.0.5.192.in-addr.arpa. 0       IN      PTR     ldec3.newnet.podman.
...

したがって、Docker の内部 DNS は、逆 DNS 要求に応答するための非常に特殊で独断的な方法を持っているようです。ネットワーク構成などを扱う Ansible ロールをテストするために、より従来的な DNS 動作が必要な場合は、Podman V3 を使用するか、Docker の内部 DNS を迂回して dnsmasq や bind9 などを使用する方がよいでしょう。

以下の内容を説明する SO の関連スレッドも確認してください。Docker コンテナに、h 上の dnsmasq ローカル dns リゾルバへのアクセスを許可する方法

編集2:Docker の組み込み DNS

カスタム ネットワーク内のホストに対する逆 DNS クエリは「特殊」であり、Docker では組み込み DNS を無効にすることはできません (2017 年まで遡ります)。

したがって、2023 年になっても、/etc/resolv と /etc/hosts を使用した回避策、またはコードにパッチを適用して ES を無効にする方法が残されています。

関連情報