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容器镜像仓库存储原理(前世今身)与搬运技巧 的相关文章

  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Google Cloud Kubernetes 访问私有 Docker Hub 托管映像

    是否可以将私有镜像从 Docker Hub 拉取到 Google Cloud Kubernetes 集群 是否建议这样做 或者我是否需要将我的私有映像也推送到 Google Cloud 我阅读了文档 但没有发现任何内容可以清楚地解释这一点
  • 在容器组的“imageRegistryCredentials”中找到重复的映像注册表“index.docker.io”

    PS C Source VelocityAzurev0 10 0 credentialagent docker compose gt docker compose up Running 0 1 Group credentialagent d
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 向 docker 镜像添加新的入口点

    最近 我们决定将我们的一项服务迁移到 docker 容器 该服务是另一家公司的产品 他们为我们提供了 docker 镜像 但是 我们需要在容器入口点中执行一些额外的配置步骤 我尝试的第一件事是从基础映像创建一个 DockerFile 然后添
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 自动备份远程托管服务器的最佳实践

    我正在尝试设置一个用于团队笔记的服务器 我想知道自动备份其数据 又称我的笔记 的最佳方法是什么 目前我计划在 docker 镜像中运行服务器 docker 镜像将由托管服务 例如 Google 托管 我找到了一个适合我的需求的免费托管服务
  • 应用程序移至 Docker 生产环境时 Flask-WTF CSRF 验证失败

    我刚刚为我一直在开发的 Flask 应用程序设置了生产环境 这个堆栈是 Windows Server 2012 R2 Hyper V VM Running Ubuntu 14 04 Docker 1 5 Running Containers
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent

随机推荐

  • 历年阿里巴巴面试题集,蚂蚁金服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 镜像存储原理