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

Manjaro系统Docker容器无法通过/etc/hosts解析主机IP问题

问题原因与解决方案

行为差异原因

Ubuntu与Manjaro上Docker容器DNS解析的差异,核心是系统默认DNS服务与Docker适配逻辑的不同:

  • Ubuntu默认启用systemd-resolved服务,Docker会自动将容器的DNS配置指向主机的systemd-resolved stub resolver(127.0.0.53)。这个stub resolver会优先读取主机/etc/hosts中的自定义条目,再查询公共DNS服务器,因此容器能正常解析my-domain.com。
  • Manjaro默认可能使用NetworkManager自带的DNS解析模块,或未启用systemd-resolved。此时Docker默认配置会直接使用公共DNS服务器(如8.8.8.8),这些公共DNS无法获取主机/etc/hosts的自定义条目,导致容器解析失败。

无需修改Docker栈的解决方案

通过调整Manjaro的系统DNS服务与Docker全局配置,实现和Ubuntu一致的效果:

1. 启用并配置systemd-resolved

  • 启动并设置开机自启systemd-resolved:
    sudo systemctl start systemd-resolved
    sudo systemctl enable systemd-resolved
    
  • 配置NetworkManager使用systemd-resolved:
    创建或编辑/etc/NetworkManager/conf.d/systemd-resolved.conf,添加内容:
    [main]
    dns=systemd-resolved
    
  • 重启NetworkManager生效:
    sudo systemctl restart NetworkManager
    
    此时主机/etc/resolv.conf会自动软链接到/run/systemd/resolve/stub-resolv.conf,确保系统优先使用systemd-resolved解析。

2. 配置Docker使用主机的stub resolver

  • 创建或编辑Docker守护进程配置文件/etc/docker/daemon.json,添加:
    {
      "dns": ["127.0.0.53"]
    }
    
  • 重启Docker服务:
    sudo systemctl restart docker
    

为什么这个方案不影响OpenResty的resolver?

容器内部的127.0.0.11是Docker内置的DNS resolver,负责容器服务发现(如解析同网络内其他容器的域名)。上述配置仅让容器将外部域名(如my-domain.com、google.com)转发到主机的127.0.0.53解析,不会覆盖容器自身的hosts文件或内置DNS逻辑,因此OpenResty配置的resolver 127.0.0.11仍能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:35:06