docker容器默认无dns缓存,需通过内置dnsmasq/unbound/coredns等代理实现:①挂载运行轻量服务;②构建含缓存的定制镜像;③在自定义网络中部署独立缓存容器并全局转发。

Docker 容器本身不自带 DNS 缓存服务,它默认只是转发解析请求到配置的上游 DNS 服务器(如 114.114.114.114 或 8.8.8.8),每次查询都是实时发起、无本地缓存。所以严格来说,“容器支持自定义 DNS 缓存”不是靠 Docker 原生配置实现的,而是通过在容器内运行一个带缓存能力的 DNS 代理服务(比如 dnsmasq、unbound 或 CoreDNS)来达成。
下面分三种实用路径说明怎么做:
启动容器时挂载并运行轻量 DNS 缓存服务
适合单容器调试或边缘场景,控制粒度细:
- 使用 Alpine 或 Ubuntu 镜像,安装
dnsmasq并配置为缓存代理 - 把
dnsmasq.conf挂载进容器,监听127.0.0.1:53,上游指向你信任的递归 DNS - 容器启动后,把
/etc/resolv.conf的nameserver改成127.0.0.1(可通过--dns 127.0.0.1强制指定) - 示例命令:
docker run -d --name dns-cache \ --cap-add=NET_ADMIN \ -p 127.0.0.1:53:53/udp \ -v $(pwd)/dnsmasq.conf:/etc/dnsmasq.conf \ -v /etc/localtime:/etc/localtime:ro \ --restart=always \ andyshinn/dnsmasq
然后用
docker run --dns 127.0.0.1 -it alpine nslookup google.com测试是否走缓存
构建含 DNS 缓存的定制镜像
适合稳定部署、统一运维:
- 在
Dockerfile中安装unbound或dnsmasq - 配置其监听
127.0.0.1:53,设置上游 DNS 和缓存 TTL - 启动时自动拉起服务,并确保
/etc/resolv.conf指向本机 - 可配合
ENTRYPOINT脚本动态生成 resolv.conf,避免硬编码
在自定义网络中部署独立 DNS 缓存容器 + 全局转发
推荐用于多容器协作环境(如微服务集群):
- 创建用户自定义网络:
docker network create mynet - 启动一个专用缓存容器(如
coredns或unbound),监听宿主机端口或仅网络内可达 - 启动其他业务容器时,用
--network mynet --dns显式指定 - 或修改
daemon.json全局设"dns": [""],让所有新容器默认走它
注意:Docker 内嵌 DNS(127.0.0.11)不提供缓存功能,也不对外递归,它只做服务发现(同网络容器名解析)。所以想真正实现“DNS 缓存”,必须绕过它,引入外部缓存服务。
不复杂但容易忽略











