Docker容器和内存消耗

Mic*_*nki 56 memory docker linux-containers

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

码头工人如何处理它?

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

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

Roy*_*oyB 104

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

如果您运行相同docker镜像的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中表示,并且无法从重建中轻松重新生成)

联盟文件系统