本文目录
当生产服务器报告磁盘已满时,最直接的冲动是运行激进的清理命令。然而,盲目执行 docker system prune 可能会删除活跃的卷或必要的镜像,导致服务中断。本指南专注于在采取任何破坏性操作之前测量实际使用情况,确保在回收空间的同时保留实时数据。
理解 Docker 存储组件
Docker 存储并非单一实体,而是由多个以不同方式消耗磁盘空间的独立组件组成。根据官方文档,卷(Volumes)是容器的持久数据存储,由 Docker 创建和管理。它们存储在 Docker 主机上的目录中,并与主机机的核心功能隔离。这种隔离使其成为持久化容器生成数据的理想选择,但也意味着标准文件系统命令可能无法像常规文件那样清晰地显示其大小。来源:Docker 卷文档
相比之下,镜像和层是只读模板。构建缓存是在 docker build 过程中生成的临时工件。日志是随时间累积的文本文件。理解这些区别至关重要,因为每个组件的清理策略差异很大。例如,如果没有容器使用某个镜像,删除它通常是安全的;但如果卷包含数据库记录或用户上传,删除它可能会导致永久数据丢失。
第一步:使用 docker system df 识别占用来源
任何磁盘空间调查的第一步都是获取空间使用的高层概览。docker system df 命令提供了镜像、容器、卷和构建缓存的磁盘使用情况摘要。
docker system df该命令将输出一个表格,显示每个类别的总大小和可回收大小。请密切关注“RECLAIMABLE”列。如果“Build Cache”或“Images”部分的大部分空间被标记为可回收,您可以安全地继续修剪这些特定区域。然而,如果“Volumes”部分显示较大尺寸,您必须在删除任何内容之前进一步调查,因为卷通常包含关键应用程序数据。
第二步:分析镜像和层的使用情况
如果 docker system df 输出表明镜像占用了大量空间,您需要识别哪些镜像未被使用。您可以使用以下命令列出所有镜像及其大小:
docker images查找带有 <none> 标签的镜像,这些通常是先前构建产生的悬空镜像。您还可以检查与任何运行中或已停止的容器不关联的镜像。在删除任何镜像之前,请验证它是否不被任何服务定义或部署脚本所需。删除仍被容器引用的镜像将导致容器在重启时失败。
第三步:安全地调查卷的使用情况
卷是最危险的清理组件,因为它们存储持久数据。正如 Docker 卷文档 所述,卷是持久化由 Docker 容器生成和使用的数据的推荐机制。与绑定挂载相比,卷更易于备份或迁移,并且可以使用 Docker CLI 命令进行管理。
要识别哪些卷正在使用,请运行:
docker volume ls这会列出所有卷。要查看哪些容器正在使用特定卷,您可以检查容器或使用:
docker volume inspect <volume_name>如果卷未在使用,删除它可能是安全的,但仅当您确定其中包含的数据不再需要时。对于生产环境,强烈建议在删除前备份卷内容。您可以通过创建一个挂载该卷的临时容器并将数据复制到安全位置来实现这一点。
第四步:检查容器日志
如果未进行轮转或截断,容器日志可能会无限增长。默认情况下,Docker 将日志存储在 /var/lib/docker/containers/<container_id>/ 中。如果您有很多容器,这些日志文件可能会消耗大量磁盘空间。
您可以使用以下命令检查日志文件的大小:
du -sh /var/lib/docker/containers/*/*-json.log如果日志文件很大,您可以在不停止容器的情况下截断它们:
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 将删除哪些镜像,您可以使用:
docker image prune --filter "until=24h"该命令将列出将被删除的镜像,而不会实际删除它们。仔细审查列表,以确保没有包含关键镜像。一旦您确信清理是安全的,您就可以在没有试运行标志的情况下执行命令。
清理后,验证您的服务是否仍正常运行。检查容器的状态,并确保它们可以访问其卷和日志。如果出现任何问题,您可以从备份恢复或根据需要重新拉取镜像。
风险与回退策略
Docker 磁盘清理的主要风险是数据丢失,特别是来自卷的数据。为减轻此风险,始终在删除前备份关键数据。如果您意外删除了卷,可以尝试从备份恢复它。如果没有备份,数据很可能已丢失。对于镜像,风险较低,因为它们可以从注册表重新拉取。但是,如果您有不在注册表中的自定义镜像,您应在删除前将它们导出为 tar 文件。
如果清理命令导致服务中断,第一步是识别删除了哪个组件。如果删除了镜像,请重新拉取它。如果删除了卷,请从备份恢复。如果截断了日志,它们将自动重新生成。清理后,始终监控磁盘使用情况,以确保空间已回收且没有新的问题出现。
卷存储验证
在执行激进的清理命令之前,请先确认持久化数据的管理方式。根据官方的 Docker Volumes 文档,卷是持久化数据的首选机制,存储在宿主机上的专用目录中,与核心容器层相互隔离。由于除非显式标记,标准清理命令不会自动删除卷,因此检查卷的分配情况可防止意外的数据丢失。
资料来源
下一步
按当前任务继续,不必一次读完所有内容。