Docker容器和内存消耗

时间:2014-07-11 16:18:19

标签: memory docker linux-containers

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

码头工人如何处理它?<​​/ p>

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

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

1 个答案:

答案 0 :(得分:95)

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

如果您运行同一个泊坞窗映像的100个实例,那么您真正要做的就是将相同软件的状态保存在100个不同的分隔时间轴中。主机处理器将每个容器实例的内存中状态与控制它的软件相关联,因此您需要消耗运行应用程序所需的RAM内存的100倍。 将软件的完全相同的字节代码物理存储100次是没有意义的,因为应用程序的这一部分始终是静态的,永远不会改变。 (除非你写了一些疯狂的自我修改软件,或者你选择重建和重新部署容器的图像)

这就是为什么容器不允许开箱即用的持久性,以及docker与使用虚拟硬盘的常规VM的区别。但是,这仅适用于容器内的持久性。硬盘上由docker软件更改的文件使用docker卷“安装”到容器中,因此它们实际上不是docker环境的一部分,而是安装在它们中。 (详情请见https://docs.docker.com/userguide/dockervolumes/

当您考虑这个问题时,您可能想问的另一个问题是docker如何在运行时存储对磁盘所做的更改。什么真的很好看,是docker实际上如何设法让这个工作。容器硬盘的原始状态是从映像中获取的状态。它可以写入此图像。与docker图像中的内容相比,diff不是写入图像,而是由容器内部状态的变化构成。 Docker使用一种名为“Union Filesystem”的技术,该技术在docker镜像的初始状态之上创建一个diff层。

此“diff”(在下图中标记为可写容器)存储在内存中,并在删除容器时消失。 (除非你使用“docker commit”命令,否则:我不建议这样做。新的docker镜像的状态没有在dockerfile中表示,也不能轻易地从重建中重新生成)

Union Filesystem