华为云 ECS 上 docker pull 一直超时?配好 registry-mirrors 三步解决
一、现象:docker pull 一直在超时
在华为云 KooLabs 云实验里做 Docker 练习,ECS 起来、yum install -y docker 也装好了,但一到拉镜像就卡住:
$ docker pull hello-world
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http:
request canceled while waiting for connection (Client.Timeout exceeded)
不是 Docker 装错了,也不是网络不通——ping 网关能通,curl 华为云内网地址也正常。问题只出在访问 Docker Hub 这一条路上:国内网络直连 registry-1.docker.io 经常超时或被拒。
二、解决思路:给 Docker 配国内镜像加速
Docker 守护进程支持 registry-mirrors,配置后 docker pull 会优先从镜像站拉,只有缓存未命中才回源。改动只有一个文件:
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://dockerproxy.net"
]
}
改完重启:
systemctl restart docker
docker info | grep -A 3 "Registry Mirrors"
docker info 里能看到这三行就说明生效了。
三、怎么判断一个镜像源还活着
镜像源的生命周期很短,社区里流传的地址经常半年前就挂了。我的判断方法很简单——直接看 HTTP 状态码:
curl -sI -m 5 https://docker.m.daocloud.io/v2/ | head -1
三种结果的含义:
| 返回 | 含义 |
|---|---|
HTTP/1.1 200 OK |
可用,正常回源 |
HTTP/1.1 401 Unauthorized |
也算可用——说明服务在跑,只是 /v2/ 需要认证,Docker 自己会带 token |
| 超时 / 502 / NXDOMAIN | 不可用,换下一个 |
本次实验环境里实测:docker.m.daocloud.io 返回 401、docker.1panel.live 返回 200、dockerproxy.net 返回 200,三个都能用。看到 401 不要以为是坏的,这是最容易误判的一点。
四、完整验证链路
配好加速后,按顺序跑一遍,能一次确认"镜像拉取 → 容器运行 → 对外服务"三段都通:
docker pull hello-world
docker run --rm hello-world # 打印 Hello from Docker! 即成功
docker pull nginx
docker run -d -p 80:80 --name web nginx
然后在服务器内部先验一次:
curl -I http://127.0.0.1
# HTTP/1.1 200 OK
再从本地机器验证公网访问:
curl -I http://<EIP>
如果本机 curl 通、公网 curl 超时,九成不是 Docker 的问题,而是安全组没放通 80 端口。去控制台的 VPC → 安全组 → 选关联实例的那条 → 入方向添加上 TCP:80、源地址 0.0.0.0/0,再试一次就通了。
五、几个容易踩的点
daemon.json里绝对不能写注释。JSON 不支持//,写了 Docker 直接起不来,systemctl status docker会显示Failed to start Docker Application Container Engine,日志里是invalid character '/'。- 改完必须
systemctl restart docker,reload不读这个文件。 - 镜像源是"加法"不是"替换":多个源会按顺序尝试,把最快/最稳的放第一位。
- 沙箱环境重启后配置会丢(云实验的资源是一次性的),但换到自己的 ECS 上这个文件会长期生效。
- 不是所有镜像都能加速:私有仓库、部分企业镜像需要单独的登录或代理,
registry-mirrors只对 Docker Hub 生效。
六、小结
国内环境里 Docker 相关问题的第一嫌疑人几乎总是镜像拉取,而 registry-mirrors 是最省事的解法:一个配置文件、一次重启、三条可用源,就能让 docker pull 从"永远超时"变成"几秒钟"。
顺带记一个排障顺序,能少走弯路:
docker pull 超时
→ curl -I <镜像源>/v2/ 看状态码(200/401 都算活)
→ 换源、重启 docker
→ 还是不行:看是不是安全组/代理/出网策略
→ 容器跑起来但外网访问不了:八成是安全组没放通端口
这条链路在云实验、自建虚拟机、公司内网服务器上都通用。
- 点赞
- 收藏
- 关注作者
评论(0)