突破 DockerHub 限制,全映象加速服務

張晉濤 發表於 2020-09-22
最近 DockerHub 修改了定價,對於免費帳號會限制 200 pulls/6小時,對於匿名帳號則限制 100 pulls/6小時。 本文我來介紹下如何使用 Cache 來應對此問題。

背景

DockerHub 是全世界最早也是最大的容器映象倉庫,託管著眾多作業系統發行版及各類軟體的 Docker 映象。

在推進業務容器化的過程中,不可避免的,我們會需要使用來自 DockerHub 上的容器映象。 無論是在個人本地環境中使用,還是用於跑測試服務

以下是兩種主要的解決方案:

  • 構建一些公共基礎映象,存放在企業的私有映象倉庫中給業務方使用:

    這種方案下,如果業務方偶爾需要一些小眾的/非基礎的映象,可能只是臨時測試使用,那通常情況下是沒必要將此類映象作為基礎映象維護的。

    結果可能是:

    • 使用中直接從 DockerHub pull 映象,網路狀況不佳時,就是無盡的等待;
    • 先 pull 映象,然後 docker tag 重 tag 後, push 到企業的私有映象倉庫中。這種情況下,如果沒有較好的映象管理規則,那麼映象倉庫中就會存在各種無意義的映象,造成儲存資源的浪費。
  • 為 docker daemon 配置 Proxy 進行加速:

    • 眾多國內映象加速服務,僅提供 Docker 官方映象的加速服務,個人/組織下的映象不提供加速服務
    • 即使在不同節點上,下載相同的映象,仍然需要通過網路加速,會產生額外的海外頻寬成本;

並且近期 DockerHub 修改了其服務價格, 對於免費使用者,進行了如下限制:

  • 未登入使用者,每 6 小時只允許 pull 100 次
  • 已登入使用者,每 6 小時只允許 pull 200 次

如果我們繼續使用上述兩種模式的話,由於出口 IP 是相對固定的,所以很容易觸發 DockerHub 的配額限制。 此限制將於 11 月 1 日正式全面實施。

為了能 提升效率 ,以及 節約加速頻寬成本 ,企業內部/個人就非常需要一個 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/[email protected]: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_PROXYHTTPS_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】

TheMoeLove