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

poi*_*rez 62 logging diskspace docker coreos

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

目前,我必须手动删除此文件以避免磁盘已满.我读到在Docker 1.8中会有一个参数来旋转日志.您推荐什么作为当前的解决方法?

poi*_*rez 75

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

--log-opt max-size=50m 
Run Code Online (Sandbox Code Playgroud)

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

  • 快速说明版本控制方案在Docker 1.13之后发生了变化.如果您有一个版本号,如`17.03.0-ce`,则意味着您正在使用新的1.13后版本控制方案. (4认同)

jak*_*aks 32

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

例:

version: '2'
services:
  db:
    container_name: db
    image: mysql:5.7
    ports:
      - 3306:3306
    logging:
      options:
        max-size: 50m
Run Code Online (Sandbox Code Playgroud)

  • 使用此日志记录部分重新启动我的服务可以,但是似乎没有任何效果,json日志文件只是像以前一样不断增长... (3认同)
  • 对于版本 3,请参阅 https://docs.docker.com/compose/compose-file/#logging (2认同)

Tar*_*han 18

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

version: "3.9"
services:
  some-service:
    image: some-service
    logging:
      driver: "json-file"
      options:
        max-size: "200k"
        max-file: "10"
Run Code Online (Sandbox Code Playgroud)

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

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

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

注意:只有json-filejournald驱动程序才能直接从 docker-compose up 和 docker-compose 日志中获取日志。使用任何其他驱动程序不会打印任何日志。

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


BMi*_*tch 15

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

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

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "log-driver": "local",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}
Run Code Online (Sandbox Code Playgroud)

本地日志驱动程序以内部格式(我相信 protobufs)存储日志内容,因此您将在相同大小的日志文件中获得更多的日志内容(或为相同的日志占用更少的文件空间)。本地驱动程序的缺点是日志转发器等外部工具,可能无法解析原始日志。要注意的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


gto*_*nic 8

警告:这篇文章涉及码头版本<1.8(没有--log-opt选项)

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

/var/lib/docker/containers/*/*-json.log {
hourly
rotate 48
compress
dateext
copytruncate
}
Run Code Online (Sandbox Code Playgroud)

直接在CoreOs节点上配置它或部署一个容器(例如https://github.com/tutumcloud/logrotate),它安装/ var/lib/docker来旋转日志.

  • 我不认为这是一个很好的解决方案.您需要退回正在运行的任何守护程序以停止写入旧日志并开始写入新日志.否则,Linux内核将继续引用内存中的旧日志文件(与磁盘相反).Logrotate可以使用普通守护进程执行此操作,但是反弹Docker或容器会导致停机. (7认同)

Vis*_*uth 5

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

sudo docker run -ti --name visruth-cv-container  --log-opt max-size=5m --log-opt max-file=10 ubuntu /bin/bash
Run Code Online (Sandbox Code Playgroud)

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