Docker 日志占满磁盘:先确认来源,再配置轮转

作者: OpsMate 团队
更新于
基于 OpsMate 实机排查整理;命令请在你有权限的服务器上执行,路径与服务名按环境替换。

Docker 默认的 json-file 日志驱动不会自动轮转;容器持续往 stdout/stderr 打日志时,宿主机磁盘或 inode 会被写满,应用表现为无法写入、健康检查失败或整站 5xx。先确认是哪一个文件系统满了、是否真是容器日志在涨,再在维护窗口配置轮转——不要先清空日志掩盖原因。

以下适用于 Linux 上的 Docker Engine;Docker Desktop 的引擎数据在虚拟机里,不能直接套用宿主机路径。

1. 先区分空间与 inode 耗尽

df -h
df -i
docker system df
docker info --format '{{.DockerRootDir}}'
docker inspect --format '{{.HostConfig.LogConfig.Type}} {{json .HostConfig.LogConfig.Config}}' YOUR_CONTAINER

把 YOUR_CONTAINER 换成你有权限管理的容器名。df -h 看字节容量,df -i 看可用 inode。docker system df 不能替代对容器日志文件的检查,也不能单凭它排除「日志占满」。

2. 定位日志,而不是先清空

docker inspect --format '{{.LogPath}}' YOUR_CONTAINER
docker logs --since 10m --tail 100 --timestamps YOUR_CONTAINER

若 LogPath 指向本地文件,可在获授权的主机上用 ls -lh 看该文件大小。部分日志驱动没有本地路径。不要直接编辑、删除或截断 Docker 管理的日志文件;先保留故障证据,并检查应用是否在高频重复同一错误。分享前遮盖令牌、连接串和个人信息。

若根因其实是业务数据或 inode,而不是容器日志,先看 磁盘占用突然飙升。

3. 在维护窗口控制后续增长

json-file 默认不轮转。下面是单个 Compose 服务的配置示例,不是紧急清理命令:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

阈值只是示例,按容器数量、保留期和审计要求调整。检查并备份现有配置;经负责人批准后重建受影响的容器,并安排可能的中断。只改 daemon 默认值不会改变已有容器。变更后核对 LogConfig、服务健康和磁盘增长趋势,保留原配置以便回退。官方说明见下方「参考」。

说明性示例:连接失败引发日志风暴

说明性示例(不是真实客户案例):数据库连接失败每秒记几十行,日志很快涨满盘。只清空间会再次告警。应先确认依赖并修好连接,再设合理保留规则;不要用丢弃全部日志掩盖原因。

让 AI 帮你整理证据

请检查磁盘空间、inode、Docker 日志配置和最近十分钟错误。说明证据是否支持「日志占满磁盘」,列出仍缺少的信息。不要删除文件或重建容器;如需变更,先给出风险、验证与回退步骤供我确认。

在 OpsMate 里可手敲上面的命令,或用自然语言描述现象。AI 以排查为主。未通过安全检查的命令会被拦截且不会执行。低风险修复默认自动执行,每一步都会记录。每次让 AI 帮忙看,终端里最近的输出都会一起发到云端 AI,敏感信息请先去掉。

试用

每月免费 500 次 AI 调用;服务器数量不限。桌面端默认把 SSH 凭证保留在本机。

参考

需要帮助理解排查结果?

OpsMate(itops.sh)把 SSH 终端和 AI 放在同一页,由你核对证据。每次让 AI 帮忙看,终端里最近的输出都会一起发到云端 AI,敏感信息请先去掉。

免费开始 本地凭证桌面端

排障指南