Docker 拉镜像超时,基本就是这几种解法
前几天在内网机器上起一个 EMQX 集群,执行 docker run 直接报超时:
[root@localhost ~]# docker run -it --network host --name emqtt-master2-1 \
> -p 1883:1883 \
> -p 18083:18083 \
> -p 8083:8083 \
> -p 8883:8883 \
> -p 8080:8080 \
> -e EMQX_NAME="master2" \
> -e EMQX_HOST=192.168.31.142 \
> -e EMQX_LISTENER__TCP_EXTERNAL=1883 \
> -e EMQX_WAIT_TIME=30 \
> -e EMQX_CLUSTER__DISCOVERY="static" \
> -e EMQX_JOIN_CLUSTER="master1@192.168.31.142" \
> -e EMQX_CLUSTER__STATIC__SEEDS="master1@192.168.31.141,master2@192.168.31.142" \
> emqx/emqx:v4.0.0
Unable to find image 'emqx/emqx:v4.0.0' locally
Trying to pull repository docker.io/emqx/emqx ...
/usr/bin/docker-current: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
Client.Timeout exceeded while awaiting headers,这个错在国内环境太常见了。其实就是连不上 Docker Hub,registry-1.docker.io 基本处于半墙状态,直连大概率超时。
下面按我实际处理的经验说几种方法,大部分情况第一种就能搞定。
配置国内镜像源
这个是最直接的方案,配置好之后 docker pull 走的就是国内镜像,速度也快不少。
编辑 /etc/docker/daemon.json,没有就新建:
sudo vi /etc/docker/daemon.json
把下面内容写进去:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://mirror.baidubce.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"insecure-registries": [],
"debug": true,
"experimental": false
}
这里容易踩的坑是 JSON 格式,多一个逗号 docker 就起不来。
然后重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证一下镜像源有没有生效:
docker info | grep "Registry Mirrors"
输出里应该能看到刚才配的地址。之后重新 docker pull emqx/emqx:v4.0.0 应该就可以了。

如果还是超时,可能是某些镜像源也挂了(遇到过),可以换一批试试,或者继续往下看。
用阿里云专属加速器
上面配的是公共镜像源,阿里云提供了一个专属地址,理论上有配额和速度保障。
登录 阿里云容器镜像服务 拿一个加速器地址,然后把它加到 /etc/docker/daemon.json 的 registry-mirrors 列表里,重启 docker。
这个地址是账户独立的,尽量不要到处分享,不然可能被限。
手动导镜像
有些环境压根不能通外网,上面招数全无效,就只能从能拉镜像的机器上先 pull,再 save 成 tar 传过去。
业务域名太多难以管理,来此加密支持单张证书绑定高达100个域名。无论是子域名众多的通配符需求,还是跨域名的多域名证书,都能一次性满足。通过统一的后台管理,所有域名的加密状态一目了然,极大地提升了大规模站点集群的管理效率。
在能访问外网的机器上:
docker pull emqx/emqx:v4.0.0
docker save -o emqx_v4.0.0.tar emqx/emqx:v4.0.0
然后把 tar 文件拷贝到目标机器,加载:
docker load -i emqx_v4.0.0.tar
镜像名和 tag 都会保留,之后直接 run。这是最笨但也最稳的办法。
检查网络环境
有时候不是镜像源的事,而是机器本身出不了网。之前遇到过一次,配了镜像源还是超时,结果发现是 iptables 规则把 docker 的请求给拦了。
可以顺着这几条查:
- 是否需要通过代理访问外网,如果是,给 docker daemon 配一下 HTTP_PROXY 环境变量。
- 防火墙规则,看看 docker 的出方向有没有被 drop。
- DNS 解析,如果
/etc/resolv.conf里的 DNS 有问题,也会卡到超时,可以临时改成 8.8.8.8 测一下。
这些排查步骤网上很多,不展开了。
基本上,先配置镜像源,不行就走手动迁移,配合检查网络,绝大多数拉镜像超时的问题都能过去。
更多推荐

所有评论(0)