如果您每天都在使用 Docker,您就会知道它有多快地占用磁盘空间。
随着时间的推移,您的系统会积累未使用的镜像、容器、卷和网络。这些资源大多处于空闲状态,占用了宝贵的存储空间,可能会阻碍您进行当前项目的工作。幸运的是,Docker 提供了内置的清理命令,可以轻松删除不必要的资源。
这些清理命令是docker prune
系列的一部分,今天您将学习有关它们的所有内容。它们将很快成为您释放磁盘空间的首选解决方案。
让我们在深入实际示例之前先简要了解一下。
您是Docker新手吗?查看我们的指南,从头开始学习Docker,快速掌握。数据专业人士学习Docker的指南
什么是Docker Prune?
术语“Docker Prune”通常指一组命令,旨在帮助您删除未使用和不必要的Docker资源。
随着时间的推移,特别是如果您跨多个项目工作,您会创建大量镜像、运行容器,并设置卷和网络。所有这些都会在您的系统上累积,占用大量磁盘空间。docker prune
的目的是清理这些杂物并回收存储空间。
话虽如此,docker prune
的功能远不止表面所见。
它不仅仅是一个单一的命令可供运行。嗯,你可以这样做,但有时你需要 精细控制 哪些内容被删除。这就是本文的用武之地。它将向您展示如何有效地管理清理工作,确保您只删除您打算删除的内容,并在安全环境中练习,以避免意外删除重要数据。
值得注意的是,修剪命令只会删除未被活跃使用的资源。镜像、卷和网络被运行容器引用的资源不会被删除。换句话说,修剪不会干扰活跃的工作负载。
在下一节中,我们将为您介绍不同类型的修剪命令,并解释它们如何适用于您的工作流程。
想要在您的简历或作品集中添加Docker吗?这些10个Docker项目创意将让您具备求职所需的技能。
所有Docker修剪命令及实际示例
Docker提供多个prune
命令,允许您单独或一次性清理未使用的资源。在本节中,您将通过理论和实际示例来了解它们。
docker system prune
这是用于回收磁盘空间的最全面的命令。它一次性删除所有未使用的容器、网络、镜像和构建缓存。
如果您想要通过单个命令快速释放磁盘空间,这就是要使用的命令。
您可以向docker system prune
命令传递选项:
-a
或--all
会删除所有未使用的镜像,而不仅仅是悬空的镜像(即没有标记或被任何容器引用的镜像)。--filter
允许您指定过滤值。-f
或--force
会跳过确认提示。--volumes
也会清理匿名卷,以及容器、网络、镜像和构建缓存。
默认情况下,docker system prune
会提示您确认,因为这是一个可能具有破坏性的 操作:
图1 – Docker系统清理确认提示
要绕过提示并使用单个命令删除所有未使用的镜像、容器、网络和卷,请运行:
docker system prune -a -f --volumes
图像 2 – 使用单个docker系统清理命令删除所有内容
但如果您需要更精细的控制呢?接下来让我们来讨论这个。
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桌面视觉检查网络,因此您需要从命令行中操作。以下是可用网络的列表:
图像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仍然没有内置的干扰试运行剪枝命令的选项。
因此,在运行修剪命令之前,您必须手动检查资源,使用上一节中列出的命令。
如果您在数据持久性至关重要的敏感环境中工作,您应该在运行影响卷的修剪命令之前创建备份。
当然,这些只是预防措施,但我们希望很快会看到实施干运行选项。
Docker清理的最佳实践
为了保持Docker环境干净整洁,定期运行prune
命令非常重要,甚至可以自动化。
本部分将指导您在生产环境中运行docker prune
命令的最佳实践。
定期使用docker prune
随着时间的推移,Docker会积累未使用的镜像、停止的容器和不必要的卷,这些都会占用大量磁盘空间。
定期运行修剪命令可保持环境清洁,防止磁盘使用过多。你应该将其包含在你的维护计划中。
每隔几周是一个不错的起点,但如果你的设置涉及频繁创建和移除容器,请考虑更频繁的计划。
在生产环境中要谨慎
在生产环境中的任何工作都需要额外小心,Docker修剪也不例外。
一时的疏忽可能导致停机或数据丢失,您肯定不想为此负责。在生产环境中运行docker prune
命令之前,始终使用docker ps -a
、docker images
和docker volume ls
检查系统资源,如前一节所述。
此外,最好使用特定的修剪命令,而不是包含在其中的docker system prune
,这样可以更容易从意外删除中恢复。
自动化docker修剪
另一个好的做法是通过定期任务自动化docker prune
命令,以简化清理工作。
在Linux上,您可以设置一个定时任务以便定期运行命令,而在Windows上,您可以使用任务计划程序进行类似的自动化。这有助于保持系统整洁,无需手动干预。然而,在生产环境中,请确保自动修剪不会干扰关键工作负载。
例如,在Linux上,这个定时任务每周日午夜运行一个全面的修剪命令:
0 0 * * 0 docker system prune -a -f
解决Docker修剪问题
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 contains[c] "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
等命令列出所有容器、镜像和卷。只有在确保可以删除列出的资源(假设它们未被运行中的容器使用)之后才运行清理命令。仅在确定可以删除列出的资源后才运行清理命令(假设它们未被运行中的容器使用)。
如果你想了解更多关于Docker、容器化和容器编排的知识,请查看DataCamp上的这些课程: