Docker 占满磁盘:清理前先识别真实占用

这篇内容能帮你完成什么?

一份安全、分步的 Docker 磁盘占用诊断指南。学习如何区分镜像、层、卷和日志,以防止清理过程中发生数据丢失。

适合谁

正在处理本文所述问题、需要按步骤核对的读者。

需要准备

先阅读本文的适用场景,再准备文中明确列出的环境和资料。

本文目录

当生产服务器报告磁盘已满时,最直接的冲动是运行激进的清理命令。然而,盲目执行 docker system prune 可能会删除活跃的卷或必要的镜像,导致服务中断。本指南专注于在采取任何破坏性操作之前测量实际使用情况,确保在回收空间的同时保留实时数据。

理解 Docker 存储组件

Docker 存储并非单一实体,而是由多个以不同方式消耗磁盘空间的独立组件组成。根据官方文档,卷(Volumes)是容器的持久数据存储,由 Docker 创建和管理。它们存储在 Docker 主机上的目录中,并与主机机的核心功能隔离。这种隔离使其成为持久化容器生成数据的理想选择,但也意味着标准文件系统命令可能无法像常规文件那样清晰地显示其大小。来源:Docker 卷文档

相比之下,镜像和层是只读模板。构建缓存是在 docker build 过程中生成的临时工件。日志是随时间累积的文本文件。理解这些区别至关重要,因为每个组件的清理策略差异很大。例如,如果没有容器使用某个镜像,删除它通常是安全的;但如果卷包含数据库记录或用户上传,删除它可能会导致永久数据丢失。

第一步:使用 docker system df 识别占用来源

任何磁盘空间调查的第一步都是获取空间使用的高层概览。docker system df 命令提供了镜像、容器、卷和构建缓存的磁盘使用情况摘要。

bash
docker system df

该命令将输出一个表格,显示每个类别的总大小和可回收大小。请密切关注“RECLAIMABLE”列。如果“Build Cache”或“Images”部分的大部分空间被标记为可回收,您可以安全地继续修剪这些特定区域。然而,如果“Volumes”部分显示较大尺寸,您必须在删除任何内容之前进一步调查,因为卷通常包含关键应用程序数据。

第二步:分析镜像和层的使用情况

如果 docker system df 输出表明镜像占用了大量空间,您需要识别哪些镜像未被使用。您可以使用以下命令列出所有镜像及其大小:

bash
docker images

查找带有 <none> 标签的镜像,这些通常是先前构建产生的悬空镜像。您还可以检查与任何运行中或已停止的容器不关联的镜像。在删除任何镜像之前,请验证它是否不被任何服务定义或部署脚本所需。删除仍被容器引用的镜像将导致容器在重启时失败。

第三步:安全地调查卷的使用情况

卷是最危险的清理组件,因为它们存储持久数据。正如 Docker 卷文档 所述,卷是持久化由 Docker 容器生成和使用的数据的推荐机制。与绑定挂载相比,卷更易于备份或迁移,并且可以使用 Docker CLI 命令进行管理。

要识别哪些卷正在使用,请运行:

bash
docker volume ls

这会列出所有卷。要查看哪些容器正在使用特定卷,您可以检查容器或使用:

bash
docker volume inspect <volume_name>

如果卷未在使用,删除它可能是安全的,但仅当您确定其中包含的数据不再需要时。对于生产环境,强烈建议在删除前备份卷内容。您可以通过创建一个挂载该卷的临时容器并将数据复制到安全位置来实现这一点。

第四步:检查容器日志

如果未进行轮转或截断,容器日志可能会无限增长。默认情况下,Docker 将日志存储在 /var/lib/docker/containers/<container_id>/ 中。如果您有很多容器,这些日志文件可能会消耗大量磁盘空间。

您可以使用以下命令检查日志文件的大小:

bash
du -sh /var/lib/docker/containers/*/*-json.log

如果日志文件很大,您可以在不停止容器的情况下截断它们:

bash
truncate -s 0 /var/lib/docker/containers/<container_id>/<container_id>-json.log

为防止将来出现此问题,请在 Docker 守护进程配置(/etc/docker/daemon.json)中配置日志轮转,为 json-file 日志驱动程序设置 max-size 和 max-file 选项。

第五步:执行试运行并验证

在执行任何清理命令之前,请执行试运行以查看将删除的内容。例如,要查看 docker image prune 将删除哪些镜像,您可以使用:

bash
docker image prune --filter "until=24h"

该命令将列出将被删除的镜像,而不会实际删除它们。仔细审查列表,以确保没有包含关键镜像。一旦您确信清理是安全的,您就可以在没有试运行标志的情况下执行命令。

清理后,验证您的服务是否仍正常运行。检查容器的状态,并确保它们可以访问其卷和日志。如果出现任何问题,您可以从备份恢复或根据需要重新拉取镜像。

风险与回退策略

Docker 磁盘清理的主要风险是数据丢失,特别是来自卷的数据。为减轻此风险,始终在删除前备份关键数据。如果您意外删除了卷,可以尝试从备份恢复它。如果没有备份,数据很可能已丢失。对于镜像,风险较低,因为它们可以从注册表重新拉取。但是,如果您有不在注册表中的自定义镜像,您应在删除前将它们导出为 tar 文件。

如果清理命令导致服务中断,第一步是识别删除了哪个组件。如果删除了镜像,请重新拉取它。如果删除了卷,请从备份恢复。如果截断了日志,它们将自动重新生成。清理后,始终监控磁盘使用情况,以确保空间已回收且没有新的问题出现。

卷存储验证

在执行激进的清理命令之前,请先确认持久化数据的管理方式。根据官方的 Docker Volumes 文档,卷是持久化数据的首选机制,存储在宿主机上的专用目录中,与核心容器层相互隔离。由于除非显式标记,标准清理命令不会自动删除卷,因此检查卷的分配情况可防止意外的数据丢失。

资料来源

下一步

按当前任务继续,不必一次读完所有内容。

  1. 使用 Docker 和持久化存储部署 Open WebUI →
  2. 在 Linux 上安装 Ollama 并安全提供服务 →
  3. Ollama 与 Open WebUI 的区别:自托管 AI 栈中的不同角色 →
我正在使用 · 推广推荐

准备上线时,可以再比较这两项服务

这不是自动排名,也不是每个人都需要购买。我只列出自己正在使用的入口,并把适用场景和限制说清楚。

云服务器 · 前期项目在用

雨云 RainYun

准备部署网站或小型服务时,可以把它作为入门候选;先按用户地区、配置和真实负载判断,不要只看最低价格。

推广说明:链接包含我的推荐信息。你通过链接注册或开通后,我可能获得平台奖励;不会因此向你额外收费。价格、活动、地区与服务条款请以下单页为准。 查看完整商业披露