在使用Docker容器化平台进行安装时,我们遇到了一个典型问题:容器在启动过程中无法访问镜像仓库服务,即使重试了40次仍然没有成功。让我们一起来探究这究竟是怎么回事。

具体来说,在Docker容器化平台的安装过程中,当容器尝试启动时,访问镜像仓库服务总是失败,经过40次重试后问题依旧存在。

部署人员在节点上进行手工测试时发现了报错信息
curl https://registry.local.net:5000curl: (6) Could not resolve host: registry.local.net
对网络配置熟悉的同学都知道,主机上的DNS解析会优先匹配/etc/hosts中配置的本地解析记录,如果此文件中没有相关配置,才会转向/etc/resolv.conf中设置的DNS服务器进行查询。
1️⃣ 排查过程
在部署过程中,镜像仓库服务会在所有节点上配置本地解析记录。我们可以先通过curl或ping命令来测试域名解析
节点手工访问同样出现解析失败
curl https://registry.local.net:5000curl: (6) Could not resolve host: registry.local.net
/etc/hosts文件确实配置了本地地址解析
10.x.16.x registry.local.net
明明已经在/etc/hosts中写入了解析记录,为什么主机仍然提示无法解析这个域名?
我们使用strace命令来检查域名解析的具体调用过程
[root@localhost ~]# strace -e trace=open,openat -f ping -c 1 registry.local.net.....openat(AT_FDCWD, "/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/etc/host.conf", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/dev/cur_gl", O_RDONLY|O_CLOEXEC) = -1 ENOENT (没有那个文件或目录)openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 5openat(AT_FDCWD, "/usr/lib64/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (没有那个文件或目录)PING registry.local.net (10.xx.16.xx) 56(84) bytes of data.openat(AT_FDCWD, "/etc/hosts", O_RDONLY|O_CLOEXEC) = 564 bytes from registry.local.net (10.xx.16.xx): icmp_seq=1 ttl=64 time=0.402 ms--- registry.local.net ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.402/0.402/0.402/0.000 ms+++ exited with 0 +++
从调用过程来看,程序首先读取了Linux系统的/etc/nsswitch.conf配置文件
进一步排查发现,该文件中相关配置项被注释掉了
#hosts: files dns myhostname
解释:
其中files表示首先查询本地文件/etc/hosts,如果匹配成功则直接返回IP地址。dns表示如果本地文件未能找到对应记录,再去/etc/resolv.conf中配置的DNS服务器进行查询。myhostname用于解析当前主机自己的主机名(即通过hostnamectl设置的主机名)。

也就是说,Linux系统会严格按照files → dns → myhostname的顺序来进行域名解析。如果这个顺序被改变,或者被完全注释掉,就会出现类似"明明写在/etc/hosts中,却不生效"的现象。
那么问题原因就显而易见了,由于此配置被注释,Linux系统默认使用DNS服务器来查询IP地址,但这个域名并未在DNS中注册,解析不出结果完全符合预期。
2️⃣ 解决方案
我们需要修改/etc/nsswitch.conf文件,将注释移除,恢复为
hosts: files dns myhostname
保存后即可立即生效,再次访问:
[root@localhost ~]# curl registry.local.net:5000 -IHTTP/1.1 200 OKCache-Control: no-cacheDate: Mon, 29 Sep 2025 06:45:45 GMT
现在已经能够正常返回结果,问题得到解决。
3️⃣ 总结与启示
1.不要忽略基础配置文件的重要性,很多看似复杂的安装失败问题,最终原因可能是最基础的系统配置。
2.熟悉主机名解析顺序/etc/nsswitch.conf决定了解析优先级,这个文件在平时容易被忽视。
3.排查问题要有层次,先确认本地hosts解析是否生效,再检查DNS设置,最后再查看系统配置文件,这样才能快速定位问题所在。
