我一直在尝试在容器内设置域名,并检查嵌入式 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 请求,如果您需要更传统的 DNS 行为,来测试处理网络配置等的 ansible 角色...,您最好使用 Podman V3 或尝试分流 Docker 的内部 DNS 并使用 dnsmasq 或 bind9 之类的东西。
另请查看SO上的相关主题,其中解释了:我如何让 docker 容器访问 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。