docker镜像下载网站
拉取一个nginx镜像,镜像看着进度条卡在“Waiting”上转圈,下载最后报一句“net/http: TLS handshake timeout”,网站这大概是镜像每个国内Docker用户都经历过的日常。Docker Hub的下载服务器在境外,国内访问速度慢不说,网站还经常直接给你来个连接重置。镜像所以问题很直接:镜像从哪下?下载
官方源当然是最正统的。registry-1.docker.io,网站Docker默认就从这个地址拉。镜像问题是下载它真的慢。我试过在晚高峰拉一个ubuntu:22.04,网站大概180MB,镜像等了将近二十分钟,下载中间断了两次。网站如果你有稳定的国际网络出口,那没问题,配个代理就行。在/etc/systemd/system/docker.service.d/下建个proxy.conf,写上HTTP_PROXY和HTTPS_PROXY,重启docker服务,速度立刻正常。但大多数人没这个条件。
于是镜像加速器成了标配。阿里云、腾讯云、华为云、中科大、网易,这些都用过。阿里云的加速器需要注册账号,每个账号有专属地址,格式是https://xxxx.mirror.aliyuncs.com。配置方法简单,编辑/etc/docker/daemon.json,加一行registry-mirrors,把地址填进去,然后systemctl daemon-reload && systemctl restart docker。腾讯云的地址是https://mirror.ccs.tencentyun.com,这个在腾讯云服务器上内网访问极快,公网也行。中科大的https://docker.mirrors.ustc.edu.cn曾经很好用,但后来因为各种原因时好时坏。网易的https://hub-mirror.c.163.com也类似,稳定性看运气。
这些加速器本质上是反向代理,帮你缓存Docker Hub的镜像层。但有个问题:它们只加速Docker Hub的官方镜像和部分公共镜像。如果你要拉ghcr.io、quay.io或者k8s.gcr.io上的东西,加速器就无能为力了。比如你装个kubeadm,需要k8s.gcr.io/kube-apiserver,这时候中科大的加速器帮不上忙。得找专门同步了这些registry的镜像站,或者用docker pull的时候手动指定完整域名,然后祈祷网络通畅。
还有个路子是第三方镜像仓库。比如DaoCloud的m.daocloud.io,它做了不少registry的代理,格式是m.daocloud.io/原域名/镜像名。举个例子,拉k8s.gcr.io/pause:3.9,写成docker pull m.daocloud.io/k8s.gcr.io/pause:3.9就行。这个方案覆盖面广,ghcr、quay、gcr都支持。但速度不稳定,有时候快有时候慢,取决于它的缓存命中情况。
自己搭registry mirror也是个选择。用registry:2镜像起一个,配置proxy.remoteurl指向https://registry-1.docker.io,然后你的docker daemon指向这个内网地址。好处是缓存完全自己控制,坏处是第一次拉还是慢,而且需要一台有国际出口的机器。公司内网这么干比较合适,个人用户折腾成本偏高。
我现在的做法是组合拳。daemon.json里配两三个加速器地址,阿里云和腾讯云都写上,Docker会按顺序尝试。遇到加速器没有的镜像,比如某些小众的ghcr镜像,就用m.daocloud.io前缀手动拉。实在不行,挂代理。三种方式切换着来,基本没再遇到过拉不下来的情况。
顺便提一句,别去那些来路不明的“Docker镜像下载网站”。有些站点提供离线tar包下载,但你不知道里面有没有被塞东西。镜像层是二进制文件,被篡改了你也看不出来。老老实实用官方registry加可信加速器,别图省事。
(责任编辑:探索)
