rootless Docker 20.10.12容器无法解析主机别名问题如何修复
问题现象
- Root模式部署的Docker CE 20.10.12:配置主机别名
acme后启动容器,容器内执行nslookup acme可正常返回解析结果,正确输出acme.example.com及对应IP - Rootless模式部署的同版本Docker CE 20.10.12:相同配置下启动容器,容器内执行
nslookup acme返回server can't find...错误,解析失败
根因
这是Rootless Docker默认隔离机制带来的行为差异,不是配置bug:
Root模式下Docker daemon以系统root权限运行,可直接读取宿主机/etc/hosts中的全局自定义主机别名,自动同步到容器内置DNS(127.0.0.11)的解析记录中。20.10版本的Rootless Docker运行在独立用户命名空间内,默认没有权限读取宿主机全局/etc/hosts的自定义条目,也不会自动将宿主机配置的主机别名注入容器DNS解析链路,因此触发解析失败。
修复方案
方案1:单容器启动时显式注入主机映射(优先推荐,无侵入)
启动容器时加--add-host参数,直接把acme和对应IP的映射写入容器解析规则,效果和Root模式完全一致,示例命令:
docker run -it --add-host acme:<acme对应的实际IP> 业务镜像名
如果用Docker Compose编排,在对应服务下加extra_hosts配置即可:
services: your-app: image: your-app-image extra_hosts: - "acme:<acme对应的实际IP>"
配置后启动容器,直接执行nslookup acme就能拿到正确解析结果。
方案2:修改全局配置,所有容器默认透传宿主机别名
如果不想每个容器都加参数,要让所有容器默认都能识别宿主机配置的主机别名,按以下步骤操作:
- 停掉正在运行的Rootless Docker服务:
systemctl --user stop docker - 编辑(不存在就新建)Rootless Docker网络配置文件
~/.config/docker/rootless.conf,追加配置开启宿主机解析透传:DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="--host-resolver" - 编辑(不存在就新建)daemon配置文件
~/.config/docker/daemon.json,指定内置DNS和上游DNS地址:{ "dns": ["127.0.0.11", "宿主机使用的上游DNS,比如公共DNS 114.114.114.114"] } - 重启Rootless Docker服务加载配置:
systemctl --user start docker
操作完成后新启动的容器不需要加额外参数,就能正常解析宿主机配置的acme等主机别名。
验证
启动测试容器后在容器内执行nslookup acme,返回对应域名和IP即修复生效。
内容的提问来源于stack exchange,提问作者Hare Krshn
相关产品推荐
相关产品推荐

