docker清除缓存 技术经验 | 突破 DockerHub 限制 全镜像加速服务

背景

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

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

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

1.

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

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

结果可能是:

2.

为 docker daemon 配置 Proxy 进行加速:

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

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

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

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

启动服务

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

(MoeLove) ➜  docker pull registry:22: Pulling from library/registrycbdbe7a5bc2a: Pull complete 47112e65547d: Pull complete 46bcb632e506: Pull complete c1cc712bcecd: Pull complete 3db6272dcbfa: Pull complete Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551dStatus: Downloaded newer image for registry:2docker.io/library/registry:2

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

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

(MoeLove) ➜  ~ docker network create hub-cache19a39f873a23150d3bdaf021e040ccccb092ee3071884d64d52a92df0397b220(MoeLove) ➜  ~ docker volume create hub-cachehub-cache(MoeLove) ➜  ~ docker run --name=cache -d --restart=always --network=hub-cache -v hub-cache:/var/lib/registry -p 5000:5000  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io registry:2 6cbdcbdcc2d62ec781479901c20be43184a48b2d73e06f04bd4693253c0c5a73(MoeLove) ➜  ~ docker ps -lCONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                    NAMES6cbdcbdcc2d6   registry:2   "/entrypoint.sh /etc…"   8 seconds ago   Up 6 seconds   0.0.0.0:5000->5000/tcp   cache

验证加速效果

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

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

(MoeLove) ➜  ~ docker run  --network=hub-cache -d --privileged docker:dind --registry-mirror http://cache:5000 73c56ac25d68927c9f5b0e458f2babc0699cf8595df0d1e86c021fd03d477384(MoeLove) ➜  ~ docker exec -it $(docker ps -ql) sh/ # 检查配置是否生效/ # docker info --format '{{ .RegistryConfig.Mirrors }}' [http://cache:5000/]
/ # time docker pull prom/prometheusUsing default tag: latestlatest: Pulling from prom/prometheus76df9210b28c: Pull complete 559be8e06c14: Pull complete 6a4bb3319487: Pull complete 2cca90a64593: Pull complete d2014e464a99: Pull complete 70b42590e4a2: Pull complete 54645fcbd6cc: Pull complete 67d9943de656: Pull complete b9c749b1af90: Pull complete 9723d8eb5323: Pull complete 7d20502d5322: Pull complete 3e519cce6f63: Pull complete Digest: sha256:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971Status: Downloaded newer image for prom/prometheus:latestdocker.io/prom/prometheus:latestreal 0m 42.71suser 0m 0.12ssys 0m 0.09s

/ # docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEprom/prometheus latest cdfc440228d0 8 days ago 168MB
/ # docker rmi prom/prometheus Untagged: prom/prometheus:latestUntagged: prom/prometheus@sha256:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971Deleted: sha256:cdfc440228d01d7a94937d7a047fa6461efc1b1806bb20677043fee032810830Deleted: sha256:c72f348fd2f923996ea80222feb77e34aba9de397bd96206ddc3c8651adc306dDeleted: sha256:e34df2c00334266a67bb846b958ba6eae3b1d5cdfe9d763707027a23e7c85100Deleted: sha256:d2cb38310ada122064b7333bbfc12c67dc58acb30e29146b3ba1e24adc27a950Deleted: sha256:7a87cd520d19a83b3582541aac4d95098ae5016b092e72eaf80dc54f587bf51eDeleted: sha256:f84c79dceed6b5a27234c1291d0bdccab5c459d587f13934d74db9b9e79471c6Deleted: sha256:f542b0cffe0fe16c31c98e7eed934d5fea5e598c03b53b4efd308a62e0e9c6a9Deleted: sha256:f746b4a525727bcb79367d009d707ef45d75bac09aaa18a68c20a19046df0897Deleted: sha256:09b45653ee7062c7cd754885bf46ebe554d0794573fb2e200acea8644e64670fDeleted: sha256:867526c56b30e67493341ef33890aa242c1131e4bb4151e60011b4d450892d59Deleted: sha256:86d629b358ee70bdb0f0a11c10915b8551e904fe337f9a8bfcad476977329532Deleted: sha256:842455c528af7383ba4a0de424fc63664a0248581a191516d6dbf45195c69426Deleted: sha256:1be74353c3d0fd55fb5638a52953e6f1bc441e5b1710921db9ec2aa202725569
/ # time docker pull prom/prometheusUsing default tag: latestlatest: Pulling from prom/prometheus76df9210b28c: Pull complete 559be8e06c14: Pull complete 6a4bb3319487: Pull complete 2cca90a64593: Pull complete d2014e464a99: Pull complete 70b42590e4a2: Pull complete 54645fcbd6cc: Pull complete 67d9943de656: Pull complete b9c749b1af90: Pull complete 9723d8eb5323: Pull complete 7d20502d5322: Pull complete 3e519cce6f63: Pull complete Digest: sha256:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971Status: Downloaded newer image for prom/prometheus:latestdocker.io/prom/prometheus:latestreal 0m 5.27suser 0m 0.06ssys 0m 0.03s

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

使用配置

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

{  "registry-mirrors": [    "https://hub-cache.moelove.info"  ]}

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

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

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

总结

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

但如果在企业环境中部署的话,需要有更多的配置。比如,可以通过配置

REGISTRY_HTTP_DEBUG_PROMETHEUS_ENABLED暴露 Prometheus metrics ,用于监控服务可用性及查看 cache 的效果;可以对日志及相关字段进行配置;为了避免在 11 月后,触发到 DockerHub 的流量限制,可以横向进行扩容,准备多出口 IP,以及配置账户等。

最近新发布的 Harbor v2.1 貌似多了一个作为proxy cache的特性,但它与本文介绍的pull through cache并不相同docker清除缓存,使用 Harbor 的 proxy cache 特性,需要将待 pull 的镜像,设置成

/

/repo/name:tag的形式,这样子只是省去了本文一开始介绍的那种手动重 tag 的操作,不够方便,但也是个很不错的特性了

欢迎订阅我的文章公众号【MoeLove】

TheMoeLove参考资料

[1] DockerHub 定价:

关于我们

「PyChina」是 PyChina.org 的官方微信公众号(ID:PyChinaOrg),创立于 2014 年,目前由 PyChina 主理。所有和 PyChina、PyCon China 大会相关的动态都会第一时间在这里发布docker清除缓存,除此之外,你还可以在这里看到 Python 相关的技术分享和最新资讯,欢迎关注!

欢迎关注 PyChina 官方账号️

官网:

公众号(@PyChinaOrg)

阅读推荐

———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99

滚动至顶部