如何正确清理 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 运行时会自动轮转。