分层文件系统和卷挂载

Layered file systems and volume mounts

我无法理解使用卷进行存储将如何影响我的磁盘 space 使用。

我有图像 A,它是一个基本图像,带有我的应用程序需要的许多实用程序。我有应用程序 B 和 C,它们是从基本图像 A 构建的图像。它们为 运行 我的两个不同应用程序安装了不同的语言。图片 A 为 300MB,B 和 C 各为 300MB。

如果我创建 10 个应用程序 A 和 B 实例,将使用多少磁盘 space?

还假设我正在将一个 NFS 共享挂载到所有容器,容器内的任何 apps/processes 只会将应用程序数据、日志等写入挂载的 nfs 共享,因此看起来没有写入发生放在容器内。挂载点是 /var/www/html 我的磁盘使用情况如何?

据我目前了解,在第一种情况下,我的磁盘使用量将是(基本图像 300mb + 在其上构建的两个应用程序图像 600mb,因此 900mb。我假设基本图像将被共享. 如果从应用程序图像 B 和 C 创建任何容器,并且它们在被清除之前每个写入 100mb 数据。那么我的总磁盘使用量将是 900mb + 100mb(写入磁盘的净数据)* 容器数?

我怎么理解这个?

分层文件系统将重用父镜像中的层,因此如果镜像 A 为 300MB,应用程序 B 和 C 各为 300MB,那么实际上这些应用程序容器将添加近 0 个磁盘 space,重用父图像的全部内容。由于所有数据都存储在外部并且没有写入容器的本地 RW 文件系统,因此您可以根据需要启动任意数量的这些数据,并且只使用 300MB 的磁盘。

如果这些应用中的每一个实际上都增加了 300MB,并且这 300MB 与父容器和其他应用容器不同(docker 使用缓存可以允许每个应用如果它们 运行 相同的命令,则容器可以从另一个容器中重用),那么你最终会看到每个图像显示为 600MB,而实际使用的磁盘将是 900MB,父级为 300MB,每个应用程序图像为 300MB。

在容器将文件写入本地卷或容器的 RW 层之前,启动每个容器不会添加到已用磁盘 space。

理解这一点进入分层文件系统设计。图像可能由多个层组成,每个层都创建一次并可以被其他图像重复使用,所有内容都存储为对哈希的引用,只有当没有更多对哈希的引用时才会 docker 删除它docker rmi.

当你把一个图像变成一个容器时(使用 docker run 甚至 docker create),图像内容被安装为只读层,容器的 RW 层安装在顶部,以及安装在分层文件系统顶部的任何卷。卷外的读取会穿过这些层,直到它到达文件所在的层(或对文件进行的一些其他修改,例如删除)。因此,如果文件未被修改,它会从其中一个图像层读取,但如果您在 RW 层中创建它,您的读取将把它拉回来。这导致图像的概念是不可变的,而每个容器都可以在容器的生命周期内存储自己的更改。您可以在容器上 运行 a docker diff 对其 RW 层进行哪些更改。此差异是您在构建的每个步骤或 docker commit.

上存储到图像层中的内容