Docker 拉取镜像超时与权限问题排查笔记

适用场景:CentOS 系列 Linux,Docker 安装后无法使用

 背景

今天在VMware中新装了一个 Linux (CentOS),在上面尝试使用 Docker,结果一上来就连续踩了权限坑网络坑DNS 解析坑。从 Permission denied 到 i/o timeout,再到 Could not resolve host,最后成功拉取 hello-world,把过程记录下来,希望对遇到同样问题的同学有所帮助。

 踩坑现场(错误日志还原)

错误一:permission denied 连接 Docker 套接字

当我尝试执行 docker images 时,直接报错:

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: ... connect: permission denied

尝试加 sudo,结果系统提示:

liaowl is not in the sudoers file. This incident will be reported.

分析:当前普通用户既不在 docker 用户组,也没有 sudo 权限,导致无法执行任何 Docker 命令。

错误二:网络超时(i/o timeout)

好不容易切换到 root 用户(su -)后,执行 docker search rocketmq

Error response from daemon: Get "https://index.docker.io/v1/search?q=rocketmq&n=25": dial tcp 69.171.227.37:443: i/o timeout

分析:国内服务器访问 Docker Hub 官方源直连超时,需要配置镜像加速器。

错误三:配置镜像源后依然超时且 curl 解析失败

参考网上的教程配置了 /etc/docker/daemon.json,重启 Docker 后依然卡住。使用 curl 测试镜像源域名:

[root@MiWiFi-R4A-srv ~]# curl -I https://docker.mirrors.ustc.edu.cn
curl: (6) Could not resolve host: docker.mirrors.ustc.edu.cn; Unknown error
[root@MiWiFi-R4A-srv ~]# curl -I https://hub-mirror.c.163.com
curl: (6) Could not resolve host: hub-mirror.c.163.com; Unknown error

分析:明明是国内的镜像源,DNS 却解析不了(可能是运营商 DNS 污染或服务器 DNS 配置问题)。更致命的是,我一开始在 daemon.json 里把文件路径写进了 JSON 内容里,导致格式错误,Docker 根本没加载配置!

根本原因总结

  1. 权限不足:用户不在 docker 组且无 sudo 权限。

  2. 网络不通(直连 Docker Hub):国内服务器访问海外官方源超时。

  3. 镜像源不可达(DNS 解析失败):配置的某些公共镜像源域名在当前网络环境下无法解析。

  4. 配置文件格式错误daemon.json 语法错误,导致 Docker 守护进程忽略配置。

解决方案

第 1 步:解决 Docker 权限问题

由于当前用户没有 sudo 权限,直接切 root 用户(如果有 root 密码):

su -

推荐正规做法:如果有 sudo 权限,执行 sudo usermod -aG docker $USER 并将用户加入 docker 组,再重新登录)。

第 2 步:正确编辑 Docker 配置文件

千万不要把文件路径写到 JSON 里面!编辑 /etc/docker/daemon.json

vim /etc/docker/daemon.json

正确的内容格式(我最终使用 Daocloud + 中科大两个源):

{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

⚠️ 注意:JSON 格式要求极其严格,最后一个镜像地址后面千万不要加逗号,否则 Docker 重启会失败。

第 3 步:重启 Docker 使配置生效

systemctl daemon-reload
systemctl restart docker

第 4 步:验证配置是否加载成功

执行以下命令查看镜像源是否已生效:

docker info | grep -A 5 "Registry Mirrors"

输出显示:

Registry Mirrors:
  https://docker.m.daocloud.io/
  https://docker.mirrors.ustc.edu.cn/

说明配置已正确加载。

第 5 步:验证镜像源是否可访问(DNS 与网络层)

curl -I https://docker.m.daocloud.io

返回 HTTP/1.1 302 Moved Temporarily,说明该域名可访问。

第 6 步:拉取测试镜像

docker pull hello-world

最终成功输出:

Using default tag: latest
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
Digest: sha256:96498ffd522e70807ab6384a5c0485a79b9c7c08ca79ba08623edcad1054e62d
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

 特别提醒

  1. docker search 不受镜像加速器影响
    即使配置了加速器,docker search 依然会直连 Docker Hub 官方 API。如果你执行 docker search 还是报超时,这是正常的,并不是配置失效了。搜镜像直接去 Docker Hub 官网 搜更快。

  2. DNS 解析问题
    如果你配置的镜像源 curl 提示 Could not resolve host,可以尝试修改系统 DNS:

    echo "nameserver 114.114.114.114" > /etc/resolv.conf

    然后再次 curl 测试。

  3. JSON 格式检查
    如果重启 Docker 失败,可以用以下命令检查 JSON 语法是否正确:

    python -m json.tool /etc/docker/daemon.json

最终的可用配置清单

文件路径内容
/etc/docker/daemon.json{"registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.mirrors.ustc.edu.cn"]}

最终也是成功拉取下来了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值