docker 设置日志文件大小、个数及清理
docker容器在运行一定时间后会产生大量的日志,导致磁盘空间问题出现。
现在有2个方案可以限制docker容器日志文件大小及个数
容器范围内
docker run或dokcer create时添加参数
如创建并运行
docker run --log-opt max-size=10m --log-opt max-file=3
全局范围内
修改docker daemon.json文件,配置日志文件参数
默认 /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "1"
}
}
修改后,docker需要重新加载配置文件和重启。
CentOS7的操作
systemctl daemon-reload
systemctl restart docker
注意:新创建的容器会生效,原有容器不生效。
参数 说明
log-opts max-size 容器日志文件上限大小
log-opts max-file 窗口日志文件上限个数
查出Docker容器日志并删除脚本
默认查找目录 /var/lib/docker/containers/
#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
docker容器正在运行的话,使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。
原因是通过rm -rf删除,将会从文件系统的目录结构上解除链接(unlink)。
如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也是一直被占用。
正确操作覆盖操作 *cat /dev/null > -json.log。
或者可以通过rm -rf删除后重启docker容器。
————————————————
版权声明:本文为CSDN博主「写代码的蓝胖子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huangliuyu00/article/details/90384345
默认情况下,Docker 捕获所有容器的标准输出(和标准错误),并将其写入使用 JSON 格式的文件。这个 JSON 格式用每个行的来源(stdout 或 stderr)及其时间戳注释。每个日志文件都包含只有一个容器的信息。
1. 使用
要使用 json-file
驱动程序作为默认的日志驱动程序,需要设置 daemon.json
文件中的 log-driver
和 log-opt
关键字为合适的值。这个文件通常在 /etc/docker/
(Linux)或 C:\ProgramData\docker\config\daemon.json
(Windows)。更多信息参考 daemon.json
。
下面示例设置日志驱动程序为 json-file
并设置了 max-size
选项。
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m"
}
}
重新启动 Docker 以使更改对新创建的容器生效。现有容器即使重启 Docker 也不会使用新的日志记录配置。
可以在 docker container create
或 docker run
命令中通过 --log-driver
标志为某个特定容器设置日志驱动程序:
$ docker run \
--log-driver json-file --log-opt max-size=10m \
alpine echo hello world
1.1 选项
json-file
日志驱动程序支持下面的日志选项:
选项 | 描述 | 示例值 |
---|---|---|
max-size |
滚动前日志的最大大小。一个正整数加上一个代表测量单位(k,m 或 g)的修饰符。默认为 -1(无限制)。 | --log-opt max-size=10m |
max-file |
可以存在的最大日志文件数量。如果滚动日志会创建多余文件,则会删除最旧的文件。只有在设置了 max-size 时才有效。一个正整数。 默认为1。 |
--log-opt max-file=3 |
labels |
在启动 Docker 守护进程时适用。守护进程接受的日志相关标签的逗号分隔列表。用于高级日志标记选项。 | --log-opt labels=production_status,geo |
env |
在启动 Docker 守护进程时适用。此守护程序接受的与日志相关的环境变量的逗号分隔列表。用于高级日志标记选项。 | --log-opt env=os,customer |
env-regex |
与 env 类似且兼容。一个正则表达式来匹配与日志相关的环境变量。用于高级日志标记选项。 |
`–log-opt env-regex=^(os |
1.2 示例
这个例子启动的 alpine 容器最多有 3 个日志文件且每个日志文件不大于 10MB。
$ docker run -itd --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 alpine ash
1. 问题
docker容器日志导致主机磁盘空间满了。docker logs -f container_name 发现大量日志
占用空间,不用的日志可以清理掉了。
2. 解决方法
2.1 查出Docker容器日志并删除脚本
在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/
下面, 以json.log结尾的文件(业务日志)很大,查看各个日志文件大小的脚本docker_log_size.sh,内容如下:
1 #!/bin/sh 2 echo "======== start clean docker containers logs ========" 3 logs=$(find /var/lib/docker/containers/ -name *-json.log) 4 for log in $logs 5 do 6 echo "clean logs : $log" 7 cat /dev/null > $log 8 done 9 echo "======== end clean docker containers logs ========"
如果docker容器正在运行,那么使用rm -rf
方式删除日志后,通过df -h
会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf
或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log
,当然你也可以通过rm -rf
删除后重启docker。
2.2 设置Docker容器日志大小(治本)
- 设置一个容器服务的日志大小上限
上述方法,日志文件迟早又会涨回来。要从根本上解决问题,需要限制容器服务的日志大小上限。这个通过配置容器docker-compose的max-size选项来实现
nginx: image: nginx: 1.12 . 1 restart: always logging: driver: "json - file"
options: max - size: " 50m"
max-file: "2"
|
重启nginx容器之后,其日志文件的大小就被限制在100MB,再也不用担心了。
- 全局设置
新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:
1
2
3
4
5
6
7
|
# vim /etc/docker/daemon.json { "registry-mirrors" : [ "http://f613ce8f.m.daocloud.io" ], "log-driver" : "json-file" , "log-opts" : { "max-size" : "500m" , "max-file" : "3" } # max-size=500m,意味着一个容器日志大小上限是500M,max-file=3,意味着一个容器有三个日志,分别是id-json.log、id-json.log.1、id-json.log.2。 } / / 重启docker守护进程 # systemctl daemon-reload 、# systemctl restart docker |
注意:设置的日志大小,只对新建的容器有效。
https://www.cnblogs.com/kaishirenshi/p/10670107.html