欢迎光临
我们一直在努力

Docker 容器日志占满磁盘怎么办?日志清理与大小限制教程

1. Docker 日志为什么会占满磁盘?

在 Linux 服务器上运行 Docker 容器时,应用程序输出到标准输出和标准错误的内容,通常会由 Docker 日志驱动进行保存。

Docker 常见的日志驱动为 json-file。

如果没有设置日志大小限制和轮转规则,容器运行时间越长,日志文件可能越来越大。

比较常见的日志来源包括:

网站访问日志;

应用程序报错;

数据库连接错误;

接口请求日志;

爬虫任务;

程序异常重试;

定时任务输出。

如果程序出现异常循环,一段时间内就可能产生大量日志。

最终可能造成:

服务器磁盘空间快速下降;

Docker 无法正常写入数据;

数据库写入异常;

网站或应用运行异常;

服务器部分服务无法正常启动。

因此长期运行 Docker 的服务器,建议提前配置日志轮转。

2. 先检查服务器磁盘空间

首先执行:

df -h

例如:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        40G   37G  1.1G  98% /

这里可以重点查看:

Size:磁盘总容量;

Used:已经使用的空间;

Avail:剩余可用空间;

Use%:磁盘使用率。

如果系统盘已经达到 90% 以上,就建议尽快排查磁盘占用来源。

还可以执行:

docker system df

查看 Docker 当前使用的镜像、容器、Volume 和 Build Cache 大致占用了多少空间。

需要注意:

docker system df 主要用于查看 Docker 整体资源占用,并不能完全替代容器日志排查。

3. 查看当前 Docker 日志驱动

执行:

docker info --format '{{.LoggingDriver}}'

如果输出:

json-file

说明当前 Docker 默认日志驱动为 json-file。

如果需要查看某个容器实际使用的日志驱动,可以执行:

docker inspect -f '{{.HostConfig.LogConfig.Type}}' 容器名称

例如:

docker inspect -f '{{.HostConfig.LogConfig.Type}}' nginx

如果输出:

json-file

说明这个容器使用的是 json-file 日志方式。

4. 查找 Docker 容器日志文件

查找Docker容器日志文件大小

可以直接通过 Docker 查询某个容器实际使用的日志文件路径。

执行:

docker inspect --format='{{.LogPath}}' 容器名称

例如:

docker inspect --format='{{.LogPath}}' nginx

可能输出:

/var/lib/docker/containers/xxxxxxxx/xxxxxxxx-json.log

然后查看这个日志文件的大小:

du -h /var/lib/docker/containers/xxxxxxxx/xxxxxxxx-json.log

例如:

6.8G    /var/lib/docker/containers/xxxxxxxx/xxxxxxxx-json.log

如果某个容器日志已经占用了几 GB,甚至几十 GB,就可能是磁盘空间快速减少的主要原因。

Docker 默认数据目录通常位于:

/var/lib/docker

不过如果服务器修改过 Docker 数据目录,实际位置可能不同。

因此更推荐通过 docker inspect 获取真实日志路径,而不是直接猜日志位置。

5. 查看日志到底在输出什么

找到日志较大的容器以后,不建议第一时间直接删除。

先查看最近的日志内容:

docker logs --tail 100 容器名称

例如:

docker logs --tail 100 nginx

如果需要实时观察:

docker logs -f --tail 100 容器名称

退出实时日志:

Ctrl + C

重点观察是否存在大量重复内容。

例如:

数据库连接失败;

接口访问失败;

DNS 解析异常;

连接超时;

程序不断重启;

某个任务持续报错;

API 不断重试。

如果相同错误每秒出现很多次,即使清理日志,后续也可能很快再次增长。

因此最好同时解决程序本身的异常。

6. 不建议直接删除 Docker 日志文件

网上经常能看到直接删除 *-json.log 的做法。

例如:

rm -f *-json.log

不建议把这种方式作为长期处理方案。

因为 Docker 正在管理这些日志文件,直接从系统层面删除或者修改,可能导致日志状态和 Docker 当前使用的文件不一致。

更推荐按照以下思路处理:

找到异常容器 → 查看日志内容 → 修复程序异常 → 设置日志轮转 → 重新创建容器。

这样才能真正避免后续日志继续无限增长。

7. Docker Compose 限制单个容器日志大小

