直接修改 /etc/hosts 是解决 docker 拉取镜像时“no such host”错误的快速手段,因其优先于 dns 解析,可绕过被污染或失效的 dns 查询,直接绑定 registry-1.docker.io 到当前可用 ip,但需通过 dig 等命令获取真实可达 ip 并手动更新,仅适合临时排障,生产环境应结合 dns 优化或镜像加速器。

直接修改 /etc/hosts 是解决 Docker 拉取镜像时“no such host”或“dial tcp: lookup registry-1.docker.io”类错误的快速手段,核心是绕过 DNS 解析环节,让系统直接走 IP 通信。
为什么 hosts 能起作用
Docker 客户端发起请求前,会按顺序查找域名解析:先查 /etc/hosts,再走 DNS。如果在 hosts 中明确写入 registry-1.docker.io 对应的可用 IP,就能跳过不稳定或被拦截的 DNS 查询,避免解析超时或失败。
如何获取并配置正确的 IP 地址
不能随便填一个 IP,必须用当前可连通的真实地址:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 在宿主机终端运行:
ping -c 1 registry-1.docker.io或nslookup registry-1.docker.io - 若返回超时或无结果,换公共 DNS 测试:
dig @8.8.8.8 registry-1.docker.io +short - 选一个响应快、TTL 合理的 IPv4 地址(例如
157.240.20.18或34.227.198.192,实际以你查到的为准) - 编辑
/etc/hosts:sudo nano /etc/hosts - 末尾追加一行:
157.240.20.18 registry-1.docker.io(替换为你查到的 IP)
注意容器内是否生效
该配置只对宿主机和 Docker daemon 生效,不影响已运行的容器。新启动的容器默认继承宿主机 hosts,但以下情况需额外处理:
- 使用
--network=host的容器:自动继承宿主机 hosts - 使用自定义 bridge 网络的容器:默认不读取宿主机 hosts,需显式添加:
docker run --add-host=registry-1.docker.io:157.240.20.18 ... - docker-compose 启动:在服务下加
extra_hosts字段
这个方法的局限性
hosts 是静态映射,Docker Hub 的 IP 会动态变更,长期依赖可能失效:
- 建议仅作临时排障或离线环境使用
- 生产环境更推荐搭配 DNS 优化(如 daemon.json 配置
{"dns": ["8.8.8.8"]})或镜像加速器 - 每次 IP 变更后需手动更新 hosts,否则拉取会失败










