最近 DockerHub 修改了定价,对于免费帐号会限制 200 pulls/6小时,对于匿名帐号则限制 100 pulls/6小时。本文我来介绍下如何使用 Cache 来应对此问题。

背景

DockerHub 是全世界最早也是最大的容器镜像仓库,托管着众多操作系统发行版及各类软件的 Docker 镜像。

在推进业务容器化的过程中,不可避免的,我们会需要使用来自 DockerHub 上的容器镜像。无论是在个人本地环境中使用,还是用于跑测试服务

以下是两种主要的解决方案:

构建一些公共基础镜像,存放在企业的私有镜像仓库中给业务方使用:

这种方案下,如果业务方偶尔需要一些小众的/非基础的镜像,可能只是临时测试使用,那通常情况下是没必要将此类镜像作为基础镜像维护的。

结果可能是:

使用中直接从 DockerHub pull 镜像,网络状况不佳时,就是无尽的等待;

先 pull 镜像,然后重 tag 后, push 到企业的私有镜像仓库中。这种情况下,如果没有较好的镜像管理规则,那么镜像仓库中就会存在各种无意义的镜像,造成存储资源的浪费。

为 docker daemon 配置 Proxy 进行加速:

众多国内镜像加速服务,仅提供 Docker 官方镜像的加速服务,个人/组织下的镜像不提供加速服务;

即使在不同节点上,下载相同的镜像,仍然需要通过网络加速,会产生额外的海外带宽成本;

并且近期 DockerHub 修改了其服务价格[1], 对于免费用户,进行了如下限制:

未登录用户,每 6 小时只允许 pull 100 次

已登录用户,每 6 小时只允许 pull 200 次

如果我们继续使用上述两种模式的话,由于出口 IP 是相对固定的,所以很容易触发 DockerHub 的配额限制。此限制将于 11 月 1 日正式全面实施。

为了能提升效率,以及节约加速带宽成本,企业内部/个人就非常需要一个 DockerHub 全镜像加速服务了,也就是我们常说的。

下面我来介绍下,如何利用 Docker 开源的项目来实现这一需求。

启动服务

使用部署镜像缓存服务很简单,这里先执行下载所需的镜像:

最小化配置的 DockerHub 镜像缓存服务,只需要使用一个配置项即可:

这里我顺便为它单独创建了一个名为的 network ,以及创建了对应的 volume 。

验证加速效果

启动一个全新的 Docker In Docker 容器进行验证,避免受到本地环境的影响。

通过传递,将刚才启动的 registry 设置为 mirror 。

可以看到,在首次 pull 镜像时,耗费了 42+s 的时间,而删除掉已下载的镜像后,再次 pull, 则只需要耗费 5+s 的时间。速度提升非常的明显。镜像加速效果达成

使用配置

对于 Linux 系统而言,仅需要在文件(如果没有此文件,直接创建即可)中写入你的镜像加速服务的域名,重启 docker daemon 即可(也可选择 reload 配置)。

或者是在 docker daemon 的启动参数中加入配置项。

对于 Mac 和 Windows 用户,直接在 Docker Desktop 系统设置中,配置 registry-mirrors 即可。

注意如果 Docker daemon 中配置了或,那么需要将加速域名配置在中,避免被代理。

总结

本文介绍了如何使用 Docker 开源的搭建 DockerHub 的镜像加速服务。这里只介绍了最简单的配置。

但如果在企业环境中部署的话,需要有更多的配置。比如,可以通过配置暴露 Prometheus metrics ,用于监控服务可用性及查看 cache 的效果;可以对日志及相关字段进行配置;为了避免在 11 月后,触发到 DockerHub 的流量限制,可以横向进行扩容,准备多出口 IP,以及配置账户等。

最近新发布的 Harbor v2.1 貌似多了一个作为的特性,但它与本文介绍的并不相同,使用 Harbor 的 proxy cache 特性,需要将待 pull 的镜像,设置成的形式,这样子只是省去了本文一开始介绍的那种手动重 tag 的操作,不够方便,但也是个很不错的特性了。

参考资料

[1]

DockerHub 定价:

https://www.docker.com/pricing

相关文章