Docker|了解容器镜像层(2)

news2024/10/6 6:05:46
alt

引言

容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践,最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单,同时又非常强大。在今天的帖子[1]中,我将解释什么是层以及它们的概念性工作原理。

Snapshots

在容器可以运行之前,它需要一个文件系统来挂载。本质上,它需要一个目录,其中包含所有需要可用的文件。压缩的层文件包含文件系统的组成部分,但它们不能直接挂载和使用。相反,它们需要被解压并组织成一个文件系统。这个解压后的目录被称为快照(snapshots)。

创建快照的过程与构建镜像相反。它首先通过下载清单并构建一个要下载的层列表开始。对于每个层,会创建一个包含层父目录内容的目录。这个目录被称为活动快照。接下来,差异应用器负责解压压缩的层文件,并将更改应用到活动快照上。生成的目录随后被称为提交快照。最终的提交快照是作为容器文件系统挂载的那一个。

使用我们之前的例子:

  1. 初始层,FROM scratch,意味着我们可以从下一层和一个空目录开始。没有父层。
  2. 创建了一个 layer2 的目录。这个空目录现在是一个活动快照。文件 layer2.tar.gz 被下载、验证(通过比较摘要和文件名),并解压到目录中。结果是包含 /work/message.txt 的目录。这是第一个提交快照。
  3. 创建了一个 layer3 的目录,并将 layer2 的内容复制进去。这是一个新的活动快照。文件 layer3.tar.gz 被下载、验证并解压。结果是包含 /work/message.txt 和 /work/content.txt 的目录。现在这是第二个提交快照。
  4. 创建了一个 layer4 的目录,并将 layer3 的内容复制进去。文件 layer4.tar.gz 被下载、验证并解压。差异应用器识别到 whiteout 文件,/work/.wh.message.txt,并删除 /work/message.txt。这只剩下 /work/content.txt。这是第三个提交快照。
  5. 由于 layer4 是最后一层,它是容器的基础。为了使其能够支持读写操作,创建了一个新的快照目录,并将 layer4 的内容复制进去。这个目录被挂载为容器的文件系统。运行中的容器所做的任何更改都将发生在这个目录中。

如果这些目录中的任何一个已经存在,这表明另一个镜像有相同的依赖关系。因此,引擎可以跳过下载和差异应用器。它可以直接使用该层。在实践中,这些目录和文件的命名都是基于内容的摘要,以便于识别。例如,一组快照可能看起来像这样:

/var/path/to/snapshots/blobs
└─ sha256
   ├─ 635944d2044d0a54d01385271ebe96ec18b26791eb8b85790974da36a452cc5c
   ├─ 9de59f6b211510bd59d745a5e49d7aa0db263deedc822005ed388f8d55227fc1
   ├─ fb0624e7b7cb9c912f952dd30833fb2fe1109ffdbcc80d995781f47bd1b4017f
   └─ fb124ec4f943662ecf7aac45a43b096d316f1a6833548ec802226c7b406154e9

实际的快照系统支持插件,这些插件可以改善一些这些行为。例如,它允许快照预先组合和解压,加快了这一过程。这允许快照被存储在远程位置。它还允许进行特殊优化,比如按需下载所需的文件和层。

Overlays

虽然挂载起来很容易,但我们刚刚描述的快照方法会产生大量的文件变动和许多重复文件。这会减慢第一次启动容器的过程,并浪费空间。幸运的是,这是容器化过程中可以由文件系统处理的众多方面之一。Linux 原生支持将目录作为覆盖层挂载,为我们实现了大部分过程。

在 Linux 中(或者以 --privileged 或 --cap-add=SYS_ADMIN 运行的 Linux 容器中):

  1. 创建 tmpfs 挂载(基于内存的文件系统,将用于探索覆盖过程)
mkdir /tmp/overlay
mount -t tmpfs tmpfs /tmp/overlay
  1. 为我们的流程创建目录。我们将使用 lower 作为下(父)层,使用 upper 作为上(子)层,作为文件系统的工作目录,并合并以包含合并的文件系统。
mkdir /tmp/overlay/{lower,upper,work,merged}
  1. 为实验创建一些文件。或者,您也可以在 upper 中添加文件。
