Docker清理:完整指南及实例

如果您每天都在使用 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 -adocker imagesdocker 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 -adocker imagesdocker volume ls等命令列出所有容器、镜像和卷。只有在确保可以删除列出的资源(假设它们未被运行中的容器使用)之后才运行清理命令。仅在确定可以删除列出的资源后才运行清理命令(假设它们未被运行中的容器使用)。

如果你想了解更多关于Docker、容器化和容器编排的知识,请查看DataCamp上的这些课程:

Source:
https://www.datacamp.com/tutorial/docker-prune