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

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/。实际上,新层根本不占用任何空间,因为它不更改任何文件,而仅运行命令。

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册