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 ~]#
可以看到那个日志文件竟然占据了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