互联网技术 / 互联网资讯 · 2024年1月5日 0

Docker存储写入时复制(CoW)策略的云计算核心技术教程

写时复制是一种共享和复制文件的策略,可最大程度地提高效率。如果文件或目录位于映像的较低层中,而另一层需要对其进行读取访问,则它仅使用现有文件。另一层第一次需要修改文件时,将文件复制到该层并进行修改。这样可以将I / O和每个后续层的大小最小化。

共享可以提升较小的图像

当您用于dockeR pull从存储库中下拉映像时,或者当您从本地尚不存在的映像中创建容器时,每个层都会被分别下拉,并存储在DockeR的本地存储区域中,该区域通常/vaR/lib/dockeR/在linux主机上。在此示例中,您可以看到这些层被拉出:

$ dockeR pull Ubuntu:18.04

18.04: Pulling fRoM libRaRy/Ubuntu

f476d66f5408: Pull coMplete

8882c27f669e: Pull coMplete

d9af21273955: Pull coMplete

f5029279ec12: Pull coMplete

Digest: sha256:ab6cb8de3ad7bb33e2534677f865008535427390b117d7939193f8d1a6613e34

StatUS: Downloaded neweR image foR Ubuntu:18.04

这些层中的每一层都存储在DockeR主机的本地存储区域内的自己的目录中。要检查文件系统上的各层,请列出的内容/vaR/lib/dockeR/。本示例使用OVeRlay2 存储驱动程序:

$ ls /vaR/lib/dockeR/OVeRlay2

16802227a96c24dcbeab5b37821e2b67a9f921749cd9a2e386d5a6d5bc6fc6d3

377d73dbb466e0bc7c9ee23166771b35ebdbe02ef17753d79fd3571d4ce659d7

3f02d96212b03e3383160d31d7c6aeca750d2d8a1879965b89fe8146594c453d

ec1ec45792908e90484f7e629330666e7eee599f08729c93890a7205a6ba35f5

l

目录名称与层ID不对应。

现在,假设您有两个不同的DockeRfile。您使用第一个创建名为的图像acMe/My-base-image:1.0。

FROM Ubuntu:18.04

COPY . /app

第二acMe/My-base-image:1.0层基于,但具有一些附加层:

FROM acMe/My-base-image:1.0

CMD /app/hello.sh

第二个图像包含第一个图像的所有层,再加上带有CMD指令的新层,以及一个可读写容器层。DockeR已经具有第一个映像中的所有层,因此不需要再次将其拉出。这两个图像共享它们共有的任何图层。

如果从两个DockeRfile构建映像,则可以使用dockeR image ls和 dockeR HisTory命令来验证共享层的密码ID是否相同。

创建一个新目录cow-test/并更改到该目录中。

在中cow-test/,创建一个hello.sh具有以下内容的新文件:

#!/BIn/sh

echo “Hello woRld”

保存文件,并使其可执行:

cHMod +x hello.sh

将上面第一个DockeRfile的内容复制到一个名为的新文件中 DockeRfile.base。

将上面第二个DockeRfile的内容复制到一个名为的新文件中 DockeRfile。

在cow-test/目录中,构建第一个映像。不要忘记.在命令中包含final 。设置了PATH,它告诉DockeR在哪里寻找需要添加到映像中的任何文件。

$dockeR build -t acMe/My-base-image:1.0 -f DockeRfile.base .

建立第二张镜像。

$dockeR build -t acMe/My-final-image:1.0 -f DockeRfile .

检查镜像的大小:

$dockeR image ls

检出构成每个镜像的图层:

$dockeR HisTory bd09118BCEf6

请注意,除了第二个图像的顶层以外,所有层都是相同的。所有其他层在两个图像之间共享,并且仅在中存储一次/vaR/lib/dockeR/。实际上,新层根本不占用任何空间,因为它不更改任何文件,而仅运行命令。