最近 DockerHub 修改了訂價,對於免費賬號會限制 200 pulls/6小時,對於匿名賬號則限制 100 pulls/6小時。 本文我來介紹下如何使用 Cache 來應對此問題。
DockerHub 是全世界最先也是最大的容器鏡像倉庫,託管着衆多操做系統發行版及各種軟件的 Docker 鏡像。git
在推動業務容器化的過程當中,不可避免的,咱們會須要使用來自 DockerHub 上的容器鏡像。 不管是在我的本地環境中使用,仍是用於跑測試服務github
如下是兩種主要的解決方案:docker
構建一些公共基礎鏡像,存放在企業的私有鏡像倉庫中給業務方使用:json
這種方案下,若是業務方偶爾須要一些小衆的/非基礎的鏡像,可能只是臨時測試使用,那一般狀況下是不必將此類鏡像做爲基礎鏡像維護的。緩存
結果多是:網絡
docker tag
重 tag 後, push 到企業的私有鏡像倉庫中。這種狀況下,若是沒有較好的鏡像管理規則,那麼鏡像倉庫中就會存在各類無心義的鏡像,形成存儲資源的浪費。爲 docker daemon 配置 Proxy 進行加速:tcp
而且近期 DockerHub 修改了其服務價格, 對於免費用戶,進行了以下限制:測試
若是咱們繼續使用上述兩種模式的話,因爲出口 IP 是相對固定的,因此很容易觸發 DockerHub 的配額限制。 此限制將於 11 月 1 日正式全面實施。spa
爲了能 提高效率 ,以及 節約加速帶寬成本 ,企業內部/我的就很是須要一個 DockerHub 全鏡像加速服務了,也就是咱們常說的 pull through cache
。操作系統
下面我來介紹下,如何利用 Docker 開源的項目 registry:2
來實現這一需求。
使用 registry:2
部署鏡像緩存服務很簡單,這裏先執行 docker pull registry:2
下載所需的鏡像:
(MoeLove) ➜ docker pull registry:2 2: Pulling from library/registry cbdbe7a5bc2a: Pull complete 47112e65547d: Pull complete 46bcb632e506: Pull complete c1cc712bcecd: Pull complete 3db6272dcbfa: Pull complete Digest: sha256:8be26f81ffea54106bae012c6f349df70f4d5e7e2ec01b143c46e2c03b9e551d Status: Downloaded newer image for registry:2 docker.io/library/registry:2
最小化配置的 DockerHub 鏡像緩存服務,只須要使用一個配置項 REGISTRY_PROXY_REMOTEURL
便可:
這裏我順便爲它單首創建了一個名爲 hub-cache
的 network ,以及建立了對應的 volume 。
(MoeLove) ➜ ~ docker network create hub-cache 19a39f873a23150d3bdaf021e040ccccb092ee3071884d64d52a92df0397b220 (MoeLove) ➜ ~ docker volume create hub-cache hub-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 -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6cbdcbdcc2d6 registry:2 "/entrypoint.sh /etc…" 8 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp cache
啓動一個全新的 Docker In Docker 容器進行驗證,避免受到本地環境的影響。
經過傳遞 --registry-mirror http://cache: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/prometheus Using default tag: latest latest: Pulling from prom/prometheus 76df9210b28c: 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:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971 Status: Downloaded newer image for prom/prometheus:latest docker.io/prom/prometheus:latest real 0m 42.71s user 0m 0.12s sys 0m 0.09s / # docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE prom/prometheus latest cdfc440228d0 8 days ago 168MB / # docker rmi prom/prometheus Untagged: prom/prometheus:latest Untagged: prom/prometheus@sha256:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971 Deleted: sha256:cdfc440228d01d7a94937d7a047fa6461efc1b1806bb20677043fee032810830 Deleted: sha256:c72f348fd2f923996ea80222feb77e34aba9de397bd96206ddc3c8651adc306d Deleted: sha256:e34df2c00334266a67bb846b958ba6eae3b1d5cdfe9d763707027a23e7c85100 Deleted: sha256:d2cb38310ada122064b7333bbfc12c67dc58acb30e29146b3ba1e24adc27a950 Deleted: sha256:7a87cd520d19a83b3582541aac4d95098ae5016b092e72eaf80dc54f587bf51e Deleted: sha256:f84c79dceed6b5a27234c1291d0bdccab5c459d587f13934d74db9b9e79471c6 Deleted: sha256:f542b0cffe0fe16c31c98e7eed934d5fea5e598c03b53b4efd308a62e0e9c6a9 Deleted: sha256:f746b4a525727bcb79367d009d707ef45d75bac09aaa18a68c20a19046df0897 Deleted: sha256:09b45653ee7062c7cd754885bf46ebe554d0794573fb2e200acea8644e64670f Deleted: sha256:867526c56b30e67493341ef33890aa242c1131e4bb4151e60011b4d450892d59 Deleted: sha256:86d629b358ee70bdb0f0a11c10915b8551e904fe337f9a8bfcad476977329532 Deleted: sha256:842455c528af7383ba4a0de424fc63664a0248581a191516d6dbf45195c69426 Deleted: sha256:1be74353c3d0fd55fb5638a52953e6f1bc441e5b1710921db9ec2aa202725569 / # time docker pull prom/prometheus Using default tag: latest latest: Pulling from prom/prometheus 76df9210b28c: 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:d43417c260e516508eed1f1d59c10c49d96bbea93eafb4955b0df3aea5908971 Status: Downloaded newer image for prom/prometheus:latest docker.io/prom/prometheus:latest real 0m 5.27s user 0m 0.06s sys 0m 0.03s
能夠看到,在首次 pull prom/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
並不相同,使用 Harbor 的 proxy cache 特性,須要將待 pull 的鏡像,設置成 <harbor_servername>/<proxy_project_name>/repo/name:tag
的形式,這樣子只是省去了本文一開始介紹的那種手動重 tag 的操做,不夠方便,但也是個很不錯的特性了。
歡迎訂閱個人文章公衆號【MoeLove】