当前位置: 首页 > news >正文

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

alt

引言

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

构建分层镜像

创建映像时,通常使用 Dockerfile 来定义容器的内容。它包含一系列命令,例如:

FROM scratch
RUN echo "hello" > /work/message.txt
COPY content.txt /work/content.txt
RUN rm -rf /work/message.txt

在底层,容器引擎将按顺序执行这些命令,为每个命令创建一个“层”。但真正发生了什么?最简单的想法是将每个层视为一个目录,其中包含所有修改过的文件。

让我们通过一个可能的实现方法来逐步了解。

  1. FROM scratch 表示此容器从无内容开始。这是第一层,它可以用一个空目录表示,例如 /img/layer1。
  2. 创建第二个目录,/img/layer2,并将 /img/layer1 中的所有内容复制到其中。然后,执行 Dockerfile 中的下一个命令(该命令将文件写入 /work/message.txt)。这些内容被写入到 /img/layer2/work/message.txt。这是第二层。
  3. 创建第三个目录,/img/layer3,将 img/layer2 中的所有内容复制到其中。下一个 Dockerfile 命令要求将 content.txt 从主机复制到该目录。该文件被写入到 /img/layer3/work/content.txt。这是第三层。
  4. 最后,创建第四个目录,/img/layer4,将 img/layer3 中的所有内容复制到其中。下一个命令删除了消息文件,img/layer4/work/message.txt。这是第四层。

要共享这些层,最简单的方法是为每个目录创建一个压缩的 .tar.gz 文件。为了减少总文件大小,任何未修改的来自前一层的数据的文件将被删除。为了清楚地标记文件何时被删除,可以使用“whiteout file”作为占位符。文件只是将 .wh. 作为前缀添加到原始文件名。例如,第四层将用名为 .wh.message.txt 的占位符替换已删除的文件。当层被解压时,任何以 .wh. 开头的文件都可以被删除。

继续我们的例子,压缩文件将包含:

alt

以这种方式构建大量镜像将导致产生许多“layer1”目录。为确保名称唯一性,压缩文件的命名基于内容的摘要。这与 Git 的工作方式类似。它的好处在于,可以在下载文件时识别相同的内容,并识别文件的任何损坏。如果内容的摘要与文件名不匹配,则文件已损坏。

为了使结果可复现,还需要一个额外的文件——一个解释如何排序层的文件(清单)。清单将识别哪些文件需要下载以及解压它们的顺序。这使得可以重新创建目录结构。它还提供了一个重要的好处:层可以在镜像之间重用和共享。这最小化了本地存储需求。

在实践中,还有更多的优化可用。例如,FROM scratch 的真正含义是没有父层,因此我们的例子实际上是从 layer2 的内容开始的。引擎还可以查看构建中使用的文件,以确定是否需要重新创建层。这是层缓存的基础,它最小化了构建或重新创建层的需求。作为额外的优化,不依赖前一层的层可以使用 COPY --link 指示该层不需要删除或修改前一层的任何文件。这允许压缩层文件与其他步骤并行创建。

Reference
[1]

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

本文由 mdnice 多平台发布

相关文章:

  • 30、matlab现代滤波:维纳滤波/LMS算法滤波/小波变换滤波
  • STM32—按键控制LED(定时器)
  • 根据模板和git commit自动生成日·周·月·季报
  • ALSA 用例配置
  • Dokcer 基础使用 (4) 网络管理
  • C# 泛型函数
  • 毕业论文word常见问题
  • ElementUI中date-picker组件,怎么把大写月份改为阿拉伯数字月份(例如:一月、二月,改为1月、2月)
  • 【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • 为Android组件化项目搭建Maven私服
  • 洛谷 P1253 扶苏的问题 题解 线段树
  • 爬虫案例:有道翻译python逆向
  • 【中间件系列】浅析redis是否适合做消息队列
  • dots_image 增强图像中的圆点特征
  • 逆波兰表达式
  • gcc介绍及安装
  • Java 23种设计模式 之单例模式 7种实现方式
  • JDK9: 集成 Jshell 和 Maven 项目.
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Terraform入门 - 3. 变更基础设施
  • vue-cli在webpack的配置文件探究
  • 成为一名优秀的Developer的书单
  • 创建一种深思熟虑的文化
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 今年的LC3大会没了?
  • 聊一聊前端的监控
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅谈Golang中select的用法
  • 最近的计划
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​io --- 处理流的核心工具​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (五)Python 垃圾回收机制
  • (一)appium-desktop定位元素原理
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)linux下的时间函数使用
  • **CI中自动类加载的用法总结
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 服务 ServiceController
  • .NET建议使用的大小写命名原则
  • .NET设计模式(11):组合模式(Composite Pattern)