docker容器在运行一定时间后会产生大量的日志,导致磁盘空间满等各种问题出现。为什么会有这么多日志? 其实就是我们的应用程序的日志的标准输出。 如果我们关闭了我们的应用程序的日志的标准输出,那么就不会有那么多的Docker容器日志输出了!


日志查看

想查看docker 容器日志, 使用 docker logs -f  容器id

我一试,结果, 一直滚动,非常快的速度输出日志, 5分钟都没有结束,根本看不过来。

而且发现很多错误,奇了怪了, 我的服务都没有去访问它,怎么会这么多错误? (后面发现,那是几天前的日志。。。  郁闷。)


那么 这个目录读取的是是哪个文件呢,

一番搜索后发现是docker启动后日志存储在/var/lib/docker/containers/容器ID/目录中:

其实,每个容器的日志默认都会以 json-file 的格式存储于/var/lib/docker/containers/<容器id>/<容器id>-json.log 下,不过并不建议去这里直接读取内容,因为容器的日志则可以通过 docker logs命令来访问,而且可以像 tail -f 一样,使用 docker logs -f 来实时查看。如果使用 Docker Compose,则可以通过 docker-compose logs <服务名> 来查看。


进去看看吧

[root@localhost ~]# ll /var/lib/docker/containers/5d0850565ed86eacae4b7e369e8cfe5459788c536a31ae96de65308ab6026192/

总用量 536084

-rw-r----- 1 root root 280503640 12月 2 17:47 5d0850565ed86eacae4b7e369e8cfe5459788c536a31ae96de65308ab6026192-json.log

drwx------ 2 root root 6 11月 26 16:21 checkpoints

-rw------- 1 root root 3843 12月 2 17:32 config.v2.json

-rw-r--r-- 1 root root 1585 12月 2 17:32 hostconfig.json

-rw-r--r-- 1 root root 22 12月 2 17:32 hostname

-rw-r--r-- 1 root root 158 12月 2 17:32 hosts

drwx------ 2 root root 6 11月 26 16:21 mounts

-rw-r--r-- 1 root root 1 12月 2 17:32 resolv.conf

[root@localhost ~]#


#yyds干货盘点# docker容器日志管理_容器日志

可以看到那个日志文件竟然占据了268M 236 M,  难怪docker log 的时候滚动了那么久


怎么办?docker logs -f --tail num 容器id, 其中-f 表示跟随日志的输出、--tail 表示末尾、num 表示想要查看的日志的行数

注意 --tail 需要后面跟一个数字,

否则:

[root@localhost ~]# docker logs -f --tail 5d

"docker logs" requires exactly 1 argument.

See 'docker logs --help'.

Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

而正确的用法是 docker logs -f  --tail 5  5d 

可以同时指定 -f  和 --tail

-t 并不是 --tail  的缩写! 


官方说明是

[root@localhost ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
42m for 42 minutes)
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
42m for 42 minutes)
[root@localhost ~]#

另外, 我们也可以指定 一个时间, 使用 since, 看来 docker 是很贴心。

但是呢, 如果一直不删除,或者日志打印过快了, 日志是可能爆满的。。


日志删除

从上面可以知道docker容器日志存储在文件中,容器销毁后/var/lib/docker/containers/<容器id>/目录会被自动删除,所以容器日志也被一并删除。如果容器一直运行并且一直产生日志,容器日志会导致磁盘空间爆满,如何解决这个问题?


现在有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"
}
}

参数说明

log-opts max-size   容器日志文件上限大小

log-opts max-file    窗口日志文件上限个数

修改后,docker需要重新加载配置文件和重启。

CentOS7的操作

systemctl daemon-reload

systemctl restart docker

注意:新创建的容器会生效,原有容器不生效。



手动删除Docker容器日志

如果我们的日志没有触发自动删除(过期日志),那么我们也可以手动删除。

首先当然是查出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容器。


————————————————

部分参考:https://blog.csdn.net/huangliuyu00/article/details/90384345