如何有效,快速地杀死大量的docker容器进程?

时间:2016-09-06 15:37:54

标签: jenkins docker jenkins-docker

我们正在组合使用Jenkins和Docker ..我们已经设置了Jenkins,就像主/从模型一样,容器在slave代理中运行。 有时由于jenkins docker插件中的错误或由于某些未知原因,容器悬空。

杀死它们都需要时间,每个容器过程大约需要5秒钟,我们大约有15000个。将需要~24小时才能完成清理工作。如何一次性取出一堆容器?或有效地减少时间?

  1. 将卸载docker客户端,删除容器吗?
  2. 这些容器处理过程中是否存在可以删除的卷(不好主意)
  3. 任何线程/并行性更快删除它们? 我将每周运行一个cron作业来修补这些错误,但是现在我没有一整天的时间来删除这些错误。

3 个答案:

答案 0 :(得分:3)

试试这个:

  1. 卸载docker-engine
  2. 重新启动主机
  3. rm /var/lib/docker
  4. 重新启动会有效地停止所有容器,并且卸载docker会阻止它们在重新启动时返回。 (如果他们设置restart=always

答案 1 :(得分:1)

所以,

docker kill $(docker ps -a -q)

不是你需要的?

编辑:显然不是。我的下一个当时:

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

B)列出的分区(可能只是将其切成 n 部分)。

C)并行启动 n 作业,每个作业都使用其中一个列表切片。

D)希望“docker”足够强大,能够处理并行发送 n kill请求的n个进程。

E)如果确实有效:可能会开始尝试确定 n 的最佳设置。

答案 2 :(得分:1)

如果你有兴趣只杀死进程,因为它们没有正常退出(我对你的意思进行评估 - 如果我错了就纠正我),有办法走过正在运行的容器进程并杀死他们使用容器元数据中的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引擎只提供一个"完整的容器ID"所有正在运行的容器的列表(docker ps
  2. 我一个接一个地通过docker inspect,要求只输出进程ID(.State.Pid),
  3. 然后我转到kill -9让系统直接杀死容器进程;比等待发动机快得多。
  4. 同样,这不建议用于一般用途,因为它不允许对容器化过程进行标准(清洁)退出处理,但在您的情况下,听起来这不是重要标准。

    如果这些已退出的容器有剩余的容器元数据,您可以使用以下方法清除它:

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

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

相关问题