目录
[什么是 Docker Prune?](#什么是 Docker Prune?)
[所有 Docker Prune 命令与上手示例](#所有 Docker Prune 命令与上手示例)
[docker system prune](#docker system prune)
[docker container prune](#docker container prune)
[docker image prune](#docker image prune)
[docker volume prune](#docker volume prune)
[docker network prune](#docker network prune)
[安全使用 Docker Prune](#安全使用 Docker Prune)
[Docker Prune 的最佳实践](#Docker Prune 的最佳实践)
[定期使用 docker prune](#定期使用 docker prune)
[自动化 docker prune](#自动化 docker prune)
[Docker Prune 问题排查](#Docker Prune 问题排查)
[Docker Prune 小结](#Docker Prune 小结)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。
如果您每天都在使用 Docker,就会知道它占用磁盘空间的速度有多快。
随着时间推移,系统会累积未使用的镜像、容器、卷和网络。这些大多处于闲置状态,占用宝贵的存储空间,甚至可能妨碍您开展当前项目。幸运的是,Docker 提供了内置的清理命令,可轻松移除不必要的资源。
这些清理命令属于 docker prune 命令族,今天您将全面了解它们。它们很快就会成为您释放磁盘空间的首选方案。
在进入实操示例前,我们先做个简要概览。
什么是 Docker Prune?
"Docker Prune"通常指一组用于帮助您移除未使用且不必要的 Docker 资源的命令。
随着时间推移,尤其是在多个项目间切换时,您会创建无数镜像、运行容器并设置卷与网络。所有这些都会在系统中堆积,占据大量磁盘空间。docker prune 的目的就是清理这些杂乱并回收存储空间。
话虽如此,docker prune 的门道不止表面看到的那样。
它并非只能运行一条命令。严格说也可以,但有时您需要对要删除的内容进行精细化控制。这正是本文的价值所在。它将向您展示如何有效管理清理操作,确保仅删除您打算删除的内容,并教您如何在安全环境中练习,避免误删重要数据。
另外需要注意的是,prune 命令只会移除未被活跃使用的资源。被运行中容器引用的镜像、卷和网络不会被删除。换句话说,清理不会干扰正在运行的工作负载。
下一节我们将带您了解不同类型的清理命令,并解释它们如何融入您的工作流程。
所有 Docker Prune 命令与上手示例
Docker 提供了多种 prune 命令,允许您分别或一次性清理未使用的资源。在本节中,您将通过原理与实操示例了解它们。
docker system prune
这是回收磁盘空间最全面的命令。它会在一次操作中移除所有未使用的容器、网络、镜像和构建缓存。
如果您想用一条命令快速释放磁盘空间,这就是首选。
您可以为 docker system prune 传递以下选项:
-a或--all会删除所有未使用的镜像,而不仅是悬空(即未打标签或未被任何容器引用)的镜像。--filter允许您指定过滤条件。-f或--force跳过确认提示。--volumes会在清理容器、网络、镜像和构建缓存的同时清理匿名卷。
默认情况下,docker system prune 会提示您确认,因为这可能是一次具有破坏性的操作:

图片 1 - Docker system prune 确认提示
要绕过提示,用一条命令移除所有未使用的镜像、容器、网络和卷,请运行:
docker system prune -a -f --volumes

图片 2 - 用一条 docker system prune 命令移除所有内容
但如果您需要更细粒度的控制呢?我们接着看。
docker container prune
简单来说,该命令会移除所有已停止的容器。
已停止的容器会一直留在系统中,除非手动移除。它们会占用磁盘空间,而且如果不借助Docker Desktop 仪表板之类的工具,很难一眼发现。
与 docker system prune 类似,该命令支持以下选项:
--filter允许您指定键值对来控制要移除哪些容器。-f或--force跳过确认提示。
以下是未运行容器的列表:

图片 3 - 未运行容器列表
要移除 code-server(以及其他任何已停止的容器),请运行:
docker container prune -f
不会提示您确认,几秒内您会看到如下输出:

图片 4 - 容器清理输出消息
就这样,已停止的容器不复存在:

图片 5 - 未运行容器列表(2)
现在,我们来处理未使用的镜像。
docker image prune
与上一条命令类似,docker image prune 会移除未使用的镜像。
默认情况下,它只会删除悬空镜像------即未打标签且未与任何容器关联的镜像。您可以使用可选标志来移除所有未使用的镜像,而不仅是悬空镜像。
以下是可用选项列表
-a或--all会移除所有未使用的镜像,而不仅是悬空镜像。--filter允许您指定键值对来控制要移除哪些镜像。-f或--force跳过确认提示。
现在,来看它的实际效果!
以下是系统当前的镜像列表:

图片 6 - Docker 镜像列表
要用一条命令移除全部,请运行:
docker image prune -a -f
随后,您会在终端看到类似这样的输出:

图片 7 - 镜像清理输出消息
之后,Docker Desktop 中不再有任何镜像:

图片 8 - Docker 镜像列表(2)
接下来,处理未使用的卷。
docker volume prune
顾名思义,docker volume prune 命令会移除所有未使用的本地卷。换句话说,它会删除未被任何容器引用的卷。
默认情况下,该命令只会移除匿名卷------即容器启动时 Docker 自动创建的无名卷。要移除显式命名的卷,您需要传递额外的选项。
以下是可用选项:
-a或--all会移除所有未使用的卷,而不仅仅是匿名卷。--filter允许您指定键值对来控制要移除哪些卷。-f或--force跳过确认提示。
在我们的系统上,有一个由 docker-compose.yml 文件创建的用户卷:

图片 9 - Docker 卷列表
以下命令会移除所有本地卷:
docker volume prune -a -f
运行后,您会看到类似如下的输出:

图片 10 - 卷清理输出消息
现在,不再有任何卷:

图片 11 - Docker 卷列表(2)
最后,看看如何删除未使用的网络。
docker network prune
当 Docker 容器相互通信时,通常会使用用户自定义网络。然而,一旦这些容器被移除,相关网络通常仍会留在系统中。
docker network prune 命令会移除未被任何容器使用的网络。
与其他清理命令一样,它也包含一些选项:
--filter允许您指定键值对来控制要移除哪些网络。-f或--force跳过确认提示。
与镜像、容器或卷不同,您无法通过 Docker Desktop 直观查看网络,因此需要通过命令行操作。以下是可用网络列表:

图片 12 - Docker 网络列表
要移除与 Docker 默认安装无关的所有网络,请运行:
docker network prune -a -f
执行后,您会看到如下输出:

图片 13 - 网络清理输出消息
与之前运行的容器相关联的网络现在都已删除:

图片 14 - Docker 网络列表
不过请注意,剩余的三个网络是 Docker 正常运行所必需的,无法被移除。
关于 docker prune 命令的基础用法到此结束!接下来,我们将介绍如何安全使用这些命令,以及在生产和敏感环境中的最佳实践。
安全使用 Docker Prune
docker prune 命令可帮助您快速回收磁盘空间,但必须谨慎使用,尤其是在生产环境中。
不小心删除重要的容器、镜像或卷,可能导致数据丢失并扰乱关键工作流。为防止这种情况,最好在执行任何清理命令之前,先了解将要被删除的内容。
本节将说明在安全运行 docker prune 时应采取的关键预防措施。
了解将被删除的内容
prune 命令旨在只移除未被活跃使用的资源。
例如,docker image prune 仅删除悬空镜像,而 docker volume prune 仅删除未附加到任何容器的卷。不过,添加 -a -f 等选项将会在不提示确认的情况下移除所有镜像或卷。
此外,在复杂环境中,依赖关系容易被忽视,因此在清理前反复确认始终是个好习惯。
运行任何 prune 命令之前,您应当检查系统以了解当前正在使用哪些资源。有多种方法可实现,我们将在本节介绍最常见的几种。
使用此命令查看所有容器(包括已停止的):
docker ps -a
您应会看到类似如下的输出:

图片 15 - 所有 Docker 容器列表
同样,使用此命令列出所有镜像(包括未使用的):
docker images
输出的结构与上面类似:

图片 16 - 所有 Docker 镜像列表
要检查卷,请运行此命令列出所有卷:
docker volume ls

图片 17 - 所有 Docker 卷列表
仔细审阅这些输出,确保不会误删任何关键资源。
出于安全的"演练"运行
遗憾的是,Docker 仍然没有为清理命令提供内置的"演练"(dry run)选项,尽管多年前就有人提出过需求。
因此,您必须在运行清理命令之前,使用上一节列出的命令手动检查资源。
如果您在对数据持久性要求严格的敏感环境中工作,那么在运行会影响卷的清理命令前,务必先创建备份。
当然,这些只是预防措施,但我们也希望尽快看到 dry-run 选项落地。
Docker Prune 的最佳实践
为保持 Docker 环境整洁,定期运行 prune 命令很重要------甚至可以实现自动化。
本节将带您了解在生产环境中运行 docker prune 命令的最佳实践。
定期使用 docker prune
随着时间推移,Docker 会积累未使用的镜像、已停止的容器和不必要的卷------这些都会消耗大量磁盘空间。
定期运行清理命令可以保持环境整洁,避免过度占用磁盘。您应将其纳入维护计划中。
每隔几周是不错的起点,但如果您的环境频繁创建和移除容器,建议适当缩短周期。
在生产环境中保持谨慎
在生产环境中的任何操作都需要格外谨慎,Docker 清理也不例外。
一时疏忽可能导致停机或数据丢失,而您不希望对此负责。在生产环境运行 docker prune 命令之前,请务必按上一节所述,使用 docker ps -a、docker images 和 docker volume ls 检查系统资源。
此外,建议优先使用针对性的清理命令,而不是包罗万象的 docker system prune,这样即便出现误删也更易于恢复。
自动化 docker prune
另一种好做法是通过计划任务自动化 docker prune 命令,从而简化清理工作。
在 Linux 上,您可以设置cron 任务以固定间隔运行命令;在 Windows 上,可以使用任务计划程序实现类似的自动化。这样无需人工干预即可保持系统整洁。但在生产环境中,请确保自动清理不会干扰关键工作负载。
例如,以下 Linux 上的 cron 任务会在每周日午夜运行一次包罗万象的清理命令:
0 0 * * 0 docker system prune -a -f
Docker Prune 问题排查
docker prune 命令是回收磁盘空间的常用方案,但它们并不总能确保有足够空间用于拉取新镜像或运行新容器。
此外,您也可能误删重要资源,因此讨论恢复策略至关重要。
本节将涵盖这两个话题。
遭遇磁盘空间问题
Docker 镜像可能非常大------我们最近就遇到一个超过 13GB 的镜像------相信还有更大的。因此,即使运行了 docker prune,您仍可能发现系统磁盘空间不足。
要查看镜像、容器和卷具体占用了多少空间,请运行此命令:
docker system df

图片 18 - Docker 占用的空间
在用 docker prune 命令回收磁盘空间时,添加 -a 标志以移除所有镜像、卷或容器------而不仅是悬空或匿名的。当然,请牢记这种做法可能带来的潜在弊端。
如果磁盘空间问题仍未解决,唯一的选择就是增加可用磁盘空间。
从误删中恢复
恢复起来往往说易行难------因此我们建议在运行清理命令前了解将被删除的内容。
即便如此,如果您发现自己误清理了重要的容器、镜像或卷,首先从日志入手,查明移除了哪些内容。
在 macOS 上,可以运行以下两条命令(Windows 与 Linux 的选项):
pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage containsc "docker")'
/usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"
/usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt
运行这些命令会将过去 30 分钟的 Docker 相关日志保存到 /tmp/logs.txt。您应检查这些日志,以确定删除了哪些容器或镜像。
对于被删除的镜像,通常可以从诸如 Docker Hub 等镜像仓库重新拉取。类似如下的命令即可:
docker pull <image_name>
对于被删除的容器,如果它们基于仍然存在的镜像,您也可以重新创建它们:
docker run --name <container_name> <image_name>
或者,如果有备份,您也可以通过备份进行恢复,这既可用于恢复卷数据,也可用于恢复容器数据。将来可以考虑使用卷快照工具来防止数据丢失。
不过,最佳策略仍是在运行清理命令前检查将被删除的资源,并且仅在完全确定不会影响您的工作流时再继续。
Docker Prune 小结
总之,docker prune 命令族是回收磁盘空间的强大方式,但也伴随着误删所需资源、从而导致数据丢失的风险。使用可选的 -a -f 标志时,这种风险更高,因为它们会强制删除所有内容。
尽管如此,清理仍然是保持系统整洁有序的常用方法。
您只需保持谨慎,尤其是在生产环境中。在清理前使用 docker ps -a、docker images 和 docker volume ls 等命令列出所有容器、镜像和卷。仅在确认无误并接受删除所列资源(假设它们未被运行中的容器使用)后,再运行清理命令。
参考文章:https://www.datacamp.com/zh/tutorial/docker-prune
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。