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


76

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

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


2
作为当前的解决方法,如果对您而言不重要,则可以完全关闭日志。这可以通过使用启动docker daemon来完成--log-driver=none。如果只想禁用特定容器的日志,则可以--log-driver=nonedocker run命令中使用来启动它们。另一种选择是将外部存储安装到/var/lib/docker。例如NFS共享或具有比所讨论的主机更大的存储容量的东西。
Dharmit

2
或使用journald日志驱动程序,并记录日志担心日志轮换。
larsk's

@Dharmit它在CoreO上的什么位置?
poiuytrez

@larsks如何在CoreOS上执行此操作?看来已安装了journald,并在/ var / log / journal中生成了日志,但我也已在/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log中登录
poiuytrez

1
@poiuytrez在哪里?如果您愿意使用建议的选项启动Docker守护程序,则/usr/lib/systemd/system/docker.service可能是该文件。我不确定在CoreOS上。在CentOS上,这就是位置。至于其他问题,您需要更改Docker守护程序的选项以journald用作日志记录驱动程序。然后它将使用日记记录日志容器,而不是登录/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log。如果我缺少某些东西,@ larsks可以纠正我。
Dharmit

Answers:


83

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

--log-opt max-size=50m 

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


请注意,这似乎仅适用于JSON和流利的日志。
dman

5
请注意,在Docker 1.13之后,版本控制方案发生了变化。如果您使用的是这样的版本号17.03.0-ce,则表示您正在使用新的1.13版以后的版本控制方案。
三人房

知道
docker

41

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

例:

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

3
使用此日志记录部分重新启动我的服务可以,但是似乎没有任何效果,json日志文件像以前一样一直在增长……
dokaspar


9

警告:此文章与<1.8的docker版本有关(没有该--log-opt选项)

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

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

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


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

1
好点,我同意。这个答案是在Docker(tm)的早期提供的,与此同时,已构建的功能(如另一个答案中提到的)应该可以完成工作。
gtonic

这有一些问题,它轮换日志,但是磁盘消耗仍然显示类似的问题。我当时使用的是v5.0.2,然后必须使用get.docker.com脚本将其升级到最新版本,才能在docker create或run命令中使用--log-opt选项。
v_sukt

5

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

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指定要轮换的最大文件数。


4

[此答案涵盖了被问到很久之后遇到此问题的人员的最新版本的Docker。]

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

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

然后,systemctl reload docker如果您使用的是systemd,请重新加载docker(否则,请使用相应的重新启动命令进行安装)。

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

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

本地日志记录驱动程序以内部格式(我相信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


1

docker-compose版本1的示例:

mongo:
  image: mongo:3.6.16
  restart: unless-stopped
  log_opt:
    max-size: 1m
    max-file: "10"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.