映象 Docker Hub 庫
用例
如果您的環境中執行著多個 Docker 例項,例如多臺物理機或虛擬機器都執行著 Docker,那麼每個守護程式都會連線到網際網路,從 Docker 倉庫中獲取本地沒有的映象。您可以執行一個本地登錄檔映象,並將所有守護程式指向它,以避免這種額外的網際網路流量。
注意Docker 官方映象為 Docker 的智慧財產權。
替代方案
另外,如果您使用的映象集是明確限定的,您可以簡單地手動拉取它們,然後將它們推送到一個簡單的本地私有登錄檔。
此外,如果您的映象都是內部構建的,完全不使用 Hub,而完全依賴於您的本地登錄檔,這是最簡單的場景。
注意事項
目前無法映象其他私有登錄檔。只能映象中央 Hub。
注意Docker Hub 的映象仍然受 Docker 的合理使用政策的約束。
解決方案
登錄檔可以配置為拉取式快取。在此模式下,登錄檔響應所有正常的 Docker 拉取請求,但會將所有內容儲存在本地。
使用登錄檔訪問管理 (RAM) 和登錄檔映象
如果 Docker Hub 訪問透過您的登錄檔訪問管理 (RAM) 配置受到限制,即使映象在您的登錄檔映象中可用,您也無法拉取源自 Docker Hub 的映象。
您將遇到以下錯誤
Error response from daemon: Access to docker.io has been restricted by your administrators.
如果您無法允許訪問 Docker Hub,您可以手動從您的登錄檔映象拉取,並可選擇重新標記映象。例如
docker pull <your-registry-mirror>[:<port>]/library/busybox
docker tag <your-registry-mirror>[:<port>]/library/busybox:latest busybox:latest
它是如何工作的?
首次從本地登錄檔映象請求映象時,它會從公共 Docker 登錄檔拉取映象並將其儲存在本地,然後再將其返回給您。在後續請求中,本地登錄檔映象能夠從自己的儲存中提供映象。
如果 Hub 上的內容發生變化怎麼辦?
當嘗試使用標籤進行拉取時,登錄檔會檢查遠端倉庫,以確保它具有所請求內容的最新版本。否則,它會獲取並快取最新內容。
我的磁碟會怎麼樣?
在高流失率的環境中,陳舊資料可能會在快取中堆積。當作為拉取式快取執行時,登錄檔會定期刪除舊內容以節省磁碟空間。後續對已刪除內容的請求會導致遠端獲取和本地重新快取。
為確保最佳效能並保證正確性,登錄檔快取應配置為使用 `filesystem` 驅動程式進行儲存。
將登錄檔作為拉取式快取執行
將登錄檔作為拉取式快取執行的最簡單方法是執行官方 Registry 映象。至少,您需要在 /etc/docker/registry/config.yml
中指定 proxy.remoteurl
,如以下小節所述。
多個登錄檔快取可以部署在同一個後端上。單個登錄檔快取可確保併發請求不會拉取重複資料,但此特性不適用於登錄檔快取叢集。
配置快取
要將登錄檔配置為拉取式快取,需要在配置檔案中新增一個 proxy
部分。
要訪問 Docker Hub 上的私有映象,可以提供使用者名稱和密碼。
proxy:
remoteurl: https://registry-1.docker.io
username: [username]
password: [password]
警告如果您指定了使用者名稱和密碼,請務必瞭解該使用者在 Docker Hub 上有權訪問的私有資源將在您的映象上可用。如果您希望這些資源保持私有,則必須透過實現身份驗證來保護您的映象!
警告要使排程程式清除舊條目,必須在登錄檔配置中啟用
delete
。
配置 Docker 守護程序
在手動啟動 dockerd
時傳遞 --registry-mirror
選項,或編輯 /etc/docker/daemon.json
並新增 registry-mirrors
鍵值,以使更改持久化。
{
"registry-mirrors": ["https://<my-docker-mirror-host>"]
}
儲存檔案並重新載入 Docker 以使更改生效。
注意一些看似錯誤的日誌訊息實際上是資訊性訊息。
檢查
level
欄位以確定訊息是在警告您錯誤還是在提供資訊。例如,此日誌訊息是資訊性的time="2017-06-02T15:47:37Z" level=info msg="error statting local store, serving from upstream: unknown blob" go.version=go1.7.4
它告訴您檔案在本地快取中尚不存在,並且正在從上游拉取。