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

Docker可以很容易地停止和重启容器。 它也有能力暂停然后取消暂停容器。 Docker文档状态

当容器退出时,文件系统的状态及其退出值将被保留。 您可以启动,停止并重新启动一个容器。 进程从头开始重新启动(它们的内存状态不保存在容器中),但文件系统与容器停止时的情况一样。

我通过build立一个运行memcached的容器来testing这个,写了一个值给memcache然后

  • 停止然后重新启动容器 – memcached值已经消失
  • 暂停并取消暂停容器 – memcached值仍然保持不变

在文档的某个地方 – 我再也找不到精确的文档 – 我读了停止的容器不占用CPU或内存。 然而:

  • 我猜想文件系统状态被保留的事实意味着容器仍然在主机的文件系统上占用一些空间?
  • 在系统中有10秒甚至100秒的停止容器时,是否有性能下降(主机磁盘空间消耗除外)? 例如,它是否使得Docker更难启动和pipe理新的容器?
  • 最后,如果Paused容器在Unpaused时保留其内存状态(如记忆memcached密钥的能力所示),它们对CPU和内存有不同的影响吗?

对于任何可能澄清这些问题的人来说,我都非常感激。

我不是docker核心的专家,​​但我会尝试回答一些这些问题。

  1. 我猜想文件系统状态被保留的事实意味着容器仍然在主机的文件系统上占用一些空间?

是。 Docker将所有容器和图像数据保存在/var/lib/docker 。 保存容器和图像数据的默认方法是使用aufs。 每层的数据保存在/var/lib/docker/aufs/diff 。 当一个新的容器被创build时,一个新的图层也被创build,并且在那里存储来自源图像的图层的改变。

  1. 在系统中有10秒甚至100秒的停止容器时,是否有性能下降(主机磁盘空间消耗除外)? 例如,它是否使得Docker更难启动和pipe理新的容器?

据我所知,这不应该是任何表演打击。 当停止一个容器时,docker守护进程发送SIGTERM和SIGKILL到该容器的所有进程,如docker CLI文档中所述 :

用法:docker停止[选项]集装箱[集装箱…]

在宽限期之后,通过发送SIGTERM和SIGKILL来停止正在运行的容器

-t,–time = 10在杀死容器之前等待容器停止的秒数。 默认是10秒。


3.最后,如果暂停容器保留其内存状态(如其记忆memcached密钥的能力所示),是否对CPU和内存有不同的影响?

正如@Usman所说,docker使用cgroup冷冻机实现暂停/取消暂停。 如果我没有错,当你把一个进程放在冰箱(或者它的cgroup)中时,你会阻止从内核任务调度器执行这个进程的新任务(即:停止进程),但是你不杀了他们,他们继续消耗他们正在使用的内存(虽然内核可能会移动内存交换或固体磁盘)。 而暂停容器使用的CPU资源我认为是微不足道的。 有关这方面的更多信息,我将检查此function的请求, Docker问题#5948