如何高效、快速地杀死大量docker容器进程



我们将Jenkins和Docker结合使用。我们已经建立了詹金斯式的主/从模型,并且容器在从属代理中旋转。有时由于jenkins docker插件中的错误或一些未知的原因,容器会悬空。

杀死它们需要时间,每个容器处理大约5秒,我们有大约15000个。完成清理作业将需要~24小时。我怎样才能一次把这些集装箱一捆捆地取出来呢?或者更有效,这样可以节省时间?

  1. 卸载docker客户端会移除容器吗?
  2. 是否存在这些容器进程保存的卷,可以删除(坏主意)
  3. 任何线程/并行来更快地删除它们?我打算每周运行一次cron作业来修补这些错误,但是现在我没有一整天的时间来删除这些错误。

试试这个:

  1. 卸载docker-engine
  2. 重启主机
  3. rm /var/lib/docker

重启会有效地停止所有的容器,卸载docker会阻止它们在重启后回来。(如果他们有restart=always设置)

如果您对仅杀死进程感兴趣,因为它们没有正确退出(我对您的意思的评估-如果我错了请纠正我),有一种方法可以步行运行的容器进程并使用来自容器元数据的Pid信息杀死它们。在这一点上,似乎你不一定关心干净的进程关闭(这就是为什么docker kill每个容器需要这么长时间——容器可能不响应正确的信号,因此引擎耐心等待,然后杀死进程),然后kill -9是一个更迅速和激烈的方式来结束这些容器和清理。

使用最新docker版本的快速测试显示,在一台相对较现代的笔记本电脑上,我可以在11.5秒内杀死~100个容器:

$ time docker ps --no-trunc --format '{{.ID}}' | xargs -n 1 docker inspect --format '{{.State.Pid}}' $1 | xargs -n 1 sudo kill -9
real    0m11.584s
user    0m2.844s
sys     0m0.436s

对正在发生的事情的清楚解释:

  1. 我要求docker引擎提供所有运行容器(docker ps)的"完整容器ID"列表
  2. 我通过docker inspect一个接一个地传递,要求只输出进程ID (.State.Pid),其中
  3. 然后将
  4. 传递给kill -9,让系统直接杀死容器进程;比等待引擎更快。

同样,不建议一般使用,因为它不允许对容器化过程进行标准(干净)退出处理,但在您的情况下,听起来这不是重要的标准。

如果这些退出的容器有剩余的容器元数据,可以使用:

docker rm $(docker ps -q -a --filter status=exited)

这将从引擎的元数据存储(/var/lib/docker内容)中删除所有退出的容器,并且每个容器应该相对较快。

所以,

docker kill $(docker ps -a -q)

不是你需要的吗?

编辑:显然不是。我的下一个想法是:

A)以某种方式创建一个要停止的所有容器的列表。

B)划分该列表(也许只是将其分割成n部分)。

C)并行的n个作业,每个作业都在其中一个列表片上工作。

D)希望"docker"足够健壮,可以处理n个进程并发发送n kill请求。

E)如果这真的有效:也许可以开始试验以确定n的最佳设置。

最新更新