Docker 容器写入大量日志,耗尽磁盘空间,导致其他容器无响应。

重启后 Docker 无法启动。

通过 df -h 命令发现 /dev/sda2 分区空间耗尽,进入到当前分区挂载点,依次进入磁盘占用较大的目录,通过 du -h -x --max-depth=1 发现是 clash 容器(/var/lib/docker/containers/<container ID>)占用了剩余所有磁盘空间,进入容器目录通过 ls -l 查看发现容器日志文件<container ID>-json.log 占用很大,删除日志文件后 Docker 启动成功。

通过参考 Docker 官方文档 ,我们可以通过配置日志驱动来限制日志的行为。

Docker 日志驱动

Docker 默认使用 json-file 日志驱动,将容器的日志写入当前容器目录下的 JSON 文件中。

默认情况下,不执行日志轮转。因此,默认 json-file 日志驱动存储的日志文件可能会越来越大,使用大量磁盘空间,从而导致磁盘空间耗尽。

支持的日志驱动

配置 Docker 日志驱动

可以通过如下两种方式来配置日志驱动,限制其行为。

  • 配置默认日志驱动

    可以通过配置(新增/修改) /etc/docker/daemon.json 文件来告诉 Docker 守护进程使用指定的日志驱动:

    1
    2
    3
    {
    "log-driver": "json-file"
    }

    通过 log-opts 选项来配置日志驱动:

    1
    2
    3
    4
    5
    6
    7
    {
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    }
    }

    max-size 指定单个日志文件大小为 10Mmax-file 表示最多允许创建 3 个日志文件。

    重启 Docker 守护进程来生效配置:

    1
    2
    systemctl daemon-reload
    systemctl restart docker

    配置只对新创建的容器生效。现有容器不会自动使用新的日志配置。

  • 为指定的容器配置日志驱动

    当启动容器时,可以使用 --log-driver 来指定当前容器使用的日志驱动。如果日志驱动有可配置选项,可以使用 --log-opt <NAME>=<VALUE> 来设置驱动。

    以下示例使用 none 日志记录驱动程序启动 Alpine 容器:

    1
    docker run -it --log-driver none alpine ash

    限制日志大小和文件数量:

    1
    docker run -it --log-opt max-size=10m --log-opt max-file=3 alpine ash

查看容器 是否生效

1
docker inspect --format='{{json .HostConfig.LogConfig}}' 你的容器名称