已停止的Docker容器的资源使用情况

30
Docker使容器停止和重启变得容易。它还可以暂停,然后恢复容器。 Docker文档说明如下:
“当容器退出时,文件系统的状态及其退出值被保留。您可以启动,停止和重新启动容器。进程从头开始重新启动(它们的内存状态未在容器中保留),但是文件系统与停止容器时完全相同。”
我通过设置一个运行memcached的容器来测试了这一点,并将一个值写入到memcache中,然后:
停止并重新启动容器- memcached值消失了 暂停并恢复容器- memcached值仍然存在
在某个地方的文档中 - 我无法再找到确切的文档 - 我读到停止的容器不会消耗CPU或内存。但是:
我认为保留文件系统状态意味着容器仍然在主机文件系统上占用一些空间?
在系统中有10秒或甚至100个已停止的容器是否会产生性能影响(除了主机磁盘空间消耗之外)?例如,Docker是否更难启动和管理新容器?
最后,如果暂停的容器在恢复时保留其内存状态 - 如其记住memcached key所示 - 它们对CPU和内存有不同的影响吗?
如果有人能够澄清这些问题,我将不胜感激。

很好的问题,我也想知道。Docker使用cgroups冻结器,因此如果您愿意花时间去理解文档,那么那里的文档应该会有所帮助。 - Usman Ismail
1个回答

22

我不是docker核心的专家,但我会尽力回答一些问题。

  1. 我认为文件系统状态被保留意味着容器仍然会在主机文件系统上占用一些空间?

是的。Docker将所有容器和镜像数据保存在/var/lib/docker中。保存容器和镜像数据的默认方式是使用aufs。每个层的数据保存在/var/lib/docker/aufs/diff下。创建新容器时,还会创建一个新层,并在其中存储源镜像层的更改。

  1. 在系统中有10秒或100秒的停止容器是否会有性能损失(除了主机磁盘空间消耗)?例如,这是否会使Docker更难启动和管理新容器?

据我所知,应该不会有任何性能损失。当您停止容器时,docker守护程序向该容器的所有进程发送SIGTERM和SIGKILL,如docker CLI文档所述:

使用方法:docker stop [OPTIONS] CONTAINER [CONTAINER...]

通过发送SIGTERM然后等待一段时间后再发送SIGKILL来停止运行中的容器

-t,--time = 10 等待容器停止的秒数,默认为10秒。


3.最后,如果Paused容器在取消暂停时保留其内存状态-如它们能够记住memcached键-它们是否会对CPU和内存产生不同的影响?

正如@Usman所说,docker使用cgroup freezer实现暂停/取消暂停。如果我没记错,当你将进程放入冷冻器(或其cgroup)中时,你会阻止内核任务调度程序执行该进程的新任务(即:它停止了进程),但你不会杀死它们并且他们继续消耗它们正在使用的内存(尽管内核可能将该内存移动到交换分区或固态磁盘)。我认为暂停容器使用的CPU资源微不足道。要了解更多信息,请查看此功能的拉取请求:Docker问题#5948


非常感谢您给出令人信服和全面的答案。我会再开放这个线程一两天并接受您的答案。 - DroidOS

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