自去年 11 月份开始,Docker 公司为了降低运营成本对 Docker Hub 上 pull 镜像的策略进行了限制,本文介绍了构建私有 Docker Hub 镜像站的方式,可将 Docker Hub 上的 library repo 的镜像同步到本地镜像仓库。
作者:木子(才云)
编辑:Sarah(K8sMeetup) 来源:K8sMeetup社区
未登录用户,每 6 小时只允许 pull 100 次 已登录用户,每 6 小时只允许 pull 200 次
registry-mirrors
参数,就可以通过本地的镜像仓库来拉取镜像。突破 Docker Hub 限制,全镜像加速服务:https://moelove.info/2020/09/20/%e7%aa%81%e7%a0%b4-DockerHub-%e9%99%90%e5%88%b6%e5%85%a8%e9%95%9c%e5%83%8f%e5%8a%a0%e9%80%9f%e6%9c%8d%e5%8a%a1/ 绕过从 Docker Hub pull 镜像时的 429 toomanyrequests:https://nova.moe/bypass-docker-hub-429/ 如何绕过 Docker Hub 拉取镜像限制:https://www.chenshaowen.com/blog/how-to-cross-the-limit-of-dockerhub.html
首先镜像需要挨个手动 push 到本地镜像仓库; 其次本地镜像仓库中的镜像无法和官方镜像保持同步更新,如果要使用新的 tag 好的镜像仍然需要手动将镜像从 Docker Hub 上 pull 下来,然后再 push 到本地镜像仓库; 还有手动 push 镜像是比较混乱的,如果使用的镜像比较多,比如公有云容器服务,这时候再手动 push 的话管理起来是极其不方便的。
Provide essential base OS repositories (for example, ubuntu, centos) that serve as the starting point for the majority of users. Provide drop-in solutions for popular programming language runtimes, data stores, and other services, similar to what a Platform as a Service (PAAS) would offer. Exemplify Dockerfile
best practices and provide clear documentation to serve as a reference for otherDockerfile
authors.Ensure that security updates are applied in a timely manner. This is particularly important as Official Images are some of the most popular on Docker Hub.
ubuntu:latest
,其他非 library 的镜像需要指定镜像所属的 repo,比如 jenkins/slave:latest
。这部分代码是硬编码在 docker 的源码当中的。我们虽然日常访问的是 https://hub.docker.com ,但是我们在 https://github.com/docker/distribution/blob/master/reference/normalize.go#L13 中可以看到实际 docker
使用的地址是一个硬编码的docker.io
。
get-images.list
Supported tags and respective Dockerfile
links
bullseye
,bullseye-20210208
bullseye-backports
bullseye-slim
,bullseye-20210208-slim
buster
,buster-20210208
,10.8
,10
,latest
buster-backports
buster-slim
,buster-20210208-slim
,10.8-slim
,10-slim
experimental
,experimental-20210208
jessie
,jessie-20210208
,8.11
,8
jessie-slim
,jessie-20210208-slim
,8.11-slim
,8-slim
buster
, buster-20210208
, 10.8
, 10
, latest
。一行中镜像虽然有多个 tag,但这些 tag 指向的 manifest 其实都是一致的。镜像 tag 的关系有点类似于 C 语言里的指针变量,是引用的关系。toomanyrequests: You have reached your pull rate limit.
错误。ime=”2021-02-12T07:08:51Z” level=fatal msg=”Error parsing image name "docker://ubuntu:latest":
Error reading manifest latest in docker.io/library/ubuntu: toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit"
.github/workflows/ssh.yaml
哦豁.jpg
。由于 docker login 的配置文件只是简单的 base64 加密,解码后拿到真实的 user 和 token。{"details":"incorrect username or password"}
。估计这个账户是个 bot 账户,只能用于 pull 镜像,其他的 API 请求都没权限使用。至于这个账户有没有限制,还需要做下测试。get-manifests.sh
如何食用?
镜像仓库建议使用 docker registry 或者 harbor,具体的部署方法可以在互联网上找到。 需要个大盘鸡(大硬盘机器),当前 Docker Hub 上还在维护的 tag 镜像总大小为 128 GB 左右。 如果是长期使用,本地镜像仓库的存储空间至少 1TB 以上。 由于是使用 GitHub Actions 的机器将镜像 push 到本地镜像仓库,因此本地镜像仓库需要有个公网 IP。
REGISTRY_DOMAIN 设置为本地镜像仓库的域名; REGISTRY_USER 设置为本地镜像仓库的用户名; REGISTRY_PASSWORD 设置为本地镜像仓库的密码。