gpt4 book ai didi

docker - 了解 docker 层和 future 的变化

转载 作者:行者123 更新时间:2023-12-02 18:03:54 28 4
gpt4 key购买 nike

So ,

enter image description here

Each Docker image references a list of read-only layers that represent filesystem differences. Layers are stacked on top of each other to form a base for a container’s root filesystem.

和,

enter image description here

Because each container has its own thin writable container layer, and all changes are stored in this container layer, this means that multiple containers can share access to the same underlying image and yet have their own data state.

also ,

Layers of a Docker image are essentially just files generated from running some command. You can view the contents of each layer on the Docker host at /var/lib/docker/aufs/diff.

现在,问题,

  • 假设我逐层构建我的 docker 镜像。 A < B < C < D
  • 现在,如果我更新我的 docker 镜像 A ,其余的 docker 图像 B, C, D如果在构建它们时未触及这些更改,也可以看到这些更改吗?例如,添加 /etc/apt/sources.list.d/somethingnew这是以前从未有过的。
  • 如果我层层构建另一组 docker 镜像。 A < X < Y < Z , 那么上面的变化就会反射(reflect)在X, Y, Z中也对吧?
  • 现在,如果 future 变为 A , 是对同一个文件制作的,将在构建时更改 B, C, D ,然后会发生什么?例如,让我们简化 docker images B, C, D每个只在其层中添加 pkgB、pkgC 和 pkgD。如果我将 pkgA 添加到 A 之后 B, C, D正在构建,会发生什么? -- 我想对于一个系统,应该有一个单一版本的真实信息,如包中的内容,那么对于这种情况会是什么?
  • 如果我只升级 A 中的包怎么办? ?这应该没问题吧?其余的 docker 镜像也会看到这些变化吗?

最佳答案

总的来说,每个图像都包含其父图像,或者作为嵌入字节,或者作为对本地缓存中图像的“硬”引用(如果它已经存在)。

“父”是指 FROM: someimage Dockerfile 中的指令。

我也写了“硬”,因为引用实际上是父图像的 sha246 摘要。如果 parent 的任何一点改变,摘要都会不同。

这里主要有三种情况:

  1. 您从清除缓存开始(docker image ls -a 什么也没显示)。如果你docker pull ...来自公共(public)注册表的一些图像,它将嵌入其父级。 docker ps -a应该只显示一张图片。

  2. 但是,如果您的缓存中已有父图像,则 docker pull ...不会再下载父级。在这种情况下,拉取的图像会引用缓存中的父图像。

  3. 如果您从清除缓存在本地构建,docker 将下载父图像并生成一个引用父图像的子图像。

最后还是一样的结果。如果您用较新版本替换父图像,摘要将不一样。

如果另一个图像引用了它,Docker 将不允许您删除该图像。当您将图像推送到注册表时,父图像会被嵌入(我在这里忽略了注册表端的缓存行为)。我认为您也可以使用 docker export 嵌入父级和 docker import但我没试过。例如,docker export B ,然后从您的 docker 缓存中删除 A 和 B 以及 docker import B应该只显示一张图片。

您可以使用以下方法获取实际的父关系

docker image inspect <image-id> | grep -E "Id|Parent"

结合

docker image ls -a --digests

检查关系。

更多信息。

构建图像时,会发生以下步骤:

  1. 构建上下文通过 docker 守护进程发送到主机。这基本上是您的 Dockerfile 所在目录中的所有文件。这就是为什么使用 .dockerignore 很重要的原因。仅发送在您的 Dockerfile 中复制的文件。
  2. docker 守护进程使用 Dockerfile 中的 FROM 指令创建一个临时容器。这是导入的图像,包括它自己的导入图像。然后 Dockefile 中的每条指令都在该容器内执行。当在临时容器中进行持久更改(如 COPY'ing)时,它会保存其状态。这有效地为最终图像添加了一层。
  3. 一旦完成 DOCKERFILE 指令的执行,临时容器就会被销毁。剩下的就是最终图像。

您可以使用以下命令查看图像中的所有图层 docker history <image-id>

请注意,这提供了一种调试 Dockerfile 的简便方法。您应该看到与 Dockerfile 中的持久指令相对应的层的 ID。您可以使用 docker run --rm -it <id next to layer> sh 从任何层创建一个新容器并手动执行后面的 Dockerfile 指令。

关于docker - 了解 docker 层和 future 的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174274/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com