这个问题与我是否应该关注过量的、未运行的Docker容器有关。

我想知道如何移除旧容器。docker rm 3e552code34a允许你删除一个,但我已经有很多了。Docker rm——help没有提供选择选项(像all一样,或者通过映像名称)。

也许有一个存放这些容器的目录,我可以很容易地手动删除它们?


当前回答

对于感兴趣的人,我从qkrijger中取了一个例子,并将其转换为clear all(停止并删除所有)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`

其他回答

在Ubuntu 14.04 (Trusty Tahr)上:

$ for CON in `docker ps -qa`; do docker rm $CON ; done

这只是一个普通的Bash命令,所以它应该适用于每个Bash兼容的终端。

如果你不喜欢删除所有的容器,你可以用docker ps -f before=<container- id >或用docker ps -f since=<container- id >选择在特定容器之前或之后创建的所有容器

假设您已经开发了您的系统,现在它正在工作,但是还剩下一些容器。您希望删除在该工作版本之前创建的容器。使用docker ps确定工作容器的ID。

删除在其他容器之前创建的容器

docker rm $(docker ps -f before=9c49c11c8d21 -q)

另一个例子。您已经在Docker容器上运行了数据库。您已经开发了在另一个容器上运行的应用程序,现在您有许多不需要的容器。

删除在某个容器之后创建的容器

docker rm $(docker ps -f since=a6ca4661ec7f -q)

Docker将容器存储在Ubuntu中的/var/lib/docker/containers中。我认为额外的容器没有其他危害,但会占用磁盘空间。

从Docker 1.13开始。x你可以使用Docker容器修剪:

docker container prune

这将删除所有停止的容器,并且应该在所有平台上以相同的方式工作。

还有一个Docker系统修剪:

docker system prune

它将在一个命令中清理所有未使用的容器、网络、映像(悬空和未引用),以及可选的卷。


对于较旧的Docker版本,您可以将Docker命令与其他Unix命令串在一起以获得所需的内容。下面是一个关于如何清理几个星期前的旧容器的例子:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

为了表示感谢,这个例子来自https://twitter.com/jpetazzo/status/347431091415703552。

我使用以下的变体:

docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1

第一部分列出了所有进程。

第二种选择的是“cassandra”后面跟着“Exited”。

第三个方法是删除图像ID之后的所有测试,这样就得到了一个图像ID列表。

So,

docker rm $(docker ps -a | grep 'cassandra.*Exited' | cut -d " " -f 1)

Bash的这两行代码会在删除容器之前通过一些关键字来过滤它们:

containers_to_keep=$(docker ps -a | grep 'keep\|Up\|registry:latest\|nexus' | awk '{ print $1 }')
containers_to_delete=$(docker ps -a | grep Exited | grep -Fv "$containers_to_keep" | awk '{ print $1 }')
docker rm $containers_to_delete

来自这篇文章。