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

背景

DockerHub 是全世界最早也是最大的容器鏡像倉庫,託管着衆多操作系統發行版及各類軟件的 Docker 鏡像。

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

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

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

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

結果可能是:

使用中直接從 DockerHub pull 鏡像,網絡狀況不佳時,就是無盡的等待;

先 pull 鏡像,然後重 tag 後, push 到企業的私有鏡像倉庫中。這種情況下,如果沒有較好的鏡像管理規則,那麼鏡像倉庫中就會存在各種無意義的鏡像,造成存儲資源的浪費。

爲 docker daemon 配置 Proxy 進行加速:

衆多國內鏡像加速服務,僅提供 Docker 官方鏡像的加速服務,個人/組織下的鏡像不提供加速服務;

即使在不同節點上,下載相同的鏡像,仍然需要通過網絡加速,會產生額外的海外帶寬成本;

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

未登錄用戶,每 6 小時只允許 pull 100 次

已登錄用戶,每 6 小時只允許 pull 200 次

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

爲了能提升效率,以及節約加速帶寬成本,企業內部/個人就非常需要一個 DockerHub 全鏡像加速服務了,也就是我們常說的。

下面我來介紹下,如何利用 Docker 開源的項目來實現這一需求。

啓動服務

使用部署鏡像緩存服務很簡單,這裏先執行下載所需的鏡像:

最小化配置的 DockerHub 鏡像緩存服務,只需要使用一個配置項即可:

這裏我順便爲它單獨創建了一個名爲的 network ,以及創建了對應的 volume 。

驗證加速效果

啓動一個全新的 Docker In Docker 容器進行驗證,避免受到本地環境的影響。

通過傳遞,將剛纔啓動的 registry 設置爲 mirror 。

可以看到,在首次 pull 鏡像時,耗費了 42+s 的時間,而刪除掉已下載的鏡像後,再次 pull, 則只需要耗費 5+s 的時間。速度提升非常的明顯。鏡像加速效果達成

使用配置

對於 Linux 系統而言,僅需要在文件(如果沒有此文件,直接創建即可)中寫入你的鏡像加速服務的域名,重啓 docker daemon 即可(也可選擇 reload 配置)。

或者是在 docker daemon 的啓動參數中加入配置項。

對於 Mac 和 Windows 用戶,直接在 Docker Desktop 系統設置中,配置 registry-mirrors 即可。

注意如果 Docker daemon 中配置了或,那麼需要將加速域名配置在中,避免被代理。

總結

本文介紹瞭如何使用 Docker 開源的搭建 DockerHub 的鏡像加速服務。這裏只介紹了最簡單的配置。

但如果在企業環境中部署的話,需要有更多的配置。比如,可以通過配置暴露 Prometheus metrics ,用於監控服務可用性及查看 cache 的效果;可以對日誌及相關字段進行配置;爲了避免在 11 月後,觸發到 DockerHub 的流量限制,可以橫向進行擴容,準備多出口 IP,以及配置賬戶等。

最近新發布的 Harbor v2.1 貌似多了一個作爲的特性,但它與本文介紹的並不相同,使用 Harbor 的 proxy cache 特性,需要將待 pull 的鏡像,設置成的形式,這樣子只是省去了本文一開始介紹的那種手動重 tag 的操作,不夠方便,但也是個很不錯的特性了。

參考資料

[1]

DockerHub 定價:

https://www.docker.com/pricing

相關文章