我读过有关 Docker 的分层文件系统的文章。我不明白它最终如何与存储设备交互。我的理解是文件系统管理存储设备的分区。Docker 是否会为您在底层设备上运行的每个容器创建一个新分区,并将分层文件系统安装到该分区上?
抱歉,我甚至无法清楚地表达这个问题。
答案1
帖子 Docker 与虚拟机有何不同? 包含一些很好的答案。
一个 Ken Cochrane 的回答 说:
Docker 最初使用Linux 容器(LXC),但后来改用 runC(以前称为 libcontainer),它与主机在同一个操作系统中运行。这使它能够共享大量主机操作系统资源。此外,它使用分层文件系统(金沙澳门官网) 并管理网络。
AuFS 是一个分层文件系统,因此您可以将只读部分和写入部分合并在一起。您可以将操作系统的公共部分设为只读(并在所有容器之间共享),然后为每个容器提供自己的写入挂载。
其他 L0j1k 的回答 更详细地解释分层:
对于每个容器进程使用的文件系统,Docker 使用联合金融服务支持的图像,这是您在执行 时下载的内容
docker pull ubuntu
。每个“镜像”只是一系列层和相关元数据。分层的概念在这里非常重要。每一层都只是其下一层的变化。例如,当您在构建 Docker 容器时删除 Dockerfile 中的文件时,您实际上只是在最后一层之上创建了一个层,上面写着“此文件已被删除”。
顺便说一句,这就是为什么您可以从文件系统中删除一个大文件,但映像仍会占用相同数量的磁盘空间。文件仍在那里,位于当前文件下面的层中。层本身只是文件的 tarball。
您可以使用 和
docker save --output /tmp/ubuntu.tar ubuntu
来测试这一点cd /tmp && tar xvf ubuntu.tar
。然后您可以四处看看。所有看起来像长哈希的目录实际上都是单独的层。每个层都包含文件 (layer.tar
) 和元数据 (json
),其中包含有关该特定层的信息。这些层仅描述对文件系统的更改,这些更改保存为“位于其原始状态之上”的一层。读取“当前”数据时,文件系统读取数据时就好像只查看更改的最顶层一样。这就是为什么文件似乎已被删除,即使它仍存在于“先前”层中,因为文件系统只查看最顶层。
这样,即使每个容器最顶层的文件系统可能发生了重大变化,完全不同的容器也可以共享它们的文件系统层。当您的容器共享其基本映像层时,这可以为您节省大量磁盘空间。但是,当您通过卷将目录和文件从主机系统挂载到容器中时,这些卷会“绕过”UnionFS,因此更改不会存储在层中。