Docker 默认使用 json-file 日志驱动,容器标准输出会一直追加到宿主机上的 JSON 文件,默认没有大小限制。长期运行的服务只要日志量稍大,就可能把数据盘写满,进而导致其他服务写入失败。本文整理排查方法、轮转配置,以及一个容易被忽略的细节:全局配置只对新建容器生效。
日志文件位于 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log(默认数据目录下)。
# 按大小列出各容器的日志文件
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
# 查看某个容器的日志路径和驱动
docker inspect --format '{{.LogPath}} {{.HostConfig.LogConfig.Type}}' <容器名>再配合 docker ps --no-trunc 或 docker inspect 把容器 ID 对应到具体服务。
编辑 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}含义:单个日志文件超过 100MB 就轮转,最多保留 3 个文件。数值需按业务日志量和磁盘大小调整。
修改后重启 Docker 服务:
systemctl restart docker注意:重启 dockerd 默认会停止容器,除非配置了 live-restore,上线前确认对业务的影响。
这是最常见的误区:daemon.json 里的日志配置只在创建容器时写入容器的 HostConfig。已经存在的容器仍然沿用创建时的配置,重启 Docker 或容器都不会改变。可以用上面的 docker inspect 命令确认 LogConfig 里有没有 max-size。
处理方式是重新创建容器:
docker rm 旧容器后用同样的参数重新 docker run。docker compose up -d --force-recreate。对单个容器也可以在创建时指定:
docker run -d --log-opt max-size=50m --log-opt max-file=3 nginxcompose 写法:
services:
app:
image: nginx
logging:
driver: json-file
options:
max-size: "50m"
max-file: "3"磁盘已满、暂时不能重建容器时,可以先清空日志文件:
truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log不要直接 rm 这个文件:容器进程仍持有句柄,空间不会释放,df 与 du 还会对不上。清空会丢失已有日志,操作前确认是否需要保留。
local 日志驱动:它默认带轮转并采用更紧凑的存储格式,但 docker logs 之外的工具无法直接读取其文件格式,选用前确认下游采集方式。/var/lib/docker 的增长趋势,在写满之前告警。du 与 docker inspect 确认是 json-file 日志过大。daemon.json 配 max-size 与 max-file,但只对新建容器生效。truncate 清空而非 rm。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。