Docker容器和内存消耗
假设我启动了大量基于同一个泊坞窗图像的docker集装箱。 这意味着每个docker集装箱正在运行相同的应用程序。 可能是应用程序足够大,需要大量的硬盘驱动器内存。
docker如何处理它?
是否所有的docker容器共享docker图像中定义的静态部分?
如果不是,将应用程序复制到用于运行docker容器的计算机上的某个目录中,并为每个docker容器安装此app目录是否有意义?
Docker在内核级共享资源。 这意味着应用程序逻辑在运行时从不复制。 如果你启动记事本1000次,它仍然只存储一次在你的硬盘上,相同的计数docker实例。
如果运行同一个泊坞窗图像的100个实例,你真正要做的就是在100个不同的时间线上保持你的RAM中同一块软件的状态。 主机处理器将这些容器实例的内存中状态与控制它的软件进行切换,因此,您将消耗运行该应用程序所需的RAM内存的100倍。 在物理上存储100次完全相同的软件字节码是没有意义的,因为这部分应用程序永远是静态的,永远不会改变。 (除非你写一些疯狂的自我改变的软件,或者你select重build和重新部署你的容器的图像)
这就是容器不允许开箱即用的原因,以及docker与使用虚拟硬盘的常规虚拟机的区别。 但是,这仅仅是容器内的持久性。 由硬盘上的docker软件更改的文件使用docker卷“装载”到容器中,因此不是docker环境的一部分,而只是安装在它们中。 (阅读更多关于这个: https : //docs.docker.com/userguide/dockervolumes/ )
另外一个问题是,当你考虑这个问题的时候你可能会问,docker在运行时如何改变它的磁盘。 什么是真正的甜心检查,是docker实际上是如何设法得到这个工作。 容器硬盘的原始状态是从映像中获得的。 它不能写入这个图像。 与写入图像不同,差异是由容器内部状态的变化与泊坞窗图像中的内容相比而定。 Docker使用一种名为“ Union Filesystem ”的技术,在Docker镜像的初始状态之上创build一个diff层。
这个“diff”(在下面的图片中被称为可写容器 )被存储在内存中,当你删除你的容器时会消失。 (除非你使用命令“docker commit”,不过,我不推荐这么做,你的新的docker镜像的状态在dockerfile中没有performance出来,并且很难从重build中重新生成)