首页 > 其他分享 >docker推拉时的数据交换详解

docker推拉时的数据交换详解

时间:2024-03-24 16:22:05浏览次数:26  
标签:... blobs library v2 推拉 镜像 docker 数据交换 alpine

前言

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协议, 散会

标签:...,blobs,library,v2,推拉,镜像,docker,数据交换,alpine
From: https://www.cnblogs.com/hujingnb/p/18092589

相关文章

  • window10 修改docker的配置
    修改docker的路径 参开大佬的博客:https://www.cnblogs.com/icebutterfly/p/9066653.htmlPSC:\Users\Administrator>wsl--shutdownPSC:\Users\Administrator>wsl--list-vNAMESTATEVERSION*docker-desktopStopped2docker-desktop-dataStopped2PSC:\User......
  • [Docker] 7.2 Docker 数据管理深入
    Docker数据卷数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:数据卷 可以在容器之间共享和重用对 数据卷 的修改会立马生效对 数据卷 的更新,不会影响镜像数据卷 默认会一直存在,即使容器被删除注意:数据卷的使用,类似于Linux下对目......
  • Docker的安装
    1.安装gcc以及所需要的软件包#确定你是CentOS7及以上版本cat/etc/redhat-releaseyum-yinstallgccyum-yinstallgcc-c++#安装需要的软件包yuminstall-yyum-utilsdevice-mapper-persistent-datalvm22.设置镜像仓库下载其余资源#使用阿里云(以下为一......
  • 一触即发,全栈联动:使用Docker Compose部署Spring Boot应用+MySQL+Redis实战指南
    在云原生时代的快车道上,DockerCompose无疑是那辆助您疾驰的豪华跑车,它凭借其简洁高效的YAML配置文件,让您能够轻松部署和管理包含SpringBoot应用、MySQL数据库以及Redis缓存服务在内的完整堆栈。本文将深入浅出地引导您通过一个docker-compose.yml文件来定义和配置这些服务,实......
  • docker安装redis
    1.创建本地映射文件夹mkdir-p/docker/redis/data(自定义位置,我选择了上面的文件夹,映射文件夹一会要在redis命令中用到,如果改变请注意)可选:给当前用户加/docker文件夹的权限。sudochown-Rxxxx/docker2.下载redis默认配置文件前往redis的GitHub地址redis-github下载......
  • 在idea中连接ubuntu 16中的docker
    在idea中连接ubuntu16中的docker前提ubuntu安装了docker1.安装docker插件,在file->settings中2.进入Build,Execution,Deployment->Docker通过加号添加这个时候其实不会图片中连接成功的标志,因为还没有配置docker服务,注意我虚拟机的ip为192.168.93.1313.配置dock......
  • Podman能够替代Docker吗
    导读:参考:ExploringPodman:AMoreSecureDockerAlternative作者:MarinBezhanov网址:https://betterstack.com/community/guides/scaling-docker/podman-vs-docker/该随笔为文章部分摘要和学习笔记架构区别Docker属于CS架构(client-server),Podman利用了无守护架构(daemonless......
  • 【Docker】Airflow 容器化部署
    Airflow环境标准软件基于BitnamiAirflow构建。当前版本为2.8.2你可以通过轻云UC部署工具直接安装部署,也可以手动按如下文档操作,该项目已经全面开源,可以从如下环境获取配置文件地址:https://gitee.com/qingplus/qingcloud-platformqinghub自动安装部署配置库什么是Air......
  • 把 Windows 装进 Docker 容器里
    本篇文章聊聊如何在Docker里运行Windows操作系统,WindowsinDockerContainer(WinD)。写在前面我日常使用macOS和Ubuntu来学习和工作,但是时不时会有Windows使用的场景,不论是运行某个指定的软件,还是要做一些跨平台软件的功能验证。在去年开源 soulteary/docker-chatgp......
  • 在 Docker 中启动 Jupyter
    参考JupyterDockerStacksdocumentation容器地址在quay.io/jupyter/scipy-notebook如果你直接运行命令:dockerrun-p10000:8888quay.io/jupyter/scipy-notebook:2024-03-14你启动的Jupyter服务会运行在一个奇怪的域名:Toaccesstheserver,openthisfileinabro......