如何構(gòu)建私有 Docker Hub 鏡像站

自去年 11 月份開(kāi)始,Docker 公司為了降低運(yùn)營(yíng)成本對(duì) Docker Hub 上 pull 鏡像的策略進(jìn)行了限制,本文介紹了構(gòu)建私有 Docker Hub 鏡像站的方式,可將 Docker Hub 上的 library repo 的鏡像同步到本地鏡像倉(cāng)庫(kù)。
作者:木子(才云)
編輯:Sarah(K8sMeetup)
未登錄用戶(hù),每 6 小時(shí)只允許 pull 100 次 已登錄用戶(hù),每 6 小時(shí)只允許 pull 200 次
registry-mirrors 參數(shù),就可以通過(guò)本地的鏡像倉(cāng)庫(kù)來(lái)拉取鏡像。突破 Docker Hub 限制,全鏡像加速服務(wù):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/ 繞過(guò)從 Docker Hub pull 鏡像時(shí)的 429 toomanyrequests:https://nova.moe/bypass-docker-hub-429/ 如何繞過(guò) Docker Hub 拉取鏡像限制:https://www.chenshaowen.com/blog/how-to-cross-the-limit-of-dockerhub.html
首先鏡像需要挨個(gè)手動(dòng) push 到本地鏡像倉(cāng)庫(kù); 其次本地鏡像倉(cāng)庫(kù)中的鏡像無(wú)法和官方鏡像保持同步更新,如果要使用新的 tag 好的鏡像仍然需要手動(dòng)將鏡像從 Docker Hub 上 pull 下來(lái),然后再 push 到本地鏡像倉(cāng)庫(kù); 還有手動(dòng) push 鏡像是比較混亂的,如果使用的鏡像比較多,比如公有云容器服務(wù),這時(shí)候再手動(dòng) push 的話(huà)管理起來(lái)是極其不方便的。
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 Dockerfilebest practices and provide clear documentation to serve as a reference for otherDockerfileauthors.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 的源碼當(dāng)中的。我們雖然日常訪問(wèn)的是 https://hub.docker.com ,但是我們?cè)?https://github.com/docker/distribution/blob/master/reference/normalize.go#L13 中可以看到實(shí)際 docker使用的地址是一個(gè)硬編碼的docker.io。


get-images.list


Supported tags and respective Dockerfilelinks
bullseye,bullseye-20210208bullseye-backportsbullseye-slim,bullseye-20210208-slimbuster,buster-20210208,10.8,10,latestbuster-backportsbuster-slim,buster-20210208-slim,10.8-slim,10-slimexperimental,experimental-20210208jessie,jessie-20210208,8.11,8jessie-slim,jessie-20210208-slim,8.11-slim,8-slim
buster, buster-20210208, 10.8, 10, latest。一行中鏡像雖然有多個(gè) tag,但這些 tag 指向的 manifest 其實(shí)都是一致的。鏡像 tag 的關(guān)系有點(diǎn)類(lèi)似于 C 語(yǔ)言里的指針變量,是引用的關(guān)系。


toomanyrequests: You have reached your pull rate limit. 錯(cuò)誤。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 的配置文件只是簡(jiǎn)單的 base64 加密,解碼后拿到真實(shí)的 user 和 token。

{"details":"incorrect username or password"}。估計(jì)這個(gè)賬戶(hù)是個(gè) bot 賬戶(hù),只能用于 pull 鏡像,其他的 API 請(qǐng)求都沒(méi)權(quán)限使用。至于這個(gè)賬戶(hù)有沒(méi)有限制,還需要做下測(cè)試。get-manifests.sh




如何食用?
鏡像倉(cāng)庫(kù)建議使用 docker registry 或者 harbor,具體的部署方法可以在互聯(lián)網(wǎng)上找到。 需要個(gè)大盤(pán)雞(大硬盤(pán)機(jī)器),當(dāng)前 Docker Hub 上還在維護(hù)的 tag 鏡像總大小為 128 GB 左右。 如果是長(zhǎng)期使用,本地鏡像倉(cāng)庫(kù)的存儲(chǔ)空間至少 1TB 以上。 由于是使用 GitHub Actions 的機(jī)器將鏡像 push 到本地鏡像倉(cāng)庫(kù),因此本地鏡像倉(cāng)庫(kù)需要有個(gè)公網(wǎng) IP。
REGISTRY_DOMAIN 設(shè)置為本地鏡像倉(cāng)庫(kù)的域名; REGISTRY_USER 設(shè)置為本地鏡像倉(cāng)庫(kù)的用戶(hù)名; REGISTRY_PASSWORD 設(shè)置為本地鏡像倉(cāng)庫(kù)的密碼。

評(píng)論
圖片
表情
