Docker日志清理方案

Docker 是快速部署和运行应用的绝佳工具。但我们往往会忽略其运行过程中一个关键要素——日志文件。

为什么这么说?最近我的服务器磁盘空间告急,排查后发现某个 Docker 容器在一年内竟生成了 14GB 的日志文件。为避免你重蹈覆辙,本文将手把手教你如何快速检查 Docker 日志大小、清理日志文件,并设置预防机制。

重启 vs 重建容器:关键区别

在深入正题前,需要澄清一个关键点:Docker 容器的无状态特性(译者注:即容器本身不保存持久化数据)意味着日志会在容器重建时被清除。但很多人忽略了一个重要细节——重启(restart)与重建(recreate)的区别

服务器重启或执行 systemctl restart docker 时,Docker 守护进程会优雅停止并重新启动容器,此时日志文件仍然保留。只有删除并重建容器才会重置日志,单纯的停止/启动操作不会影响现有日志。

定位日志膨胀元凶

查看日志文件大小

默认情况下,Docker 日志存储在宿主机的以下路径(假设未修改默认数据目录):

1
/var/lib/docker/containers/<container-id>/<container-id>-json.log

使用 find 命令快速定位日志文件大小:

1
find /var/lib/docker/containers/ -name "*json.log" | xargs du -h | sort -hr

容器 ID 与名称映射

通过容器 ID 获取对应容器名称:

1
docker inspect --format='{{.Name}}' d2e9228f92b6  # 短ID即可

验证日志路径:

1
docker inspect --format='{{.LogPath}}' php-fpm-valente

日志清理实战

单文件清理

使用 truncate 命令清空指定日志:

1
truncate -s 0 /var/lib/docker/containers/d2e92...e977-json.log

全量清理(慎用!)

一键清空所有容器日志:

1
truncate -s 0 /var/lib/docker/containers/*/*-json.log

治本之道:日志限流

全局配置日志轮转

修改 Docker 守护进程配置 /etc/docker/daemon.json

1
2
3
4
5
6
7
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",  // 单个日志上限
    "max-file": "3"     // 保留历史文件数
  }
}

应用配置并重启 Docker:

1
sudo systemctl restart docker

重要提示:该配置仅对新创建容器生效,已有容器需重建。

容器重建操作指南

  • 普通 Docker 容器:
1
docker rm -f <container_name> && docker run ...  # 注意备份数据
  • Docker Compose 项目:
1
docker compose down && docker compose up -d

验证配置生效:

1
docker inspect <container_name> | grep -i log

最佳实践总结

  1. 定期巡检:将日志检查加入日常维护流程
  2. 分级管控:对关键业务容器单独设置更宽松的日志策略
  3. 日志聚合:考虑使用 ELK 等方案进行集中式日志管理(译者注:这是对原文建议的延伸)
  4. 容器化思维:避免在容器内直接写日志文件,坚持 stdout/stderr 输出
updatedupdated2025-02-122025-02-12
加载评论