【问题标题】:Layered file systems and volume mounts分层文件系统和卷挂载
【发布时间】:2016-09-02 11:32:19
【问题描述】:

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

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

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

另外假设我将 NFS 共享挂载到所有容器,容器中的任何应用程序/进程只会将应用程序数据、日志等写入挂载的 nfs 共享,因此容器内似乎没有发生写入.挂载点是 /var/www/html 我的磁盘使用情况如何?

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

我怎么理解这个?

【问题讨论】:

    标签: linux docker containers lxc


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢。因此,使用网络文件服务器进行写入,我可以在我的机器上运行无限的容器?
    • 无限制,只要您对每个进程都有无限的内存。文件句柄和网络地址空间会有一些理论上的限制,但在达到这些限制之前,您会耗尽内存或 CPU 容量。
    • 似乎好得令人难以置信:-)。谢谢。应用 A 和 B 是不同的图像,因此总大小为 900mb。
    猜你喜欢
    • 2019-05-11
    • 2019-07-22
    • 2020-03-19
    • 2015-03-03
    • 2019-08-23
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多