容器日志写满磁盘的根源是日志管理策略缺失,因docker默认将stdout/stderr以json格式持续追加写入宿主机/var/lib/docker/containers//-json.log文件;应急时应清空而非删除日志文件,长效方案是通过daemon.json配置json-file驱动的max-size和max-file实现轮转。
容器日志写满磁盘,本质不是镜像或容器本身的问题,而是日志管理策略缺失。镜像是只读模板,不产生日志;容器是运行实例,它的标准输出(stdout/stderr)被 docker 捕获后,默认以 json 格式持续追加写入宿主机文件——这才是空间暴增的源头。
查清日志在哪、有多大
容器日志不存于 overlay2 目录,而是在:
/var/lib/docker/containers/
快速定位大日志文件:
- du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -5 —— 找出前 5 个最大的日志
-
docker inspect --format='{{.LogPath}}'
—— 精准查看某容器日志路径
应急清理:安全释放已占空间
⚠️切勿直接 rm 日志文件——Docker 进程仍持有句柄,磁盘不会释放。
正确做法是清空内容:
- cat /dev/null > /var/lib/docker/containers/xxx/xxx-json.log
- 或用脚本批量处理(需 root 权限):
find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
长效防护:从驱动配置入手
核心是启用日志轮转,限制单个日志大小和保留份数:
-
全局生效(推荐):编辑 /etc/docker/daemon.json,加入:
{ "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } } - 保存后执行:systemctl daemon-reload && systemctl restart docker
- 注意:该配置仅对新建容器生效,存量容器需
docker stop && docker rm && docker run...重建才启用
进阶选择:换掉默认日志驱动
若不需要本地留存日志,可彻底规避磁盘风险:
- --log-driver=none:完全禁用日志(调试阶段慎用)
- --log-driver=syslog:转发至系统日志服务,由 rsyslog 或 journald 统一管理轮转
- --log-driver=fluentd:接入集中式日志平台(如 ELK、Loki),适合集群环境











