docker推拉时的数据交换详解

news/2024/4/28 16:01:09/文章来源:https://blog.csdn.net/qq_31725391/article/details/136989808

前言

docker用了这么久了, 有没有想过, 在执行docker pushdocker pull命令的时候, 数据是如何传递的呢? 换句话说, 如果要实现一个镜像仓库, 针对推拉的服务, 如何实现接口呢?

根据OCI 分发规范文档 的描述, 已经对整个推拉过程中要调用的接口有描述了. 但是, 纸上学来终觉浅, 我还是决定针对harbor仓库进行推拉操作的抓包, 看看实际上接口调用是怎样的.

以下所有抓包, 均为本地搭建的 harbor仓库(在实现上可能与OCI 略有差异).

pull

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

抓包结果如下(层在本地没有, 需要下载):

在这里插入图片描述

根据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

抓包结果:

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1027003.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux升级GCC

文章目录 一、安装 EPEL 仓库二、更新yum三、安装 CentOS 开发工具组四、安装scl五、安装gcc 11六、启用gcc 11七、设置永久使用 一、安装 EPEL 仓库 命令&#xff1a; yum install epel-release -y二、更新yum 命令&#xff1a; yum update -y三、安装 CentOS 开发工具组 …

蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)

目录 一、摆花 思路一&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 思路二&#xff1a; 确定状态&#xff1a; 初始化&#xff1a; 循环遍历&#xff1a; 状态转移方程&#xff1a; 二、数字三角形加强版 一、摆花 题目描述 小明的花店新开张&#xff0c;为了吸…

python知识点总结(十)

python知识点总结十 1、装饰器的理解、并实现一个计时器记录执行性能&#xff0c;并且将执行结果写入日志文件中2、队列和栈的区别&#xff0c;并且用python实现3、设计实现遍历目录与子目录4、CPU处理进程最慢的情况通常发生在以下几种情况下&#xff1a;5、CPU处理线程最慢的…

删除数组中的指定元素(了解如何删除数组中的指定元素,并返回一个新的数组,看这一篇就足够了!)

前言&#xff1a;有时候我们会遇到要在数组中删除指定元素&#xff0c;但是不能创建新的数组&#xff0c;那么这个时候应该如何操作呢&#xff1f; ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多讲&#xff0c;让我们…

脚本实现Ubuntu设置屏幕无人操作,自动黑屏

使用 xrandr 命令可以实现对屏幕的控制&#xff0c;包括调整分辨率、旋转屏幕以及关闭屏幕等。要实现 Ubuntu 设置屏幕在无人操作一段时间后自动黑屏&#xff0c;非待机&#xff0c;并黑屏后点击触摸屏可以唤醒屏幕&#xff0c;可以借助 xrandr 命令来实现。 首先&#xff0c;…

基于ssm在线云音乐系统的设计与实现论文

摘 要 随着移动互联网时代的发展&#xff0c;网络的使用越来越普及&#xff0c;用户在获取和存储信息方面也会有激动人心的时刻。音乐也将慢慢融入人们的生活中。影响和改变我们的生活。随着当今各种流行音乐的流行&#xff0c;人们在日常生活中经常会用到的就是在线云音乐系统…

macos配置maven

Mac Maven 安装及配置 - 知乎 官网上下载一个zip 配置环境变量vim ~/.bash_profile 我打开来看到之前配过conda的&#xff0c;和教程里不一样。那就在之前的配置下方添加就好了。 既然你的.bash_profile文件中已经有了一些配置&#xff0c;特别是Anaconda的初始化脚本&#…

鸿蒙HarmonyOS应用开发之Rawfile开发指导

场景介绍 开发者可以通过本指导了解在OpenHarmony应用中&#xff0c;如何使用Native Rawfile接口操作Rawfile目录和文件。功能包括文件列表遍历、文件打开、搜索、读取和关闭Rawfile。 接口说明 接口名描述NativeResourceManager *OH_ResourceManager_InitNativeResourceMan…

哪些属于“法律、行政法规另有规定,依照其规定进行评估/批准”的情况?

哪些属于“法律、行政法规另有规定&#xff0c;依照其规定进行评估/批准”的情况&#xff1f; 除《网络安全法》《数据安全法》和《个人信息保护法》确立的数据和网络安全整体体系外&#xff0c;企业还应当考虑其他相关法律法规的要求。 例如&#xff1a; ✮如根据《中华人民…

