我目前正在研究 Docker 是如何工作的。据我所知,Docker 不会启动,它只是在一个非常 chroot 的环境中启动一个进程。但是当我查看一些文档时,有人提到 Docker 有一个 bootfs。这是一个仅在启动时安装并在安装 rootfs 后卸载的文件系统(我猜)。但你看不到或摸不到它。我什至找不到它。
Docker 仍然使用某种 bootfs 吗?例如,这些文章让我感到困惑:http://collabnix.com/understanding-docker-container-image/。它有 bootfs,里面有内核和 cgroup。但据我所知,内核位于 Docker 之外,是主机系统的一部分。
我的主要问题是,Docker 使用 bootfs 来“启动”容器是否仍然正确?而且,我在哪里可以看到该文件系统?
答案1
我想你可能发现了一些误导性的民间传说。我在 Google 网站上搜索了“bootfs”(即站点:docker.com bootfs),几乎什么也没找到——实际上有四个结果。我搜索了这四个结果中的每一个,我将描述我的发现。
这描述了映像和容器的结构以及它们与存储驱动程序的关系。字符串“bootfs”不会出现在此页面上。就此而言,字符串“boot”也没有。
本文档从安全角度描述了Docker容器的实现。字符串“bootfs”仅出现一次 - 在图中它似乎指的是主机的引导文件系统。
在此论坛讨论中,字符串“bootfs”仅出现一次 - 再次引用主机,而不是容器。
这里,该字符串作为子字符串出现在各种包名称中。没有迹象表明它与启动 Docker 容器有关。
我还搜索了Docker CE GitHub但没有找到字符串“bootfs”的任何实例。
经过多次谷歌搜索后“docker bootfs 位置”和“docker bootfs 在哪里”我发现几个结果似乎表明 Docker bootfs 存在于容器级别的想法是用词不当。以下是一些这样的结果:
这篇博文详细描述了 Docker 启动过程,并将其与典型的启动过程区分开来。
在本期讨论中,贡献者将 bootfs 称为“你无法触及”的“概念”。
答案2
我为那些对其他答案不满意并习惯于相信书本的人保留了我的调查记录。今天,我相信 bootfs 是一个神话,或者至少是一种误导和误解。
我在 2019 年图书馆大学的一本书中读到了有关 bootfs 的内容。我联系了该书的讲师,他又联系了作者,结果发现他们的信息来自互联网,包括 stackoverflow。不幸的是,我不得不重新考虑我对书籍的信任。
我花了几个小时在 google 和 seller.google 上搜索 bootfs 到底是什么,但我几乎找不到任何信息。大多数对我来说至少有点有用的来源都将它与 docker 一起提到。
在docker的igal发布的白皮书中可以清楚地看到bootfs作为底层。 https://www.docker.com/sites/default/files/WP_Intro%20to%20container%20security_03.20.2015%20%281%29.pdf 现在,正如您可以在 docker 文档中阅读的那样,图像存储到hosts文件系统中docker 通过仅为每个容器创建一个写时复制层来利用它们。我猜 bootfs 只是意味着您启动的主机系统。
不幸的是,有些人非常确信有关 bootfs 的文章,但没有引用任何来源。因此,您可以阅读诸如 bootfs 是为每个映像创建的层等内容。
答案3
我也找不到关于 Docker 中 bootfs 存在的太多信息。然而,我发现 James Turnbull 对 The Docker Book 主题的讨论:
Docker 镜像由相互分层的文件系统组成。其基础是引导文件系统 bootfs,它类似于典型的 Linux/Unix 引导文件系统。 Docker 用户可能永远不会与启动文件系统交互。事实上,当容器启动时,它会被移动到内存中,并且卸载启动文件系统以释放 initrd 磁盘映像使用的 RAM。
到目前为止,这看起来非常像典型的 Linux 虚拟化堆栈。事实上,Docker 在启动文件系统之上又分层了一个根文件系统 rootfs。该 rootfs 可以是一个或多个操作系统(例如,Debian 或 Ubuntu 文件系统)。
https://dockerbook.com/版本:v18.09 (6172afc),第 72 页