如何正确清理 Docker 容器的日志?
Docker 容器日志在 /var/lib/docker/containers/<id>/<id>-json.log,不能直接 rm(文件被占用)——用 truncate -s 0 清空,或配置 log-opts 轮转从根本解决。本文给出清理与预防方案。
正确姿势:清空而不是删除——truncate -s 0 /var/lib/docker/containers/*/*-json.log。直接 rm 不会释放空间(进程仍持有文件句柄),容器还会报错。
清理现有日志
# 找到大日志文件
du -h /var/lib/docker/containers/*/*-json.log | sort -rh | head
# 清空(截断为零字节,安全)
sudo truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log
# 一把全清
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
根本解决:配置日志轮转
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
重启 Docker 生效——每个容器日志最多 10MB×3 个文件,自动轮转。
容器级单独配置
docker run --log-opt max-size=10m --log-opt max-file=3 myapp
缩短本地日志保留前,先核对采集端是否跟上写入速度,并确认远端保留期限。在观测云侧按 DataKit 日志采集指南检查采集配置,用轮转前后的测试记录验证没有漏采,再决定本地副本需要保留多久。
常见问题(FAQ)
Q:能直接删 json.log 吗? 不能——空间不释放(句柄占用)且 docker logs 会异常;truncate 或重启容器。
Q:K8s 环境呢? kubelet 有 containerLogMaxSize/containerLogMaxFiles 配置,CRI 运行时会自动轮转。