Docker 容器日志占用了我所有的磁盘 space

Docker container logs taking all my disk space

我是 运行 VM 上的容器。我的容器默认将日志写入 /var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log 文件,直到磁盘已满。

目前,我不得不手动删除这个文件,以避免磁盘已满。我读到在 Docker 1.8 中会有一个参数 rotate the logs。 您会推荐什么作为当前的解决方法?

注意:此 post 涉及 docker 版本 < 1.8(没有 --log-opt 选项)

你为什么不用logrotate(它也支持压缩)?

/var/lib/docker/containers/*/*-json.log {
hourly
rotate 48
compress
dateext
copytruncate
}

直接在您的 CoreOs 节点上配置它或部署一个容器(例如 https://github.com/tutumcloud/logrotate),该容器装载 /var/lib/docker 以轮转日志。

Docker 1.8 已发布,带有日志轮换选项。添加:

--log-opt max-size=50m 

当容器启动时就可以了。您可以在以下位置了解更多信息: https://docs.docker.com/engine/admin/logging/overview/

注意:这仅适用于 docker-compose 版本 2

示例:

version: '2'
services:
  db:
    container_name: db
    image: mysql:5.7
    ports:
      - 3306:3306
    logging:
      options:
        max-size: 50m

在 运行 容器时传递日志选项。举例如下

sudo docker run -ti --name visruth-cv-container  --log-opt max-size=5m --log-opt max-file=10 ubuntu /bin/bash

其中 --log-opt max-size=5m 指定最大日志文件大小为 5MB,--log-opt max-file=10 指定轮换文件的最大数量。

docker-compose 版本 1 的示例:

mongo:
  image: mongo:3.6.16
  restart: unless-stopped
  log_opt:
    max-size: 1m
    max-file: "10"

[此答案涵盖 docker 的当前版本,适用于那些在问题被提出很久之后才遇到的人。]

要为所有新创建的容器设置默认日志限制,您可以在/etc/docker/daemon.json中添加以下内容:

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

如果您使用的是 systemd,则使用 systemctl reload docker 重新加载 docker(否则请为您的安装使用适当的重启命令)。

您也可以使用类似的文件切换到本地日志记录驱动程序:

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

本地日志记录驱动程序以内部格式(我相信 protobufs)存储日志内容,因此您将在相同大小的日志文件中获得更多的日志内容(或者对于相同的日志使用更少的文件 space)。本地驱动程序的缺点是日志转发器等外部工具可能无法解析原始日志。请注意 docker logs 仅在日志驱动程序设置为 json-filelocaljournald.

时有效

max-size 是对 docker 日志文件的限制,因此它包括 json 或本地日志格式化开销。 max-file 是 docker 将维护的日志文件数。一个文件达到大小限制后,将轮换日志,超过 max-file.

时将删除最旧的日志

有关更多详细信息,docker 在以下位置提供了所有驱动程序的文档:https://docs.docker.com/config/containers/logging/configure/

我也有一个关于这个话题的演讲。使用 P 查看演示者备注:https://sudo-bmitch.github.io/presentations/dc2019/tips-and-tricks-of-the-captains.html#logs

使用 compose 3.9,您可以如下设置日志限制

version: "3.9"
services:
  some-service:
    image: some-service
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"

上面显示的示例将存储日志文件,直到它们达到 200kB 的最大大小,然后轮换它们。存储的单个日志文件的数量由 max-file 值指定。随着日志增长超过最大限制,旧的日志文件将被删除以允许存储新日志。

可用的日志记录选项取决于您使用的日志记录驱动程序

  • 上面 controlling log files and sizes 的示例使用了特定于 json-file driver 的选项。这些特定选项在其他日志记录驱动程序上不可用。有关受支持的日志记录驱动程序及其选项的完整列表,请参阅日志记录驱动程序文档。

注意: 只有 json-filejournald 驱动程序可以直接从 docker-compose up 和 docker-撰写日志。使用任何其他驱动程序不会打印任何日志。

来源:https://docs.docker.com/compose/compose-file/compose-file-v3/

以防万一你不能停止你的容器,我创建了一个脚本来执行以下操作(你必须 运行 使用 sudo):

  1. 创建一个文件夹来存储压缩日志文件作为备份。
  2. 查找 运行ning 容器的 ID(由容器名称指定)。
  3. 使用随机名称将容器的日志文件复制到新位置(步骤 1 中的文件夹)。
  4. 压缩之前的日志文件(保存space)。
  5. T运行按您可以定义的特定大小分类容器的日志文件。

备注:

  • 它使用shuf命令。确保您的 linux 发行版有它或将其更改为另一个 bash 支持的随机生成器。
  • 使用前,更改变量CONTAINER_NAME以匹配您的运行ning容器;它可以是部分名称(不必是完全匹配的名称)。
  • 默认情况下它 t运行 将日志文件设置为 10M(10 兆字节),但您可以通过修改变量 SIZE_TO_TRUNCATE 来更改此大小.
  • 它会在路径/opt/your-container-name/logs中创建一个文件夹,如果你想将压缩日志存储在其他地方,只需更改变量LOG_FOLDER.
  • 运行 在 运行 投入生产之前进行一些测试。
#!/bin/bash
set -ex

############################# Main Variables Definition:
CONTAINER_NAME="your-container-name"
SIZE_TO_TRUNCATE="10M"

############################# Other Variables Definition:
CURRENT_DATE=$(date "+%d-%b-%Y-%H-%M-%S")
RANDOM_VALUE=$(shuf -i 1-1000000 -n 1)
LOG_FOLDER="/opt/${CONTAINER_NAME}/logs"
CN=$(docker ps --no-trunc -f name=${CONTAINER_NAME} | awk '{print }' | tail -n +2)
LOG_DOCKER_FILE="$(docker inspect --format='{{.LogPath}}' ${CN})"
LOG_FILE_NAME="${CURRENT_DATE}-${RANDOM_VALUE}"

############################# Procedure:
mkdir -p "${LOG_FOLDER}"
cp ${LOG_DOCKER_FILE} "${LOG_FOLDER}/${LOG_FILE_NAME}.log"
cd ${LOG_FOLDER}
tar -cvzf "${LOG_FILE_NAME}.tar.gz" "${LOG_FILE_NAME}.log"
rm -rf "${LOG_FILE_NAME}.log"
truncate -s ${SIZE_TO_TRUNCATE} ${LOG_DOCKER_FILE}

您可以每月为 运行 以前的脚本创建一个 cronjob。首先运行:

sudo crontab -e

在键盘中键入 a 以进入编辑模式。然后添加以下行:

0 0 1 * * /your-script-path/script.sh

escape 键退出编辑模式。通过键入 :wq 并按回车键保存文件。确保 script.sh 文件具有执行权限。

也可以使用 docker run 命令设置限制。

docker run -it -d -v /tmp:/tmp -p 49160:8080 --name web-stats-app --log-opt max-size=10m --log-opt max-file=5 mydocker/stats_app