Docker Compose限制容器日志大小

如果容器通过 Docker Compose 部署,可以在对应服务中加入 logging 配置。

例如:

services:
  app:
    image: example/app:latest
    restart: unless-stopped
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

这里:

max-size: "10m"

表示单个日志文件达到约 10MB 后进行轮转。

max-file: "3"

表示最多保留 3 个日志文件。

这样日志就不会一直写入同一个越来越大的文件。

修改 Compose 配置以后,可以重新创建容器:

docker compose up -d --force-recreate

如果运行的是正式业务,重新创建之前建议先确认应用数据已经使用 Volume 或绑定目录进行持久化。

数据库等重要业务还应该提前做好备份。

8. 修改日志配置后为什么没有生效?

这是比较容易遇到的问题。

Docker 容器的日志配置通常在创建容器时确定。

例如你已经运行了一个旧容器,然后才修改:

compose.yaml

或者:

/etc/docker/daemon.json

原来的容器并不会自动修改日志配置。

因此修改 Docker Compose 配置以后,可以执行:

docker compose up -d --force-recreate

让容器按照新的配置重新创建。

创建完成以后,可以执行:

docker inspect -f '{{json .HostConfig.LogConfig}}' 容器名称

查看实际日志配置。

如果已经能够看到 max-size、max-file 等参数,说明新的限制已经生效。

9. 给整台服务器设置 Docker 日志限制

Docker daemon.json设置日志轮转

如果服务器长期运行多个 Docker 项目,也可以为 Docker 设置全局默认日志限制。

编辑:

nano /etc/docker/daemon.json

加入:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

这里建议特别注意:

如果 /etc/docker/daemon.json 原来已经存在其他配置,不要直接把原来的内容全部覆盖掉。

应该将日志配置和已有配置正确合并。

修改完成以后,可以检查 JSON 格式:

python3 -m json.tool /etc/docker/daemon.json

如果没有报错,再重新启动 Docker:

systemctl restart docker

然后查看 Docker 状态:

systemctl status docker

确认 Docker 正常运行。

10. 全局设置修改后旧容器仍然不会自动变化

修改 Docker 全局日志配置以后,需要注意一个问题:

已经创建完成的旧容器,通常仍然保持原来的日志配置。

新的默认配置主要用于之后创建的容器。

因此如果希望已有 Docker Compose 项目也使用新的日志限制,可以进入对应项目目录:

docker compose up -d --force-recreate

重新创建以后,再通过:

docker inspect -f '{{json .HostConfig.LogConfig}}' 容器名称

确认日志配置。

11. Compose 单独设置和全局设置怎么选?

如果服务器上运行很多 Docker 项目,希望以后创建的新容器默认都有日志限制,可以使用:

/etc/docker/daemon.json

进行全局配置。

如果某个项目日志比较特殊,需要单独设置,则可以在:

compose.yaml

中为对应服务添加:

logging

例如普通应用可以设置:

max-size 为 10m

max-file 为 3

而日志比较重要或者产生量较大的业务,可以根据实际需求调整。

不建议所有业务机械地使用同一个日志大小。

12. 使用 local 日志驱动

除了 json-file,Docker 还支持其他日志驱动。

例如可以设置:

{
  "log-driver": "local"
}

local 日志驱动本身具有日志轮转机制,也比较适合希望控制日志磁盘占用的场景。

不过如果服务器已经长期使用 json-file,为了减少修改范围,也可以继续使用 json-file,然后增加:

max-size

和:

max-file

限制即可。

13. 磁盘占满不一定都是 Docker 日志

如果检查以后发现 Docker 日志并不大,还应该继续排查其他 Docker 数据。

执行:

docker system df

可以查看:

Images;

Containers;

Local Volumes;

Build Cache。

还可以执行:

