9-docker推送镜像到harbor的完整流程
·
docker push 192.168.0.119:20080/test/centos:7 The push refers to repository [192.168.0.119:20080/test/centos] 174f56854903: Layer already exists 7: digest: sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f size: 529 对上面docker推送镜像到harbor的过程描述来看,详细描述docker推送镜像到harbor的过程,以及说明上面layer already exists是harbor返回的已经存在还是本地docker验证的
根据你提供的输出,下面详细分析 Docker 推送镜像到 Harbor 的过程,以及Layer already exists的判定来源:
一、Docker 推送镜像到 Harbor 的完整流程
-
身份验证
- 客户端通过
docker login命令获取访问 Harbor 仓库的权限令牌(如果配置了认证) - 推送时自动携带令牌访问 Harbor 的 Registry API
- 客户端通过
-
镜像元数据解析
- Docker 客户端读取本地镜像的
manifest.json,解析出所有层(layer)的列表 - 每个层由唯一的哈希值标识(如
174f56854903)
- Docker 客户端读取本地镜像的
-
层存在性检查
- 客户端向 Harbor 发送 HEAD 请求,检查每层是否已存在于目标仓库
- 请求路径示例:
HEAD /v2/<repo>/blobs/<layer-digest>
-
层上传(如果需要)
- 对于不存在的层:
- 启动分块上传会话:
POST /v2/<repo>/blobs/uploads/ - 上传层数据:
PATCH /v2/<repo>/blobs/uploads/<uuid> - 完成上传:
PUT /v2/<repo>/blobs/uploads/<uuid>?digest=<layer-digest>
- 启动分块上传会话:
- 已存在的层会跳过上传步骤
- 对于不存在的层:
-
提交镜像清单
- 所有层处理完毕后,客户端发送镜像清单(manifest):
PUT /v2/<repo>/manifests/<tag>
- 所有层处理完毕后,客户端发送镜像清单(manifest):
-
Harbor 处理与存储
- Harbor 将层数据存储在底层存储(如文件系统 / S3)
- 关联清单与标签,完成镜像注册
二、Layer already exists的判定来源
这一状态由 Harbor 仓库返回,而非本地 Docker 验证,具体依据:
- 验证机制:Docker 客户端通过发送 HEAD 请求到 Harbor 的 Registry API 来检查层是否存在
- 网络请求:在推送日志中可以观察到相关 HTTP 请求(可通过
docker --debug push查看详细信息) - 分布式特性:多个客户端可能向同一 Harbor 仓库推送相同的镜像层,层存在性必须由中央仓库判定
- 输出含义:
Layer already exists表示 Harbor 已拥有该层数据,无需重复上传
三、验证方法
- 使用
docker --debug push查看详细 HTTP 请求日志,确认 HEAD 请求的响应 - 在 Harbor 服务器端查看访问日志,验证是否收到层存在性检查请求
- 推送相同镜像到不同 Harbor 实例,观察是否重复上传相同层
四、优化机制
这种层共享机制带来的优势:
- 节省存储:相同镜像层在 Harbor 中只需存储一份
- 加速推送:重复推送相同镜像时无需重新上传
- 降低带宽:避免网络重复传输相同数据
在企业环境中,这种机制尤其重要,特别是在 CI/CD 流水线频繁构建和推送相似镜像时,可以显著提升效率。
更多推荐
所有评论(0)