在使用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 | 根据其健康检查状态过滤容器。其中之一为starting 、healthy 、unhealthy 或none 。 |
isolation | 仅适用于Windows守护程序。为default 、process 或hyperv 其中之一。 |
is-task | 过滤作为服务的“任务”的容器。布尔选项(true 或false ) |
以下将给出更多样例,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,则可以查看所有悬空的镜像。
请注意,这些命令将永久删除容器和镜像,并且删除后将无法恢复。在运行这些命令之前,请确保您已经备份了需要保留的数据和镜像。