如何高效删除 Docker 镜像、容器和卷?

Docker 让您可以轻松地将应用和服务打包到容器中,使其具备可移植性并易于部署。然而,随着您持续使用 Docker,系统中往往会积累大量未使用的镜像、容器和卷。它们会让环境变得杂乱,并占用宝贵的磁盘空间。

幸运的是,Docker 内置了多种工具,帮助您直接通过命令行管理和清理系统。

在本指南中,我们将带您了解如何删除 Docker 镜像,以及容器和卷等其他未使用的资源。按照文中的步骤操作,您将学会如何有效清理 Docker 环境、回收宝贵的磁盘空间,并保持系统井然有序。

如何删除 Docker 镜像、容器、卷和网络?(分步指南)

Docker 提供了一条命令,可以删除所有未打标签或未与任何容器关联的 Docker 镜像及其他资源,包括容器、卷和网络。

docker system prune

上述命令会清理未使用的 Docker 资源,删除已停止的 Docker 容器、悬空镜像、未使用的卷以及未连接到任何容器的网络。默认情况下,它只会删除可以安全移除的资源。添加 --all 标志后,将删除所有未使用的镜像,而不仅仅是悬空镜像。

要删除当前未运行的 Docker 容器以及所有未使用的镜像(包括非悬空镜像),请在命令中加上 -a 标志。

docker system prune -a

删除 Docker 镜像

要删除特定镜像,首先使用带 -a 标志的 docker images 命令。它会显示所有镜像,包括中间层,便于您确定要删除的镜像 ID。

docker images -a

确定目标镜像后,将其 ID 或标签传给 docker rmi 命令即可删除。

docker rmi Image Image

删除悬空的 Docker 镜像

Docker 镜像由多个层组成,悬空镜像是指未与任何已打标签镜像关联的层。这些层是不必要的,并且会占用磁盘空间。

如果您在构建镜像时没有指定标签,它就会显示为悬空镜像,因为它没有与任何已打标签的镜像关联。为避免这种情况,请在构建镜像时始终指定标签。或者,您也可以稍后使用 docker tag 命令为现有镜像添加标签。

您可以使用带 -f 标志的 docker images 命令,并将值设置为 dangling=true 来查找这些镜像。确认要删除后,使用 docker image prune 命令删除悬空镜像。

docker images -f dangling=true

现在,您可以使用以下命令删除这些镜像:

docker image prune

删除所有镜像

您可以使用带 -a 标志的 docker images 命令列出系统中的所有 Docker 镜像。

docker images -a

决定删除后,添加 -q 标志以仅显示镜像 ID,然后将其传给 docker rmi 命令进行删除。

docker rmi $(docker images -a -q)

按特定模式删除镜像

要按特定模式删除镜像,可以将 docker images 命令与 grep 结合使用来筛选镜像。

docker images -a | grep "pattern"

确定镜像后,使用 awk 提取其 ID,并将其传给 docker rmi 命令进行删除。请注意,这些工具并非 Docker 内置,可能并非在所有系统上都可用。

docker images -a | grep "pattern" | awk '{print $1":"$2}' | xargs docker rmi

删除 Docker 容器

要删除特定容器,请使用带 -a 标志的 docker ps 命令列出所有容器。

docker ps -a

上述命令可以帮助您找到要删除的容器的名称或 ID。在删除之前,先查看容器内部的内容可能会很有用,您可以使用 docker exec 打开交互式 shell 来查看。如果您确定要删除某个容器,可以使用以下命令:

docker rm ID_or_Name ID_or_Name

在容器退出后自动删除

要在容器退出后自动将其删除,可以在创建容器时使用 docker run --rm 命令。这样可以确保容器在运行结束后立即被删除。

docker run --rm image_name

删除所有已退出的容器

要查找容器,请使用 docker ps -a 命令,它会显示所有容器,无论其状态为 created、restarting、running、paused 还是 exited。如需只关注已退出的容器,请使用 -f 标志按状态进行筛选。

docker ps -a -f status=exited

确认要删除的容器后,使用 -q 标志获取其 ID,并将其传给 docker rm 命令进行删除。

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

按模式删除容器

您可以将 docker ps 命令与 grep 结合使用,找出与特定模式匹配的容器。

docker ps -a | grep "pattern"

筛选出要删除的容器后,使用 awk 和 xargs 将其 ID 传给 docker rm 命令。请注意,这些工具并不属于 Docker,可能并非在所有系统上都可用。

docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm

使用多个筛选条件删除容器

在 Docker 中,您可以多次使用筛选标志并为每次指定不同的值,从而应用多个筛选条件。这样可以列出满足任一指定条件的容器。例如,要删除所有处于“created”状态(使用无效命令启动容器时可能出现这种状态)或已退出的容器,可以使用两个独立的筛选条件。

docker ps -a -f status=exited -f status=created

要删除这些容器,请使用以下命令:

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

停止并删除所有容器

要查看系统中的所有容器,请使用 docker ps 命令。添加 -a 标志后,可以看到包括已停止容器在内的所有容器。

docker ps -a

准备删除时,使用 -q 标志获取容器 ID,并将其传给 docker stop 和 docker rm 命令,以停止并删除这些容器。

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

删除 Docker 卷

要查找要删除的卷名称,请使用 docker volume ls 命令。

docker volume ls

确定卷之后,可以使用 docker volume rm 命令删除一个或多个卷。

docker volume rm volume_name volume_name

删除 Docker 容器及其卷

如果您创建容器时使用了未命名卷,可以通过 -v 标志同时删除容器和卷。这仅适用于未命名卷。

docker rm -v container_name

容器被删除后,会显示其 ID,但不会直接提示卷已被删除。如果卷是未命名的,它会被悄无声息地从系统中删除;但如果卷是已命名的,它将保留在系统中而不会被删除。

删除悬空的 Docker 卷

卷被设计为独立于容器而存在,因此删除容器时,其关联的卷不会被自动删除。如果某个卷不再挂载到任何容器上,它就会成为悬空卷。

要找出这些卷,请使用带筛选条件的 docker volume ls 命令,只显示悬空卷。

docker volume ls -f dangling=true

确认列表后,您可以使用 docker volume prune 命令一次性将它们全部删除。

docker volume prune

结论

本指南重点介绍了删除 Docker 镜像、容器和卷的一些关键命令。针对不同的使用场景,每条命令还有许多其他选项和标志可供使用。如需详细了解 docker system prune、docker rmi、docker rm 和 docker volume rm 等命令,请查阅 Docker 文档。如果您希望我们介绍其他常见的清理任务,欢迎在评论中提出建议。

正在为您的项目寻找可靠的性能和可扩展的方案吗?了解 BlueVPS:我们提供简单、可定制的专属环境,不限流量,具备出色的云端可用性。不要犹豫,立即了解并提升您的 VPS 性能!

blog