Docker|相识容器镜像层(1)

打印 上一主题 下一主题

主题 637|帖子 637|积分 1911

    引言

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

  构建分层镜像

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

  1. FROM scratch<br />RUN echo "hello" > /work/message.txt<br />COPY content.txt /work/content.txt<br />RUN rm -rf /work/message.txt<br />
复制代码
在底层,容器引擎将按顺序执行这些命令,为每个命令创建一个“层”。但真正发生了什么?最简朴的想法是将每个层视为一个目次,此中包含所有修改过的文件。

  
让我们通过一个大概的实现方法来渐渐相识。

  

  •          FROM scratch 表示此容器从无内容开始。这是第一层,它可以用一个空目次表示,比方 /img/layer1。
  •          创建第二个目次,/img/layer2,并将 /img/layer1 中的所有内容复制到此中。然后,执行 Dockerfile 中的下一个命令(该命令将文件写入 /work/message.txt)。这些内容被写入到 /img/layer2/work/message.txt。这是第二层。
  •          创建第三个目次,/img/layer3,将 img/layer2 中的所有内容复制到此中。下一个 Dockerfile 命令要求将 content.txt 从主机复制到该目次。该文件被写入到 /img/layer3/work/content.txt。这是第三层。
  •          最后,创建第四个目次,/img/layer4,将 img/layer3 中的所有内容复制到此中。下一个命令删除了消息文件,img/layer4/work/message.txt。这是第四层。
  
要共享这些层,最简朴的方法是为每个目次创建一个压缩的 .tar.gz 文件。为了减少总文件大小,任何未修改的来自前一层的数据的文件将被删除。为了清晰地标记文件何时被删除,可以利用“whiteout file”作为占位符。文件只是将 .wh. 作为前缀添加到原始文件名。比方,第四层将用名为 .wh.message.txt 的占位符更换已删除的文件。当层被解压时,任何以 .wh. 开头的文件都可以被删除。

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

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

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

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

     Reference       [1]
Source: https://www.kenmuse.com/blog/understanding-container-image-layers/

     本文由 mdnice 多平台发布

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美丽的神话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表