Docker容器日志驱动配置,限制日志文件大小
Docker 容器默认使用 json-file 日志驱动,日志会不断追加到宿主机的 JSON 文件里,长期运行很容易把磁盘写满。
本文从零基础角度讲清 Docker 容器日志驱动配置,通过 max-size 和 max-file 限制日志文件大小,帮你解决日志占满磁盘的问题。
先搞清日志文件到底存在哪
Docker 默认日志驱动是 json-file,容器日志存放在宿主机 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log。
查看当前驱动和文件大小:
docker info | grep -i "logging driver"
du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail
如果发现某个 -json.log 文件已经几个 GB,说明没有做日志轮转,需要尽快配置限制。
全局配置:修改 daemon.json
推荐在 Docker 守护进程层面统一配置,新创建的容器都会生效。
- 编辑或新建配置文件:
sudo mkdir -p /etc/docker
sudo vi /etc/docker/daemon.json
- 写入以下内容(已有配置请合并,不要覆盖其他项):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
参数含义:max-size 单个日志文件上限,max-file 最多保留几个轮转文件。
上面配置最多占用约 300MB。
- 重启 Docker 服务:
sudo systemctl restart docker
注意:全局配置只对重启后新建的容器生效,已运行的旧容器不受影响。
只给单个容器限制日志
不想动全局配置时,可在 docker run 时直接指定:
docker run -d \
--log-driver json-file \
--log-opt max-size=50m \
--log-opt max-file=2 \
--name myapp nginx
使用 docker-compose 时,在服务下加:
services:
web:
image: nginx
logging:
driver: json-file
options:
max-size: "50m"
max-file: "2"
改完执行 docker compose up -d 重建容器即可。
避坑:旧容器和清理策略
- 旧容器不会自动继承全局配置,需要重建:
docker rm -f 容器名后再用原命令启动。 - 已生成的超大日志文件不会因配置而消失,可先清理:
truncate -s 0 /var/lib/docker/containers/。/ -json.log - 不要用
rm删除正在写入的日志文件,可能导致句柄未释放、磁盘空间不回收。 - 若日志要送远端,可改用
syslog、fluentd等驱动,但max-size只对json-file和local驱动生效。
验证配置是否生效
重启后新建一个容器,查看它的日志配置:
docker inspect --format '{{.HostConfig.LogConfig}}' 容器名
输出中应看到 max-size:100m 和 max-file:3。
持续压测日志后,用 ls -lh /var/lib/docker/containers/ 观察,应出现 -json.log.1、-json.log.2 等轮转文件,且总大小受控。
只要按上面的方式配置好 max-size 和 max-file,Docker 容器日志就不会再无限增长。
建议新服务器一开始就写入 daemon.json,避免后期磁盘告警时再补救。