配置 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 记录的只是元数据。拉取镜像的过程,分为两步:

  1. 拉取 Manifest
  2. 根据 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 镜像引用来源的修改。
posted @ 2016-12-23 14:38  人艰不拆_zmc  阅读(5468)  评论(0编辑  收藏  举报