
コンテナ内にドメイン名を設定し、組み込みの Docker DNS がそれらの設定をどのように処理するかを確認しようとしています。しかし、逆 ns ルックアップを実行したときに切り捨てられたドメイン名のみが提供されることに驚きました。
fqdn を次のように設定しました。コンテナ内のldec<i>.n18.org
コマンドは期待どおりに結果を返し、ping はfqdn が適切に解決されて期待どおりに機能しています。hostname --fqdn
ldec1.n18.org
ping ldec1.n18.org
しかし、 のような逆 ns ルックアップを実行すると、ではなく のようdig -x <container_ip>
な切り捨てられたドメイン名が常に返されます。ldec3.n18
ldec3.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 年まで遡ります)。
- https://github.com/moby/moby/issues/26298#issuecomment-339126461
- https://github.com/moby/moby/issues/19474#issuecomment-335253478
したがって、2023 年になっても、/etc/resolv と /etc/hosts を使用した回避策、またはコードにパッチを適用して ES を無効にする方法が残されています。