Logging Docker容器日志占用我的所有磁盘空间
我正在虚拟机上运行一个容器。默认情况下,我的容器将日志写入/var/lib/docker/containers/container\u ID/container\u ID-json.log文件,直到磁盘已满 目前,我必须手动删除此文件,以避免磁盘被填满。我读到Docker 1.8中会有一个参数。Logging Docker容器日志占用我的所有磁盘空间,logging,docker,coreos,diskspace,Logging,Docker,Coreos,Diskspace,我正在虚拟机上运行一个容器。默认情况下,我的容器将日志写入/var/lib/docker/containers/container\u ID/container\u ID-json.log文件,直到磁盘已满 目前,我必须手动删除此文件,以避免磁盘被填满。我读到Docker 1.8中会有一个参数。 您建议当前的解决方法是什么?注意:此帖子涉及docker版本
您建议当前的解决方法是什么?注意:此帖子涉及docker版本<1.8(没有
--log opt
选项)
为什么不使用logrotate(它也支持压缩)
直接在CoreOs节点上配置它,或者部署一个容器(例如),该容器装载/var/lib/docker以旋转日志。docker 1.8已发布,带有日志旋转选项。添加:
--log-opt max-size=50m
当容器被启动时,就完成了这个任务。您可以通过以下网站了解更多信息:
注意:这仅适用于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)存储日志内容,因此在相同大小的日志文件中可以获得更多的日志内容(或者为相同的日志占用更少的文件空间)。本地驱动程序的缺点是日志转发器等外部工具可能无法解析原始日志。请注意,docker日志
仅在日志驱动程序设置为json file
、local
或journald
时有效
max size
是docker日志文件的限制,因此它包括json或本地日志格式化开销。max file
是docker将维护的日志文件数。在一个文件达到大小限制后,日志将被旋转,当您超过max file
时,最早的日志将被删除
有关更多详细信息,docker在以下位置提供了所有驱动程序的文档:
我也有一个关于这个主题的演讲。使用
P
查看演示者备注:作为当前的解决方法,如果日志对您不重要,您可以完全关闭日志。这可以通过使用--log driver=none
启动docker守护程序来完成。如果只想禁用特定容器的日志,可以在docker run
命令中使用--log driver=none
启动它们。另一种选择是将外部存储器装载到/var/lib/docker
。比如NFS共享或比所讨论的主机具有更多存储容量的东西。或者使用日志驱动程序,让日志担心日志旋转。@Dharmit它在CoreOs上位于何处?@larsks我如何在CoreOs上做到这一点?似乎在/var/log/journal中安装了journald并生成了日志,但在/var/lib/docker/containers/CONTAINER\u ID/CONTAINER\u ID-json中也有日志。log@poiuytrez什么位于哪里?如果您愿意使用建议的选项启动Docker守护程序,/usr/lib/systemd/system/Docker.service
可能是该文件。我不确定科雷奥斯的情况。在CentOS,这就是位置。至于其他问题,您需要更改Docker守护进程的选项,以使用journald
作为日志驱动程序。然后它将使用日志记录容器,而不是登录到/var/lib/docker/containers/CONTAINER\u ID/CONTAINER\u ID-json.log
@如果我遗漏了什么,拉尔克斯会纠正我。我认为这不是一个好的解决办法。您需要反弹正在运行的任何守护进程,以停止写入旧日志并开始写入新日志。否则,Linux内核将继续引用内存中的旧日志文件(与磁盘相反)。Logrotate可以在正常的守护进程中实现这一点,但是跳转Docker或容器会导致停机。我同意这一点。这个答案是在Docker(tm)的早期提供的,同时构建的功能(如另一个答案中提到的)应该可以完成这项工作。这有一些问题,它会轮换日志,但磁盘消耗仍然显示类似的情况。我使用的是v5.0.2,然后不得不将其升级到最新版本,并使用脚本--log opt选项和docker create或run命令。请注意,这似乎仅适用于JSON和fluentd日志。请注意,docker 1.13之后版本控制方案发生了变化。如果你有一个像17.03.0-ce
这样的版本号,这意味着你在新的1.13版后的版本控制计划中。只知道docker会进行日志轮换是一个有用的事实。使用此日志部分重新启动我的服务会起作用,但似乎没有任何效果,json日志文件会像以前一样不断增长……有关版本3,请参阅
{
"log-driver": "local",
"log-opts": {"max-size": "10m", "max-file": "3"}
}