OpenHarmony实战开发-滑动容器组件Swiper的使用

介绍 本篇Codelab主要介绍了滑动容器组件Swiper的几种常见的应用场景&#xff0c;包括顶部导航、轮播图以及视频滑动播放。 相关概念 Swiper&#xff1a;滑动容器&#xff0c;提供子组件切换滑动的能力。Stack&#xff1a;堆叠容器&#xff0c;子组件按照顺序依次入栈&#x…

训练svm并部署树莓派

训练svm并部署树莓派 开发环境1. 准备数据集2. 训练模型3. 部署模型开发环境 vscode python 3.8 用到的库: scikit-learn==1.3.2 pickle torch pandas matplotlib 1. 准备数据集 数据为xls文件,如下格式 2. 训练模型 文件结构 执行训练 python代码 import pickle &…

【计算机网络】IP 协议

网络层IP协议 一、认识 IP 地址二、IP 协议报头格式三、网段划分1. 初识子网划分2. 理解子网划分3. 子网掩码4. 特殊的 IP 地址5. IP 地址的数量限制6. 私有 IP 地址和公网 IP 地址7. 理解全球网络&#xff08;1&#xff09;理解公网&#xff08;2&#xff09;理解私网&#xf…

Git 常用命令速查

Git 是一个分布式版本控制系统&#xff0c;用于管理代码和其他文件。它允许您跟踪代码的更改&#xff0c;并在必要时回滚到以前的版本。 本文将介绍一些 Git 常用命令&#xff0c;帮助您快速上手 Git。 初始化 Git 仓库 git init添加文件到暂存区 git add <file_name>…

【正版特惠】IDM 永久授权 优惠低至109元!

尽管小编有修改版IDM&#xff0c;但是由于软件太好用了&#xff0c;很多同学干脆就直接购买了正版&#xff0c;现在正版也不贵&#xff0c;并且授权码绑定自己的邮箱&#xff0c;直接官方下载激活&#xff0c;无需其他的绿化修改之类的操作&#xff0c;不喜欢那么麻烦的&#x…

简易指南:国内ip切换手机软件怎么弄

在网络访问受到地域限制的情况下&#xff0c;使用国内IP切换手机软件可以帮助用户轻松访问被屏蔽的内容&#xff0c;扩展网络体验。以下是虎观代理小二分享的使用国内IP切换手机软件的简易指南。并提供一些注意事项。 如何在手机上使用国内IP切换软件 步骤一&#xff1a;选择I…

16.JRE和JDK

程序员在编写代码的时候其实是需要一些环境&#xff0c;例如我们之前写的HelloWorld。我们需要的东西有JVM、核心类库、开发工具。 1、JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方。没有虚拟机&#xff0c;代码…

R使用netmeta程序包实现对罕见事件(Rare events)的网状meta分析

在进行网状meta分析过程中&#xff0c;一些试验经常会出现罕见事件&#xff08;Rare event&#xff09;。尤其是在安全性评价中&#xff0c;由于一些不良事件发生率低、样本量不充足&#xff0c;导致试验组和对照组的事件发生例数少&#xff0c;甚至出现0事件。针对出现0事件的…

【任职资格】某大型制造型企业任职资格体系项目纪实

该企业以业绩、责任、能力为导向&#xff0c;确定了分层分类的整体薪酬模式&#xff0c;但是每一名员工到底应该拿多少工资&#xff0c;同一个岗位的人员是否应该拿同样的工资是管理人员比较头疼的事情。华恒智信顾问认为&#xff0c;通过任职资格评价能实现真正的人岗匹配&…

java注解的实现原理

首先我们常用的注解是通过元注解去编写的&#xff0c; 比如&#xff1a; 元注解有Target 用来限定目标注解所能标注的java结构&#xff0c;比如标注方法&#xff0c;标注类&#xff1b; Retention则用来标注当前注解的生命周期&#xff1b;比如source&#xff0c;class&…

【CSS】CSS基础1(CSS基本介绍+常见样式设计)

目录 什么是CSS&#xff1f; 语法规范 常见样式 例子 代码展示 什么是CSS&#xff1f; 点击以下链接了解更多&#xff1a; ​​​​​​​ ​​​​​https://baike.baidu.com/item/%E5%B1%82%E5%8F%A0%E6%A0%B7%E5%BC%8F%E8%A1%A8/524980?fromModulelemma_inlink(英文…