bigywater.tech
Docker · 59

容器里的 /etc/resolv.conf:DNS 配置从哪里来

容器里的 /etc/resolv.conf 从哪来?改了它能保存吗?--network host、--network none、--dns 各会生成什么?这篇读 mountinfo 和 docker inspect,逐项实测。

每次启动重新生成
在容器里追加的 nameserver 在 docker restart 和 stop 后再 start 之后都不见了
192.168.65.7
默认来源:虚拟机自己的 /etc/resolv.conf
单文件 bind mount
resolv.conf 来自虚拟机里的 /var/lib/docker/containers/<容器ID>/

文件从哪来

实测 · 本机执行输出
  mountinfo 里的 resolv.conf:/docker/containers/<容器ID>/resolv.conf /etc/resolv.conf /dev/vda1 rw,discard
  docker inspect 的 ResolvConfPath:/var/lib/docker/containers/<容器ID>/resolv.conf
  虚拟机里那个文件的内容:nameserver <本机局域网IP>
  虚拟机自己的 /etc/resolv.conf:nameserver <本机局域网IP>
  容器里的 /etc/resolv.conf:nameserver <本机局域网IP>

容器的 /etc/resolv.conf 是 bind mount 的单个文件,docker inspect 的 ResolvConfPath 指出了它在虚拟机里的位置。默认复制虚拟机自己的 resolv.conf。

改了会怎样

实测 · 本机执行输出
  追加 nameserver 9.9.9.9 后:nameserver <本机局域网IP> ; nameserver 9.9.9.9
  虚拟机里对应文件也变了吗?是
  docker restart 之后:nameserver <本机局域网IP>
  docker stop 再 start 之后:nameserver <本机局域网IP>

容器里改它是可写的,改动同步到虚拟机里的那个文件,但容器 restart(或 stop 后 start)时 docker 会重新生成,改动丢失。所以别在容器里手改,用 --dns 等参数。至于容器运行期间虚拟机自己的 resolv.conf 变了会不会同步给容器,我没有测。

各种选项

实测 · 本机执行输出
  --network host:nameserver <本机局域网IP>
  --network none:nameserver <本机局域网IP>
  --dns 9.9.9.9 --dns-search corp.test --dns-opt timeout:1:nameserver 9.9.9.9 ; search corp.test ; options timeout:1
  默认 bridge + --dns 9.9.9.9 --dns 1.1.1.1:nameserver 9.9.9.9 ; nameserver 1.1.1.1

--dns、--dns-search、--dns-opt 逐项写入;多个 --dns 就是多行 nameserver。自定义网络里的 127.0.0.11 见 c48。

守护进程

实测 · 本机执行输出
  daemon.json 里有 dns 相关配置吗?没有 dns 配置

daemon.json 里没有 dns 字段(我是读虚拟机里的 /run/config/docker/daemon.json 确认的),所以默认来源就是虚拟机自己。在 Docker Desktop 里这个配置由 Docker Desktop 管理,我不修改。

分步演示

resolv.conf 的生成
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。容器里的内容用 grep 去掉注释和空行后列出;虚拟机侧文件用特权容器加 nsenter 只读读取(方法见 c19);容器 ID 在输出中已替换为 <容器ID>;每种情形运行一次;实验后已删除容器
    • 没有验证:虚拟机的 resolv.conf 在容器运行期间变化后是否同步、容器内 systemd-resolved 的情形、Linux 宿主机上回环地址的 nameserver 被过滤的行为、daemon.json 里加 dns 的效果(不修改配置)、--dns 对 IPv6 的支持
    京ICP备2026067502号-1京公网安备11010502063487号