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

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

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


当前回答

移除所有容器:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

解释:

sudo docker ps -a

返回一个容器列表。

awk '{print $1}'

获取容器ID的第一列。

grep -v CONTAINER

删除标题。

最后一个管道将id安全地发送到sudo docker rm -f。

其他回答

移除所有容器:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

解释:

sudo docker ps -a

返回一个容器列表。

awk '{print $1}'

获取容器ID的第一列。

grep -v CONTAINER

删除标题。

最后一个管道将id安全地发送到sudo docker rm -f。

移除所有停止使用的容器:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

来自pauk960的评论:

从1.3.0版本开始,你可以使用docker ps过滤器,而不是grep Exited使用docker ps -a -f status= Exited。如果你使用-q,你只能得到容器id,而不是完整的输出,不需要使用awk。

如果你不喜欢删除所有的容器,你可以用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进程: Docker rm $(Docker ps -a -q) 移除特定容器: $ docker ps -a列出所有旧容器 $ docker rm container-Id

因此,我个人建议将此作为映像和容器的部署脚本的一部分,只保留最近的n个容器和映像。我用与git标签相同的版本控制模式标记Docker映像,并且总是用“latest”标记最新的Docker映像。这意味着在没有清理任何东西的情况下,我的Docker映像最终看起来像这样:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

现在,当然我不想让我所有的图像(或容器)在我所有的生产盒上永久保存。我只需要最后的3或4个回滚来去掉其他的东西。尤尼克斯的尾巴是你最好的朋友。由于docker images和docker ps都是按日期排序的,我们可以使用tail选择除前三个之外的所有图像并删除它们:

docker rmi $(docker images -q | tail -n +4)

将其与部署脚本一起运行(或在本地运行),以始终保留足够的映像,以便能够轻松地回滚,而不会占用太多空间或将旧映像弄得乱七八糟。

就我个人而言,我只在我的生产盒上保留一个容器,但如果你想要更多的容器,你可以对容器做同样的事情:

docker rm $(docker ps -aq | tail -n +4)

最后,在我的简化示例中,我们一次只处理一个存储库,但是如果您有更多的存储库,您可以使用相同的思想来变得更复杂一些。假设我只想保留some_repo/some_image中的最后三张图像。我只需要混合grep和awk就可以了:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

同样,同样的想法也适用于容器,但到这里你已经明白了,所以我就不举例子了。