假设我正在启动大量的docker容器,这些容器基于相同的docker镜像。这意味着每个docker容器都在运行相同的应用程序。可能的情况是,应用程序足够大,需要大量硬盘内存。
docker是如何处理它的?
是否所有的docker容器都共享docker镜像中定义的静态部分?
如果不是,那么将应用程序复制到用于运行docker容器的机器上的某个目录中,并为每个docker容器挂载此应用程序目录是否有意义?
发布于 2014-08-07 22:12:29
Docker在内核级别共享资源。这意味着应用程序逻辑在运行时永远不会复制。如果您启动记事本1000次,它仍然只在您的硬盘上存储一次,对于docker实例也是如此。
如果您运行同一docker镜像的100个实例,那么您真正要做的就是在100个不同的时间线中保持RAM中同一软件的状态。主机处理器根据控制容器实例的软件来改变每个容器实例的内存中状态,因此您确实消耗了运行应用程序所需的100倍的RAM内存。在物理上为软件存储100次完全相同的字节码是没有意义的,因为应用程序的这一部分始终是静态的,永远不会改变。(除非您编写了一些疯狂的自我修改软件,或者您选择重新构建和重新部署容器的映像)
这就是为什么容器不允许开箱即用的持久性,以及docker与使用虚拟硬盘的常规VM的区别。然而,这只适用于容器内部的持久性。由docker软件在硬盘上更改的文件使用docker卷“挂载”到容器中,因此不是docker环境的一部分,而只是挂载到容器中。(有关这方面的更多信息,请访问:https://docs.docker.com/userguide/dockervolumes/)
当你思考这个问题时,你可能想问的另一个问题是,docker如何在运行时存储对其磁盘所做的更改。真正令人欣慰的是,docker实际上是如何做到这一点的。容器硬盘的原始状态是从映像中提供给它的。它不能对该映像进行写入操作( to this image )。不是写入映像,而是将容器内部状态中的更改与docker映像中的更改进行比较。Docker使用了一种名为"Union Filesystem“的技术,它在docker镜像的初始状态之上创建了一个diff层。
此“”(在下图中称为可写容器diff)存储在内存中,并在删除容器时消失。(但是,除非您使用"docker commit“命令:我不建议这样做。新docker映像的状态不会在dockerfile中表示,并且不能轻松地从重建中重新生成)

https://stackoverflow.com/questions/24702233
复制相似问题