Docker容器与内存消耗

65
假设我正在启动大量基于相同 Docker 镜像的容器。这意味着每个 Docker 容器都在运行相同的应用程序。应用程序可能足够大,并且需要大量硬盘内存。
Docker 如何处理这个问题?
所有 Docker 容器是否共享在 Docker 镜像中定义的静态部分?
如果不是,把应用程序复制到计算机上的某个目录中,并为每个 Docker 容器挂载这个应用程序目录是否有意义?
1个回答

118

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

如果您运行100个相同的docker镜像实例,您实际上只是在您的RAM中保留同一软件状态的100个不同时间线。主机处理器将每个容器实例的内存状态与控制它的软件进行移位,因此您需要消耗比运行应用程序所需的RAM内存多100倍。

容器内部没有持久性,这就是docker与使用虚拟硬盘的常规VM之间的区别。但是,这仅适用于容器内的持久性。Docker软件对硬盘上正在更改的文件使用docker卷进行“挂载”,因此它们并不真正属于docker环境,而只是挂载到其中。(有关详情请访问: https://docs.docker.com/userguide/dockervolumes/

当您考虑此问题时,另一个您可能要问的问题是,docker如何存储其在运行时对其磁盘所做的更改。真正有趣的是查看docker实际上如何使其工作。容器的硬盘的原始状态是从镜像中提供给它的。它不能向此镜像写入。与其写入镜像,会将容器内部状态中更改的内容与docker镜像中的内容进行比较,并生成一个差异(diff)。

Docker使用一种名为“Union Filesystem”的技术,在docker镜像的初始状态之上创建一个差异层(diff layer)。

这个"diff"(在下面的图像中称为可写容器)存储在内存中,当您删除容器时会消失。(除非您使用“docker commit”命令:但我不建议这样做。您新的docker镜像状态不是由dockerfile表示的,也不能轻松地从重建中重新生成)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接