docker推拉時的數據交換詳解

前言

docker用了這麼久了, 有沒有想過, 在執行docker pushdocker pull命令的時候, 數據是如何傳遞的呢? 換句話說, 如果要實現一個鏡像倉庫, 針對推拉的服務, 如何實現接口呢?

根據OCI 分發規範文檔 的描述, 已經對整個推拉過程中要調用的接口有描述了. 但是, 紙上學來終覺淺, 我還是決定針對harbor倉庫進行推拉操作的抓包, 看看實際上接口調用是怎樣的.

以下所有抓包, 均爲本地搭建的 harbor倉庫(在實現上可能與OCI 略有差異).

pull

執行命令: docker pull hub.hujingnb.com:8090/library/alpine:2.6

抓包結果如下(層在本地沒有, 需要下載):

image-20240324150001778

根據OCI文檔對流程進行說明(第1個請求用於建立連接, 跳過):

METHOD 接口 說明 OCI 對應
GET /v2 嘗試獲取倉庫的API 版本. 此接口在響應頭中標記了獲取權限的地址:
Www-Authenticate Bearer realm="http://hub.hujingnb.com:8090/service/token",service="harbor-registry"
GET /service/token 根據上一步提供的地址, 獲取訪問令牌
HEAD /v2/library/alpine/manifests/2.6 從這一步開始拉取鏡像. 檢查鏡像是否存在, 若不存在返回狀態碼404. 若存在, 同時將鏡像的哈希返回到響應頭中:
Docker-Content-Digest sha256:5c4217c00be9ecba7735157998a4ac0475b5381c8c885396baa6f798f7f839db
/v2/<name>/manifests/<reference>
GET /v2/library/alpine/manifests/sha256:5c42... 獲取鏡像的manifests信息 /v2/<name>/manifests/<reference>
GET /v2/library/alpine/blobs/sha256:c954... 根據上一步拿到的鏡像結果, 下載各個層信息 (在這一步會校驗, 若層在本地已經存在, 則跳過下載) /v2/<name>/blobs/<digest>

通過以上接口調用, 就已經拿到了一個鏡像的所有信息.

push

執行命令: docker push hub.hujingnb.com:8090/library/alpine:3.1

抓包結果:

image-20240324154525050

根據OCI文檔對流程進行說明(第1個請求用於建立連接, 跳過):

METHOD 接口 說明 OCI 對應
GET /v2 同上
GET /service/token 同上
HEAD /v2/library/alpine/blobs/sha256:0f25... 判斷層是否存在. 若在遠端不存在, 則返回404 /v2/<name>/blobs/<digest>
POST /v2/library/alpine/blobs/uploads/ 開始一次層上傳. 響應202成功, 在響應頭的Location字段標明上傳地址 /v2/<name>/blobs/uploads
PATCH /v2/library/alpine/blobs/uploads/6c82... 使用上一步返回的Location地址執行上傳任務, 分片上傳 /v2/<name>/blobs/uploads/<reference>
PUT /v2/library/alpine/blobs/uploads/6c82... 標識本次上傳完畢 /v2/<name>/blobs/uploads/<reference>
HEAD /v2/library/alpine/blobs/sha256:0f25... 在層上傳完畢後, 再次調用接口檢查是否上傳成功. 返回200說明存在 /v2/<name>/blobs/<digest>
... ... 重複操作上傳所有層
PUT /v2/library/alpine/manifests/3.1 所有層上傳完畢, 推送鏡像manifests信息 /v2/<name>/manifests/<reference>

以上, 一個鏡像就成功的推送到鏡像倉庫了. 推送基本上就是把pull的操作反過來.

其他

更具體的, 可以查看OCI 分發規範, 攏共也沒多少, 可以通讀一遍. 在這個位置 定義了一些接口規範, 可以看一下.

對於倉庫的實現, 可以查看harbor 源碼, 也可以查看distribution 來了解其實現.

其實整個看下來, 倒也不覺得神祕了, 無非就是一些數據的上傳, 全部使用HTTP協議, 散會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章