du -sh /var/lib/docker/*

查看 Docker 数据目录不同部分的大致占用。

常见占用来源还包括:

大量旧镜像;

停止的容器;

Docker Build Cache;

Docker Volume;

数据库文件;

应用上传文件;

容器内部缓存;

程序临时文件。

特别需要注意 Docker Volume。

Volume 中可能保存:

MySQL 数据;

PostgreSQL 数据;

网站文件;

用户上传内容;

应用配置;

其他持久化业务数据。

因此不要在没有确认用途之前直接删除 Volume。

14. 不要看到磁盘满就直接执行 prune

一些 Docker 清理命令具有删除作用。

如果不了解当前服务器上的 Docker 项目,不建议为了释放空间直接执行大范围清理。

尤其不要在没有确认的情况下删除:

Volume;

正在使用的镜像;

业务数据;

数据库数据目录。

正确做法应该是先执行:

docker system df

了解空间主要消耗在哪里,再决定具体处理哪个项目。

15. 推荐的日志限制配置

对于普通个人 Docker 服务器,可以参考:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

这种配置适合大多数日志量不大的应用作为基础限制。

但这并不是固定标准。

例如:

Web 应用;

数据库;

API;

游戏服务;

高频任务;

不同业务每天产生的日志量可能差异很大。

应该根据业务实际情况调整。

16. Docker 日志快速排查顺序

遇到 Docker 日志或者磁盘空间异常,可以按照下面顺序排查:

检查磁盘空间

↓

确认 Docker 日志驱动

↓

找到具体容器日志路径

↓

检查日志文件大小

↓

查看日志内容

↓

确认是否存在程序异常

↓

配置日志大小限制

↓

重新创建容器

↓

再次检查日志配置

这样比单纯删除日志文件更加稳妥。

17. 如何避免日志再次写满磁盘?

服务器长期运行 Docker 项目时,建议做好以下几点。

第一,新服务器安装 Docker 后,可以提前设置合理的日志轮转。

第二,对于日志量特别大的 Compose 项目,可以单独设置 logging。

第三,定期查看服务器磁盘使用情况。

可以执行:

df -h

如果服务器平时磁盘使用率只有 40%,短时间突然增长到 80% 或 90%,建议及时检查。

第四,如果发现某个应用持续大量输出相同错误,应优先修复程序本身。

日志限制只是防止磁盘被无限写满,并不能解决应用程序异常。

18. 磁盘已经接近 100% 怎么办?

如果磁盘使用率已经非常高,不建议继续进行大量写入操作。

可以先执行:

df -h

确认具体哪个分区已经接近满。

再查看 Docker:

docker system df

定位某个容器日志:

docker inspect --format='{{.LogPath}}' 容器名称

检查大小:

du -h 日志文件路径

确认真正占用空间的内容以后,再针对具体业务进行处理。

如果磁盘已经完全没有剩余空间,部分应用、数据库甚至 Docker 本身都可能出现异常,因此建议尽早处理。

19. 服务器配置建议

Docker 本身不需要特别高的服务器配置,真正决定 CPU、内存和磁盘需求的是运行在 Docker 中的应用。

如果只是运行几个轻量级 Docker 项目,普通 Linux 云服务器通常就可以使用。

如果同时运行:

网站;

MySQL;

Redis;

监控系统;

Docker 管理面板;

多个自托管项目;

则需要根据实际业务增加 CPU、内存和磁盘空间。

如果需要搭建 Docker 项目,也可以使用莱卡云 Linux 云服务器。

查看官网购买链接: https://www.lcayun.com

如果服务器还没有安装 Docker,可以参考:

安装教程: 服务器上安装docker和docker-compose教程

20. 总结

Docker 容器日志占满磁盘,比较常见的原因是容器长期使用 json-file 日志方式,但没有配置日志大小限制和轮转。

首先可以通过:

docker info --format '{{.LoggingDriver}}'

确认日志驱动。

然后通过:

docker inspect --format='{{.LogPath}}' 容器名称

找到实际日志文件。

检查日志大小以后,还应该通过:

docker logs --tail 100 容器名称

确认应用是否存在异常刷日志。

对于 Docker Compose 项目,可以通过 logging 配置 max-size 和 max-file。

如果希望整台服务器上的新容器默认启用日志限制,也可以配置:

/etc/docker/daemon.json

需要特别注意的是:

修改 Docker 全局日志配置以后,已经存在的旧容器通常不会自动使用新的配置。

因此还需要根据实际项目重新创建对应容器。

通过合理设置日志轮转、定期检查磁盘空间,并及时处理程序异常,可以有效避免 Docker 日志再次占满服务器磁盘。

赞(0)
未经允许不得转载:莱卡云 » Docker 容器日志占满磁盘怎么办?日志清理与大小限制教程