最近在 Docker 上部署了 Quickwit 全文检索服务,运行一段时间后发现服务器磁盘空间接近满载。然而,经过检查容器自身以及挂载的卷(volume)的占用情况,并未发现异常:

docker ps -s b432fd6e33b8 quickwit/quickwit:latest "quickwit run" 18 hours ago Up 18 hours 127.0.0.1:7280-7281->7280-7281/tcp quickwit 0B (virtual 297MB)

同时,通过 docker stats 查看容器资源使用情况也没有发现问题:

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS b432fd6e33b8 quickwit 0.38% 1.748GiB / 5GiB 34.97% 478kB / 32.3MB 242kB / 0B 98

问题分析

经过进一步排查,最终发现问题的根源在于容器的日志输出。由于 Quickwit 服务访问量较大,每次写入和检索请求都会在控制台打印大量日志,导致容器日志文件累计写入达到了 14G。虽然容器和数据卷本身的占用并不高,但不断增长的日志文件却悄然占满了磁盘空间。

解决方案:日志截断配置

为防止日志无限制增长,可以通过配置 Docker 日志驱动的相关选项来限制日志文件的大小和数量。以下提供了三种常见的配置方式:

1. 全局配置(修改 /etc/docker/daemon.json 文件)

修改 Docker 守护进程的配置文件,添加如下内容:

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

配置说明:

  • max-size:指定单个日志文件的最大大小(这里设置为 1MB)。

  • max-file:指定保留的日志文件数量。设置为 1 表示只保留正在写入的日志文件,若为 2 或更多,则会保留额外的备份文件,超出设置数量的旧文件将自动删除。

修改后,重启 Docker 服务使配置生效。

2. 使用 Docker Compose 配置

如果是通过 docker-compose.yaml 部署服务,可以在对应服务下增加日志配置:

services:
  quickwit:
    image: quickwit/quickwit:latest
    command: quickwit run
    ports:
      - "7280-7281:7280-7281"
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

这样,每个服务容器的日志均会按照指定的大小和数量进行截断管理。

3. 使用 docker run 命令参数

如果直接通过 docker run 命令运行容器,则可在命令中加入日志选项参数,例如:

docker run --log-opt max-size=1m --log-opt max-file=1 quickwit/quickwit:latest quickwit run

总结

通过合理配置 Docker 日志选项,可以有效防止日志文件无限制增长,避免因日志占用过多磁盘空间而影响服务器稳定性。根据具体的部署方式(全局、Compose 或命令行),选择合适的日志管理策略,是日常运维中的一项重要工作。