如何有效和更快地杀死大量docker集装箱stream程?

我们正在使用Jenkins和Docker组合..我们已经build立了像主/从模型一样的Jenkins,并且容器在slave代理中被分解了。 有时候由于jenkins docker插件中的bug,或者由于某些未知的原因,容器被遗留下来。

杀死他们都需要时间,每个容器过程大约5秒钟,我们有大约15000个。 需要24小时才能完成清理工作。 我怎样才能一次删除容器的一堆? 或有效地使它花费更less的时间?

  1. 将卸载docker客户端,删除容器?
  2. 是否有这些容器处理保持卷,可以被删除(坏主意)
  3. 任何线程/并行性,以更快地删除它们? 我将每周运行一个cron工作来修补这些bug,但是现在我没有整天去除这些bug。

尝试这个:

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

重新启动有效地停止所有的容器和卸载泊坞窗防止他们回来后重新启动。 (如果他们有restart=always设置)

所以,

 docker kill $(docker ps -a -q) 

不是你所需要的?

编辑:显然不是。 我接下来要做的是:

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

B)分区列表(也许只是把它分成n部分)。

C)平行踢n个工作,每个工作一个列表片。

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

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

如果你仅仅因为它们没有正确退出而对杀死进程感兴趣(我对你的意思的评估 – 如果我错了,就纠正我),有一种方法可以运行正在运行的容器进程并使用Pid信息从容器的元数据。 因为看起来你并不一定关心清洁过程closures在这一点(这就是为什么docker killdocker kill一个容器的时间太长 – 容器可能不会响应正确的信号,因此引擎会耐心等待,然后杀死过程),那么kill -9是一个更迅速和激烈的方式来结束这些容器和清理。

使用最新的docker发布的快速testing表明,我可以在一个相对较新的笔记本电脑上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让系统直接杀掉容器进程; 比等待引擎更快。

同样,这不是build议一般使用,因为它不允许集装箱化过程的标准(干净)退出处理,但在你的情况下,这听起来不是重要的标准。

如果这些退出的容器有剩余的容器元数据,则可以使用以下命令清除它:

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

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