You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:修改全局配置,所有容器默认透传宿主机别名

如果不想每个容器都加参数,要让所有容器默认都能识别宿主机配置的主机别名,按以下步骤操作:

  1. 停掉正在运行的Rootless Docker服务:
    systemctl --user stop docker
    
  2. 编辑(不存在就新建)Rootless Docker网络配置文件~/.config/docker/rootless.conf,追加配置开启宿主机解析透传:
    DOCKERD_ROOTLESS_ROOTLESSKIT_FLAGS="--host-resolver"
    
  3. 编辑(不存在就新建)daemon配置文件~/.config/docker/daemon.json,指定内置DNS和上游DNS地址:
    {
      "dns": ["127.0.0.11", "宿主机使用的上游DNS,比如公共DNS 114.114.114.114"]
    }
    
  4. 重启Rootless Docker服务加载配置:
    systemctl --user start docker
    

操作完成后新启动的容器不需要加额外参数,就能正常解析宿主机配置的acme等主机别名。

验证

启动测试容器后在容器内执行nslookup acme,返回对应域名和IP即修复生效。

内容的提问来源于stack exchange,提问作者Hare Krshn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:54:18