64

假设我正在启动大量基于相同 docker 映像的 docker 容器。这意味着每个 docker 容器都在运行相同的应用程序。可能是应用程序足够大并且需要大量硬盘内存。

码头工人如何处理它?

所有 docker 容器是否共享 docker 映像中定义的静态部分?

如果不是,将应用程序复制到机器上用于运行 docker 容器并为每个 docker 容器挂载此应用程序目录的某个目录是否有意义?

4

1 回答 1

115

Docker 在内核级别共享资源。这意味着应用程序逻辑在运行时永远不会被复制。如果您启动记事本 1000 次,它仍然只在硬盘上存储一次,对于 docker 实例也是如此。

如果您运行 100 个同一个 docker 映像的实例,您真正要做的就是在 100 个不同的独立时间线中保持 RAM 中同一软件的状态。主机处理器将每个容器实例的内存状态转移到控制它的软件,因此您确实消耗了运行应用程序所需的 RAM 内存的 100 倍。为软件物理存储完全相同的字节码 100 次是没有意义的,因为应用程序的这一部分始终是静态的并且永远不会改变。(除非您编写了一些疯狂的自我更改软件,或者您选择重建和重新部署容器的映像)

这就是为什么容器不允许开箱即用的持久性,以及 docker 与使用虚拟硬盘的常规 VM 的不同之处。但是,这仅适用于容器内部的持久性。硬盘上的 docker 软件正在更改的文件使用 docker 卷“挂载”到容器中,因此实际上并不是 docker 环境的一部分,而只是挂载到其中。(在此了解更多信息:https ://docs.docker.com/userguide/dockervolumes/ )

当您考虑这一点时,您可能想问的另一个问题是 docker 如何存储它在运行时对其磁盘所做的更改。真正值得一看的是 docker 是如何让这个工作的。容器硬盘的原始状态是镜像赋予它的。它不能写入此图像。与 docker 镜像中的内容相比,容器内部状态的变化不是写入镜像,而是由容器内部状态的变化构成。Docker 使用了一种名为“ Union Filesystem ”的技术,它在 docker 镜像的初始状态之上创建了一个差异层。

此“差异”(在下图中称为可写容器)存储在内存中,并在您删除容器时消失。(除非您使用命令“docker commit”,但是:我不建议这样做。新 docker 映像的状态不会在 dockerfile 中表示,并且不能轻易地从重建中重新生成)

联合文件系统

于 2014-08-07T14:12:28.960 回答