Manjaro系统Docker容器无法通过/etc/hosts解析主机IP问题
问题原因与解决方案
行为差异原因
Ubuntu与Manjaro上Docker容器DNS解析的差异,核心是系统默认DNS服务与Docker适配逻辑的不同:
- Ubuntu默认启用
systemd-resolved服务,Docker会自动将容器的DNS配置指向主机的systemd-resolvedstub 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
相关产品推荐
相关产品推荐

