清理废弃/无关/陈旧容器

在使用Docker的过程中,我们可能会创建许多无关的容器和镜像,这些容器和镜像占用了磁盘空间,并可能导致系统变慢。因此,及时清理这些无关的容器和镜像是非常必要的。
本文将介绍如何使用Docker命令行工具清理无关的容器和镜像。

清理废弃/无关容器

为了清理无关的容器,您可以使用以下命令对容器进行过滤。过滤标志的格式采用key=value对的形式。如果有多个过滤器,则传递多个标志(例如,–filter “foo=bar” --filter “bif=baz”)。
以过滤“在某个容器之前创建的容器”为例:

docker ps -f before=<container_id> -a -q
# e.g. docker ps -f before=hopeful_mclaren -a -q

# 传统方法
docker ps -a | grep '<container_id>' | awk '{print $1}' | xargs docker rm

其中,<container_id>是一个现有容器的ID,这个命令将列出所有在该容器创建之前创建的所有容器的ID(即-q参数)。
然后,可以使用以下命令删除这些容器:

docker rm $(docker ps -f before=<container_id> -a -q)
# e.g. docker rm $(docker ps -f before=hopeful_mclaren -a -q)

更多过滤器

相同的思路,可以参考如下表格修改命令:

Filter Description
id 容器的ID
name 容器的名称
label 表示键或键值对的任意字符串。表示为<key>key=value
exited 表示容器的退出代码的整数。仅在使用--all时有用
status 创建、重新启动、运行、删除、暂停、已退出或已死亡中的一种状态
ancestor 过滤共享给定镜像作为祖先的容器。表示为<image-name>[:<tag>],或<image id><image@digest>
before或since 过滤在给定容器ID或名称之前或之后创建的容器
volume 过滤已挂载给定卷或绑定挂载的正在运行的容器
network 过滤连接到给定网络的正在运行的容器
publish或expose 过滤发布或公开给定端口的容器。表示为<port>[/<proto>]<startport-endport>/[<proto>]
health 根据其健康检查状态过滤容器。其中之一为startinghealthyunhealthynone
isolation 仅适用于Windows守护程序。为defaultprocesshyperv其中之一。
is-task 过滤作为服务的“任务”的容器。布尔选项(truefalse

以下将给出更多样例,key=value的外围双引号可加可不加:

# name
docker ps --filter 'name=nodemanager'

# exited signal
docker ps -a --filter 'exited=0'
docker ps -a --filter 'exited=137'

# status 
docker ps --filter 'status=running'
docker ps --filter 'status=paused'

# ancestor
# 支持的样式有如下,但似乎image格式不太正确,可能版本问题
  # image
  # image:tag
  # image:tag@digst
  # short-id
  # full-id
docker ps --filter 'ancestor=ubuntu'
docker ps -a --filter 'ancestor=mysql:8.0'

清理废弃/无关/悬空镜像

要清理无关的镜像,可以使用以下命令:

docker images -a -f before=<image_id> -q

其中,<image_id>是一个现有镜像的ID,这个命令将列出所有在该镜像创建之前创建的所有镜像的ID。
然后,可以使用以下命令删除这些镜像:

docker rmi $(docker images -a -f before=<image_id> -q)

利用上一节所介绍的过滤器,你可以设计出类似的命令来达成你的目标。

删除悬空的镜像

dangling 一词译作“悬空”,表示未加标签的镜像(untagged images),即docker images 输出的内容中REPOSITORY和TAG列为:的镜像。悬空镜像通常出现在构建新镜像时使用了已用的标签时,Docker会移除旧镜像上的标签然后将该标签标在新的镜像之上。
dangling是一个特有的过滤器,可以使用如下命令测试:

docker images -a --filter "dangling=false"
docker images -a

通过对比结果,可以发现<none>:<none>镜像是不会被显示的。但是,如果将dangling参数的值设置为true,则可以查看所有悬空的镜像。
请注意,这些命令将永久删除容器和镜像,并且删除后将无法恢复。在运行这些命令之前,请确保您已经备份了需要保留的数据和镜像。

猜你喜欢

转载自blog.csdn.net/bigbaojian/article/details/130048715