Memory Docker容器和内存消耗

Memory Docker容器和内存消耗,memory,docker,linux-containers,Memory,Docker,Linux Containers,假设我正在启动大量基于相同docker映像的docker容器。这意味着每个docker容器都运行相同的应用程序。可能是应用程序足够大,需要大量硬盘内存 docker是怎么处理的 是否所有docker容器共享docker映像中定义的静态部分 如果没有,将应用程序复制到机器上用于运行docker容器的某个目录中并为每个docker容器装载此应用程序目录是否有意义?docker在内核级别共享资源。这意味着应用程序逻辑在运行时从不被复制。如果启动记事本1000次,记事本在硬盘上仍然只存储一次,docke

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

docker是怎么处理的

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


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

docker在内核级别共享资源。这意味着应用程序逻辑在运行时从不被复制。如果启动记事本1000次,记事本在硬盘上仍然只存储一次,docker实例的计数相同

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

这就是为什么容器不允许开箱即用的持久性,以及docker与使用虚拟硬盘的普通VM的区别。但是,这仅适用于容器内的持久性。硬盘上docker软件正在更改的文件使用docker卷“装载”到容器中,因此实际上不是docker环境的一部分,而是装载到容器中。(更多信息请访问:)

考虑到这一点,您可能想问的另一个问题是docker如何在运行时存储对其磁盘所做的更改。真正让人高兴的是,docker是如何做到这一点的。容器硬盘的原始状态是映像提供给它的状态。它可以写入此图像。与写入映像不同的是,与docker映像中的内容相比,容器内部状态中更改的内容会产生差异。 Docker使用一种称为“”的技术,在Docker图像的初始状态上创建一个差异层

这个“diff”(在下图中被称为可写容器)存储在内存中,在删除容器时消失。(除非您使用“docker commit”命令,否则:我不建议这样做。docker文件中不表示新docker映像的状态,并且无法从重建中轻松重新生成)