如何正确清理 Docker 容器的日志?
Docker 容器日志由日志驱动管理,不应直接 truncate 或 rm 内部文件。配置 log-opts 轮转,并在保留必要日志与持久数据后有计划地重建已有容器。本文给出清理与预防方案。
正确姿势:通过 Docker 支持的日志驱动和轮转配置管理日志。 json-file 文件由 Docker 独占管理,不应把直接 truncate 或 rm 内部文件作为安全清理方法。
清理现有日志
先用 docker inspect --format '{{json .HostConfig.LogConfig}}' 容器名 确认日志驱动,核对采集与保留要求。需要释放已有容器的本地日志时,应先保留必要记录、确认数据位于持久卷,再按原运行参数有计划地重建容器并移除旧容器;不要对所有内部日志文件做通配符截断。
根本解决:配置日志轮转
/etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
重启 Docker 后,新的默认配置仅应用于随后创建的容器,已有容器需要重建。10m 和 3 是轮转策略,不是精确的磁盘硬配额;单条超大记录等会影响实际占用。
容器级单独配置
docker run --log-opt max-size=10m --log-opt max-file=3 myapp
缩短本地日志保留前,先核对采集端是否跟上写入速度,并确认远端保留期限。在观测云侧按 DataKit 日志采集指南检查采集配置,用轮转前后的测试记录验证没有漏采,再决定本地副本需要保留多久。
常见问题(FAQ)
Q:能直接删 json.log 吗? 不应直接修改 Docker 管理的文件;若文件仍被持有,删除目录项也不立即释放空间。简单重启容器不等于清空日志。
Q:K8s 环境呢? kubelet 有 containerLogMaxSize/containerLogMaxFiles 配置,由 kubelet 管理容器日志轮转,并与 CRI 运行时协作。