8.Docker容器镜像仓库存储原理(前世今身)与搬运技巧

2023-11-08

0x00 镜像如何炼成

在深入学习镜像之前我们需要知道镜像是如何(炼制/搓)成的(等同于构建镜像),当然是通过我们DockerFile一条条指令为镜像生成每一层,按照执行顺序镜像文件系统复写封装从下到上;

1.OCI 标准协议

关于容器镜像的OCI标准协议,那什么又是OCI标准协议?

答: Open Container Initiative(打开集装箱倡议)旨在围绕容器格式和运行时制定一个开放的工业化标准;

参考地址:容器开放接口规范(CRI OCI)

Docker 公司与 CoreOS 和 Google 共同创建了 OCI (Open Container Initial),并提供了三种规范

  • 镜像规范 image-spec : 制定镜像格式、操作等 (https://github.com/opencontainers/image-spec)
  • 运行时规范 runtime-spec : 描述如何运行filesystem bundle (https://github.com/opencontainers/runtime-spec)
  • 镜像仓库规范 distribution-spec (不常见)

关于 OCI 规范的作用说明:

  • 1.制定容器格式标准的宗旨就提高镜像通用性以便不限于某种特定操作系统、硬件、CPU架构、公有云等; 概括来说就是不受上层结构的绑定,如特定的客户端、编排栈
  • 2.两个协议通过 OCI runtime filesytem bundle的标准格式连接在一起,OCI 镜像可以通过工具转换成bundle然后OCI容器引擎能够识别这个 bundle 来运行容器, 其优点如下;
    • 操作标准化:容器的标准化操作包括使用标准容器创建、启动、停止容器,使用标准文件系统工具复制和创建容器快照,使用标准化网络工具进行下载和上传。
    • 内容无关:内容无关指不管针对的具体容器内容是什么,容器标准操作执行后都能产生同样的效果。如容器可以用同样的方式上传、启动,不管是PHP应用还是MySQL数据库服务。
    • 基础设施无关:无论是个人的笔记本电脑还是AWS S3,亦或是OpenStack,或者其它基础设施,都应该对支持容器的各项操作。
    • 为自动化量身定制:制定容器统一标准,是的操作内容无关化、平台无关化的根本目的之一,就是为了可以使容器操作全平台自动化。
    • 工业级交付:制定容器标准一大目标,就是使软件分发可以达到工业级交付成为现实

参考来源:

  • 1.OCI 镜像规范的主要由以下几个 markdown 文件组成:
├── annotations.md         # 注解规范
├── config.md              # image config 文件规范
├── considerations.md      # 注意事项
├── conversion.md          # 转换为 OCI 运行时
├── descriptor.md          # OCI Content Descriptors 内容描述
├── image-index.md         # manifest list 文件
├── image-layout.md        # 镜像的布局
├── implementations.md     # 使用 OCI 规范的项目
├── layer.md               # 镜像层 layer 规范
├── manifest.md            # manifest 规范
├── media-types.md         # 文件类型
├── README.md              # README 文档
├── spec.md                # OCI 镜像规范的概览
  • Image Manifest - a document describing the components that make up a container image | 描述了构成容器的图像的部件的文档
  • Image Index - an annotated index of image manifests | 图像清单的带注释索引
  • Image Layout - a filesystem layout representing the contents of an image | 表示图像的内容的文件系统布局
  • Filesystem Layer - a changeset that describes a container’s filesystem | 描述一个容器的文件系统中的变更
  • Image Configuration - a document determining layer ordering and configuration of the image suitable for translation into a runtime bundle | 文档确定层的排序和适合翻译的图像的配置到运行时的束
  • Conversion - a document describing how this translation should occur | 描述应该是如何发生这种转换的文档
  • Descriptor - a reference that describes the type, metadata and content address of referenced content | 描述的类型,元数据和引用的内容的内容地址的引用
  • 2.OCI 规范是免费的哦,不像大多数 ISO 规范还要交钱才能看(︶^︶)哼。

image-spec - 镜像规范

描述:它决定了我们镜像按照什么标准来构建,以及构建完镜像之后如何存放,接着下文提到的 Dockerfile 则决定了镜像的 layer 内容以及镜像的一些元数据信息。

直白的说一个镜像规范 image-spec 和一个 Dockerfile 就指导着我们构建一个镜像;

总结以上几个 markdown 文件 OCI 容器镜像规范主要包括以下几块内容:

  • Layer : Docker 以 layer (镜像层) 保存的文件系统以及每个Layer保存与上层之间变化部分,以及对保存哪些文件,怎么表示增加、修改和删除的文件等进行描述;

  • Image-Config : 保存了文件系统的层级信息(每个层级的 hash 值,以及历史信息)以及容器运行时需要的一些信息(比如环境变量、工作目录、命令参数、mount 列表),指定了镜像在某个特定平台和系统的配置:

# 比较接近我们使用 docker inspect <image|id> 看到的内容
{
   
  "architecture": "amd64",
  "config": {
   
    "Hostname": "",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
    "Cmd": ["bash"],
    "Image": "sha256:ba8f577813c7bdf6b737f638dffbc688aa1df2ff28a826a6c46bae722977b549",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": null
  },
  "container": "38501d5aa48c080884f4dc6fd4b1b6590ff1607d9e7a12e1cef1d86a3fdc32df",
  "container_config": {
   
    "Hostname": "38501d5aa48c",
    "Domainname": "",
    "User": "",
    "AttachStdin": false,
    "AttachStdout": false,
    "AttachStderr": false,
    "Tty": false,
    "OpenStdin": false,
    "StdinOnce": false,
    "Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],
    "Cmd": [
      "/bin/sh",
      "-c",
      "#(nop) ",
      "CMD [\"bash\"]"
    ],
    "Image": "sha256:ba8f577813c7bdf6b737f638dffbc688aa1df2ff28a826a6c46bae722977b549",
    "Volumes": null,
    "WorkingDir": "",
    "Entrypoint": null,
    "OnBuild": null,
    "Labels": {
   }
  },
  "created": "2020-06-07T01:59:47.348924716Z",
  "docker_version": "19.03.5",
  "history": [{
   
      "created": "2020-06-07T01:59:46.877600299Z",
      "created_by": "/bin/sh -c #(nop) ADD file:a82014afc29e7b364ac95223b22ebafad46cc9318951a85027a49f9ce1a99461 in / "
      },{
   
      "created": "2020-06-07T01:59:47.348924716Z",
      "created_by": "/bin/sh -c #(nop)  CMD [\"bash\"]",
      "empty_layer": true
    }],
  "os": "linux",
  "rootfs": {
   
    "type": "layers",
    "diff_ids": ["sha256:d1b85e6186f67d9925c622a7a6e66faa447e767f90f65ae47cdc817c629fa956"]
  }
}
  • manifest : 镜像的config文件索引包括了Layer/Annotation其文件中保存了很多和当前平台有关信息存放于在 registry 中
    您可以在镜像仓库中通过Registry API请求获取镜像Manifest中的信息, 当我们拉取镜像的时候会根据该文件拉取相应的 layer,比如后面实现的不解压镜像拷贝;
    • 镜像的 manifest 文件(图像清单规范)主要有以下三个目标:
    第一个目标是内容可寻址的图像,通过支持的图像模型,其中所述图像的配置可被散列以生成图像和它的组件的唯一ID。
    第二个目标是让多架构的图像,通过“mainfest”,这对于图像的特定于平台的版本参考图像清单。在OCI,这是在图像索引编入。
    第三个目标是要翻译到OCI运行规范。
    
    • 版本: 目前主流的版本是 Manifest Version 2, Schema 2 官方参考说明
    • 注意: manifest 中的 layer 和 config 中的 layer 表达的虽然都是镜像的 layer ,但二者代表的意义不太一样;
    • 注意: registry 中会有个 Manifest List 文件,该文件是为不同处理器体系架构而设计的,通过该文件指向与该处理器体系架构相对应的 Image Manifest;
    • 总结: 容器镜像的 Config,和 Layers 中的每一层,都是以 Blob 的方式存储在镜像仓库中的,它们的 digest 作为 Key 存在。因此在请求到镜像的 Manifest 后,Docker 会利用 digest 并行下载所有的 Blobs,其中就包括 Config 和所有的 Layers。
//Manifest List
{
   
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
  "manifests": [
    {
   
      "mediaType": &#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.Docker容器镜像仓库存储原理(前世今身)与搬运技巧 的相关文章

  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • 完整的 C++ i18n gettext()“hello world”示例

    我正在寻找完整的 i18ngettext 你好世界的例子 我已经开始了一个基于的脚本使用 GNU gettext 的本机语言支持教程 https web archive org web 20130330233819 http oriya s
  • Docker nginx 代理到主机

    简短的介绍 Nginx 运行在 docker 上 如何配置 nginx 以便将调用转发到主机 详细描述 我们有一个 Web 应用程序与几个后端通信 假设为rest1 rest2 和rest3 我们负责rest1 让我们考虑一下我开始rest
  • 提高mysql导入速度[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我有一个很大的数据库22GB 我曾经用过进行备份mysqldumpgzip 格式的命令 当我提取 gz 文件时 它会生成 sql文件的
  • dockerfile 没有创建目录并复制文件?

    我的 dockerfile 中有以下内容 还有很多 不过我把相关的部分贴在这里了 RUN useradd jenkins USER jenkins Maven settings RUN mkdir m2 COPY settings xml
  • Windows docker:权限被拒绝 /var/run/docker.sock

    当我尝试使用自动发现运行 filebeat 时 出现以下错误 退出 自动发现提供程序设置中出现错误 已获得权限 尝试连接到 Docker 守护程序套接字时被拒绝 unix var run docker sock 获取http 2Fvar 2
  • 如何在特定的Java版本上运行应用程序?

    如何运行具有特定 Java 版本的应用程序 我安装了三个 Java 版本 myuser mysystem sudo update alternatives config java There are 3 choices for the al
  • 使用 docker 在 NodeJS 上对 Postgres 进行 ECONNREFUSED

    我正在使用 postgresql 构建一个在 NodeJS 上运行的应用程序 我使用 SequelizeJS 作为 ORM 为了避免使用真正的 postgres 守护进程并在我自己的设备上使用 nodejs 我使用带有 docker com
  • 无法解析docker容器内的域名

    我在 Windows PC 上的 virtualbox 中运行 Linux 虚拟机 我在虚拟机中安装了docker 然后我使用以下命令启动了一个高山容器docker run it alpine 在这个容器中 我可以成功 ping 外部 IP
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec
  • 如何指定配置脚本的包含目录

    我的工作场所有一个 Linux 系统 其中包含相当旧的软件包 并且没有 root 访问权限 我正在从源代码编译我需要的包 prefix somewhere in homedir 我的问题是我只是不知道如何说服配置在特定目录中查找头文件 源码
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • Docker 多个相同端口问题

    我目前正在解决方案中开发两个相互关联的 ASP NET Core WebAPI 服务 Service1 和 Service2 两者都有 docker 文件并暴露端口 80 Service1是一个独立的服务 需要从Service2调用 我已经
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset

随机推荐

  • 历年阿里巴巴面试题集,蚂蚁金服Android面经!

    早在2017年我们就建了第一个进击BAT的Android开发进阶交流群 两年期间很多群友都分享了自己的Android面试经历 其中就有很多群友已经斩获蚂蚁金服 天猫 高德 盒马等阿里系offer 收集反馈的面经资料比较乱 最近疫情期间终于空
  • springboot之RestTemplate接口封装的示例分享

    转自 springboot之RestTemplate接口封装的示例分享 下文笔者讲述封装RestTemplate接口的示例分享 如下所示 实现思路 只需对RestTemplate方法进行相应的封装 即可实现HttpClient的效果 例 i
  • 1-3、安装Ubuntu和Windows双系统

    1 3 安装Ubuntu和Windows双系统 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 4 初稿 目录 文章目录 1 3 安装Ubuntu和Windows双系统 版本说明 目录 一 初衷 二 注意 三 制作启动盘
  • rsync备份同步文件

    一 介绍 Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像 远程备份的功能 cp scp等工具拷贝均为完整的拷贝 而rsync除了可以完整拷贝外 还具有增量拷贝的功能 官方文档 https www samba org ftp
  • 多线程(三)Thread 类及常见方法

    目录 一 Thread类的几个属性 属性 状态 getState 属性 ID和Name getId 和getName 属性 优先级 getPriority 属性 是否守护线程 isDaemon 属性 是否存活 isAlive 二 启动一个线
  • Jetbrains实用技巧汇总

    Jetbrains Tools 关闭 vim模式 菜单栏 tools gt vim emulator Jetbrains Tools 在启动时取消 打开最近关闭的项目 Settings gt System Settings取消勾选 Reop
  • MongoDB未授权访问漏洞验证与修复过程

    环境 Windows MongoDB3 2 文章目录 一 漏洞验证 1 使用MSF验证 2 使用nmap验证 二 修复 1 寻找配置文件mongod cfg Windows下 2 在 network interfaces 下插入以下代码 三
  • STC8--休眠唤醒

    0 休眠有两种 空闲模式和掉电模式 空闲模式是CPU不再运行 其他外设运行 掉电模式是所有设备不再运行 后者更省电 两种模式都通过PCON来设置 B0位置1进入空闲模式 B1位置1进入掉电模式 1 关于休眠后的唤醒 有两类 第一类是利用IN
  • qt creator编译报错:parse error

    qt creator编译报错 parse error 利用qt creator编译qt工程时 出现报错信息parse error 出现错误的文件是pri文件 出现这种错误 一般是pro或pri出现了语法错误 经过检查 发现我的报错原因是pr
  • 日语操作系统安装日语软件乱码的解放方案

    1 打开控制面板 時計 地域 地域 地域 管理 Unicode対応 言語 日本語 日本 按照以上步骤 既可解决日语系统 安装日语软件乱码的问题
  • CreateProcess error=740, 请求的操作需要提升

    再用Java程序启动本地程序时有时会出现CreateProcess error 740 请求的操作需要提升 这样的异常 此异常为Java程序权限不足以调动需要启动的程序 解决方法 用管理员方式启动IED工具 并运行程序
  • C#图书管理系统

    大二 C 程序设计 课程设计项目 包含完整 源码 设计文档 测试数据 答辩PPT 仅供参考 文章目录 登录 系统管理员 图书借阅 登录 系统管理员 图书借阅
  • (GCC)STM32CubeMX中s启动文件详解

    本文所使用工程由STM32CubeMX生成 使用芯片 STM32F103ZET6 基本只开了时钟 s文件内容如下 C COPYRIGHT 2017 STMicroelectronics file startup stm32f103xe s
  • lvds传输距离标准_带你了解LVDS技术

    LVDS Low Voltage Differential Signaling 低电压差分信号技术 一种定义了高速数据传输接口电路电气特性的通用技术标准 而非协议 因为协议是特定于应用程序的 LVDS标准工作组选择仅定义驱动器和接收器的电气
  • 【Web3】 Web3JS Pay Api

    Web3Network eth sendSignedTransaction serializedTx 参数 from String Number 发送帐户的地址 如果未指定 则使用web3 eth defaultAccount属性 或web
  • 菌群多样性分析报告

    参考链接https www docin com p 2107733531 html 在开始实验项目之前 明确实验流程 一步一步获取实验结果 以可视化工具展现结果 并加以生物学意义上的分析 获取完整的分析报告 下面给出菌群多样性分析报告中应包
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • [Spring学习]07 Spring AOP面向切面编程

    目录 一 什么是Aop 二 Aop相关术语 三 Aop的优点 一 什么是Aop OOP Object Oriented Programming 面向对象编程 AOP Aspect Oriented Programming 面向切面编程 OO
  • conda下多环境(environment)及spyder jupyter lab配置

    结论速递 借助conda进行多environment环境管理 并且这些enviroment都可以共用IDE spyder以及jupyter lab 由于python迭代很快 需要注意的是本文记录时间是2021 8 10 系统是Windows
  • 8.Docker容器镜像仓库存储原理(前世今身)与搬运技巧

    文章目录 0x00 镜像如何炼成 1 OCI 标准协议 image spec 镜像规范 runtime spec 运行时规范 distribution spec 镜像仓库规范 2 Dockerfile 3 基础镜像 0x01 镜像存储原理