Docker Prune:完整指南与上手示例

目录

[什么是 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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
ynchyong1 小时前
linux中的 sed` 与 `seq`
linux·运维·sed·seq·文本工具
乌恩大侠3 小时前
Supermicro 发布六款 NVIDIA ARC 服务器:从 1U 边缘基站到 4U 八卡 AI-RAN 平台,全面对比
运维·服务器·人工智能
谢白羽4 小时前
从传统运维到 AI Infra: K8s 上调度 100 张 GPU踩坑笔记
运维·人工智能·缓存·kubernetes·vllm·sglang·vllm-omni
ai_coder_ai4 小时前
使用Web IDE边写自动化脚本
运维·前端·自动化
wacsii4 小时前
【Linux基础开发工具(五)】Git版本控制器从入门到实战:核心操作三板斧与新手避坑指南
linux·运维·服务器
zhongben123_4 小时前
从零开发一个打车APP:技术选型、系统架构与成本评估指南
大数据·运维·ios·系统架构·uni-app·web app
FII工业富联科技服务4 小时前
服务器开始按柜交付 数据中心需要具备怎样的承接能力
大数据·运维·服务器·人工智能·自动化·制造
死磕音视频4 小时前
Dify 入门:用 Docker 自部署并搭建知识库问答助手
docker·知识库·dify·大模型应用
李迟4 小时前
Nginx容器绑定81端口报拒绝访问错误的解决
运维·nginx