配置 Docker 加速器(Docker Hub Mirror)及绕过 DockerHub 拉取镜像限制
update:20200928
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://1nj0zren.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "http://f1361db2.m.daocloud.io", "https://registry.docker-cn.com" ] }
Docker Hub 镜像加速器列表
镜像加速器 | 镜像加速器地址 | 专属加速器 | 其它加速 |
---|---|---|---|
Docker 中国官方镜像 | https://registry.docker-cn.com | Docker Hub | |
DaoCloud 镜像站 | http://f1361db2.m.daocloud.io | 可登录,系统分配 | Docker Hub |
Azure 中国镜像 | https://dockerhub.azk8s.cn | Docker Hub、GCR、Quay | |
科大镜像站 | https://docker.mirrors.ustc.edu.cn | Docker Hub、GCR、Quay | |
阿里云 | https://<your_code>.mirror.aliyuncs.com | 需登录,系统分配 | Docker Hub |
七牛云 | https://reg-mirror.qiniu.com | Docker Hub、GCR、Quay | |
网易云 | https://hub-mirror.c.163.com | Docker Hub | |
腾讯云 | https://mirror.ccs.tencentyun.com | Docker Hub |
检查加速器是否生效
命令行执行 docker info
,如果从结果中看到了如下内容,说明配置成功。
Registry Mirrors: [...] https://registry.docker-cn.com/
update:20201223 如何绕过 DockerHub 拉取镜像限制
参考:https://www.chenshaowen.com/blog/how-to-cross-the-limit-of-dockerhub.html
DockerHub终究还是绕不过下面这个报错:
Error response from daemon: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit
DockerHub 从 2020 年 11 月 2 日,正式开始限制非付费用户的拉取频率:
-
匿名用户,每 6 小时只允许 pull 100 次
-
已登录用户,每 6 小时只允许 pull 200 次
好吧,正常情况下,到这里就友尽了,不让用就不用。但是再看看这张图:
对于有些团队来说,DockerHub 的功能不仅仅是存储镜像,更重要的是作为分发中心。每次构建完镜像,直接被推送到 DockerHub,然后其他地方再同步镜像。
如此,DockerHub 拉取镜像的限制就不得不解决了。
镜像是如何拉取的
在测试之前,我们先来了解一下镜像是如何拉取的。下图是一个镜像的结构,一个镜像对应着一个 Manifest,也就是这里的 JSON 结构。
为了更具体一点,我们开启 Docker 的实验特征,查看一下 nginx 镜像的 manifest。
export DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect --verbose nginx ```json [ { "Ref": "docker.io/library/nginx:latest@sha256:99d0a53e3718cef59443558607d1e100b325d6a2b678cd2a48b05e5e22ffeb49", "SchemaV2Manifest": { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "config": { "mediaType": "application/vnd.docker.container.image.v1+json", "size": 7480, "digest": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c" }, "layers": [ { "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip", "size": 27105484, "digest": "sha256:852e50cd189dfeb54d97680d9fa6bed21a6d7d18cfb56d6abfe2de9d7f173795" }, ... ]
可以看到在 Manifest 中,记录着很多 Layer 的指纹数据,而 Layer 层才是镜像层数据,Manifest 记录的只是元数据。拉取镜像的过程,分为两步:
- 拉取 Manifest
- 根据 Manifest 中的描述,拉取 Layer 层数据。如果本地有缓存,则不用请求。
配置镜像源解除拉取限制
可选镜像源及测试结果
镜像源 | 是否有效 | 速度 | 地址 | 备注 |
---|---|---|---|---|
Azure | 有 | 快 | https://dockerhub.azk8s.cn | 之前仅允许 Azure 主机使用,现在又放开了 |
中科大 | 有 | 快 | https://ustc-edu-cn.mirror.aliyuncs.com | 相当于 Aliyun 的公共镜像源 |
阿里云 | 有 | 快 | https://<your_code>.mirror.aliyuncs.com | 需要登录,每人一个地址 |
网易 | 无效 | - | https://hub-mirror.c.163.com | |
Daocloud | 无效 | - | https://f1361db2.m.daocloud.io | 已经缓存的本地镜像也无法拉取 |
七牛 | 无效 | - | https://reg-mirror.qiniu.com |
总体来看,使用中科大的镜像源是个不错的选择。
- 编辑 Docker 的 Daemon 文件
vim /etc/docker/daemon.json
- 添加中科大的镜像源
{ "registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com"], }
- 重启 Docker 服务
systemctl daemon-reload && systemctl restart docker
Docker 加速器是什么,我需要使用吗?
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。如果您是在国内的网络环境使用 Docker,那么 Docker 加速器一定能帮助到您。
配置 Docker 加速器(Linux系统):
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://cfb55545.m.daocloud.io
该脚本可以将 –registry-mirror 加入到你的 Docker 配置文件 /etc/default/docker 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。
PS:我使用当前服务器的环境是CentOS7,内核是4.9.0-1.el7.elrepo.x86_64,注册daocloud账号,登录每个人都会生成唯一的加速地址(如:http://cfb55545.m.daocloud.ioCopy),此操作的结果是在/etc/docker生成daemon.json文件,内容{“registry-mirrors”: [“http://cfb55545.m.daocloud.io”],}
Docker 加速器对 Docker 的版本有要求吗?
Docker 加速器对 Docker 的版本有要求吗?需要 Docker 1.8 或更高版本才能使用,如果您没有安装 Docker 或者版本较旧,请安装或升级。
Mirror 与 Private Registry 的区别
二者有着本质的差别。
- Private Registry 是开发者或者企业自建的镜像存储库,通常用来保存企业内部的 Docker 镜像,用于内部开发流程和产品的发布、版本控制。
- Mirror 是一种代理中转服务,我们提供的 Mirror 服务,直接对接 Docker Hub 的官方 Registry。Docker Hub 上有数以十万计的各类 Docker 镜像。
- 在使用 Private Registry 时,需要在 Docker Pull 或 Dockerfile 中直接键入 Private Registry 的地址,通常这样会导致与 Private Registry 的绑定,缺乏灵活性。
- 使用 Mirror 服务,只需要在 Docker 守护进程(Daemon)的配置文件中加入 Mirror 参数,即可在全局范围内透明的访问官方的 Docker Hub,避免了对 Dockerfile 镜像引用来源的修改。