cd /tmp/overlay
echo hello > lower/hello.txt
echo "I'm only here for a moment" > lower/delete-me.txt
echo message > upper/upper-message.txt
  1. 将这些目录安装为覆盖类型文件系统。这将在合并目录中创建一个新的文件系统,其中包含下层目录和上层目录的组合内容。工作目录将用于跟踪文件系统的更改。
mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
  1. 探索文件系统。您会注意到 merged 包含 upper 和 lower 的组合内容。然后,进行一些更改:
rm -rf merged/delete-me.txt
echo "I'm new" > merged/new.txt
echo world >> merged/hello.txt
  1. 正如预期的那样,delete-me.txt 将从合并中删除,并在同一目录中创建一个新文件 new.txt。如果你对目录进行树化,你会看到一些有趣的东西:
|-- lower
|   |-- delete-me.txt
|   `-- hello.txt
|-- merged
|   |-- hello.txt
|   |-- new.txt
|   `-- upper-message.txt
|-- upper
|   |-- delete-me.txt
|   |-- hello.txt
|   |-- new.txt
|   `-- upper-message.txt

运行 ls -l upper 显示

total 12
c--------- 2 root root 0, 0 Jan 20 00:17 delete-me.txt
-rw-r--r-- 1 root root   12 Jan 20 00:20 hello.txt
-rw-r--r-- 1 root root    8 Jan 20 00:17 new.txt
-rw-r--r-- 1 root root    8 Jan 20 00:17 upper-message.txt

虽然合并显示了我们更改的效果,上层(作为父层)存储更改的方式与我们手册过程中的例子类似。它包含了新文件 new.txt 和修改过的 hello.txt。它还创建了一个 whiteout 文件。对于覆盖文件系统来说,这涉及到用一个字符设备(和一个 0, 0 设备号)替换文件。简而言之,它拥有我们打包目录所需的一切!

你可以看到这种方法也可以用来实现快照系统。挂载命令可以原生地接受一个冒号 (:) 分隔的 lowerdir 路径列表,所有这些路径都被合并到一个单一的文件系统中。这是现代容器的本质——容器是使用操作系统的原生特性组合而成的。

Reference
[1]

Source: https://www.kenmuse.com/blog/understanding-container-image-layers/

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows Docker 部署 VictoriaMetrics 数据库

一、简介 VictoriaMetrics(VM)是一个快速、高效、经济且可扩展的监控解决方案和时序数据库。它提供了数据存储、管理、处理和分析的强大功能,专注于时间序列数据,并具备高吞吐量和低延迟特性,适用于各类大规模数据场景…

FreeRTOS学习笔记-基于stm32(13)低功耗 Tickless 模式

一、stm32低功耗模式 STM32 本身就支持低功耗模式,如图有三种模式:睡眠(Sleep)模式;停止(Stop)模式;待机(Standby)模式。 二、低功耗 Tickless 模式 由于一般的应用中,处理器大量的时间都在处理空闲任务,所…

mysql中 什么是锁

大家好。上篇文章我们讲了事务并发执行时可能带来的各种问题,今天我们来聊一聊mysql面试必问的问题–锁。 一、解决并发事务带来问题的两种基本方式 1. 并发事务访问相同记录的情况 并发事务访问相同记录的情况大致可以划分为3种: 读-读情况&#xf…

如何用AI大模型打造个性化内容页面展示,提升用户阅读体验和内容传播效果

摘要 本文介绍了如何使用人工智能大模型进行个性化内容页面展示的方法和步骤,包括数据收集、数据处理、特征提取、模型训练、模型预测、数据分析等,以及它们对用户的阅读体验和内容的传播效果的影响和价值。 在数字化时代,内容是王者&…

RT-DETR详解之 Decoder 层

在上一篇博客中,博主已经讲解了如何利用Uncertainty-minimal Query Selection选择出好的特征,接下来便要将这些特征输入到Decoder中进行解码,需要注意的是,在RT-DETR的Encoder中,使用的是标准的自注意力计算方法&#…

【多重背包 动态规划】2585. 获得分数的方法数

本文涉及知识点 动态规划汇总 背包问题汇总 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode2585. 获得分数的方法数 考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types ,其中 …

TCP三次握手和四次挥手过程简介

接上篇 传输层部分 链路层、网络层、传输层和应用层协议详解分析-CSDN博客文章浏览阅读689次,点赞10次,收藏15次。wireshark抓包分析-CSDN博客wireshark是网络包分析工具网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细…

bugku---misc---贝斯手

1、下载附件,解压之后得到下面文件 2、zip需要密码,但是介绍里面给出了提示 3、再结合图片,是古力娜扎,搜索了以下她的生日是1992。应该就是密码 4、破解flag.zip得到一段文本 5、结合题目描述说的贝斯手,猜测应该是b…

win11 默认程序中找不到typora 和设置typora为md的默认打开程序

1.找到任意一个.md文件 2.在任意一个.md文件的上面右键,点击--》打开方式--》选择其他应用--》在电脑上选择应用--》(如果列表中没有,拉到最下面)在电脑上选择应用--》弹出文件浏览框 3.找到安装typora的时候的exe文件&#xff0c…

Flutter打包网络问题解决办法

问题情况":app:compileReleaseJavaWithJavac" 报错的最主要问题其实在下一句 Failed to find Build Tools revision 30.0.3,请查看自己的Android sdk版本,比如我的就是’34.0.0’版本. 解决办法: 在app/build.gradle中的android下添加,即可 buildToolsVersion 3…

【C++课程学习】:类和对象(拷贝构造和运算符重载)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 ✍拷贝构造: 🍉特点一: 🍉特点二: &…

实体类status属性使用枚举类型的步骤

1. 问题引出 当实体类的状态属性为Integer类型时,容易写错 2. 初步修改 把状态属性强制为某个类型,并且自定义一些可供选择的常量。 public class LessonStatus {public static final LessonStatus NOT_LEARNED new LessonStatus(0,"未学习"…

高边坡监测规范:确保边坡安全的科学准则

随着土木工程建设的不断发展,高边坡作为常见的土方边坡形式,其安全问题日益受到人们的关注。高边坡监测规范作为保障边坡安全的重要手段,对于预防边坡滑坡、坍塌等地质灾害具有重要意义。本文将对高边坡监测规范进行深入探讨,以期…

微信小程序组件传值

虽然微信小程序是比较轻量的,但是还是拥有组件的 这是文件的基本目录 我们的代码基本都在pages和components文件夹中 在component中创建组件 在component中 ,创建一个目录 我创建了一个 head目录 用于配置头部信息 我在这里创建了 一个头部组件&…

程序员,真有不变的技术和稳定的工作吗?

在程序员这个充满变化和创新的领域,很多人追求“稳定”的工作,认为找到一个合适的公司和岗位就能安心一辈子。然而,技术的快速更新迭代和市场需求的不断变化,使得真正的稳定变得越来越难以捉摸。作为程序员,我们需要反…

Java虚拟机 - JVM(类加载器、类加载的过程、双亲委派模型、GC垃圾回收)

一、JVM中数据内存区域划分 本地方法栈:里面保存的是native 关键字的方法,不是用Java写的,而是jvm内部用c实现的。 **程序计数器 和 虚拟机栈 每个线程都存在一份。 如果一个 JVM 进程 中有 10个 线程,那么就会存在 10份 程序计数…

通过文本指令生成3D模型纹理贴图

在3D建模的广阔领域中,我们总是追求更高效、更直观的方法来创建和编辑模型。今天,我要向大家介绍一种革新性的技术,它能够通过文本指令来精确地控制3D模型的细节,包括纹理贴图的生成。 1. 技术定位 这项技术主要定位于交互式3D建模领域,它为用户提供了一种全新的方式来创…

哈喽GPT-4o——对GPT-4o Prompt的思考与看法

目录 一、提示词二、提示词的优势1、提升理解能力2、增强专注力3、提高效率 三、什么样的算无效提示词?1、过于宽泛2、含糊不清3、太过复杂4、没有具体上下文5、缺乏明确目标6、过于开放7、使用专业术语但未定义8、缺乏相关性: 四、提示词正确的编写步骤…

Android 应用加固与重签名—使用AndroidStudio自带工具 apksigner

由 AndroidStudio 生成的release版本的app有自己的签名,但当应用加固后会删除原签名,需要重新签名。 一、加固方式: 使用基础版的腾讯云(乐固)进行免费加固,上传软件后等待在线加固完成后下载 apk 即可。…

设置SSHkeys多服务器免登录配置(ssh config)

一、背景: 多邮箱或者多git账号进行同一台电脑开发的情况。 有时候,开发时可能会面临一个情况,就是通过自己的电脑,可能同时需要开发多个不同地方的项目,或者说,自己建立的项目已经配置好SSH验证免密登录&a…