本文已参与「新人创作礼」活动,一起开启掘金创作之路。
docker 容器日志若不及时清理,则很容易导致主机磁盘空间满了,影响正常业务运行。
容器日志命令
docker logs 参数 容器id 查看容器日志.
参数:
-t显示时间戳-f实时查看日志打印-since 时间显示自某个 timestamp 之后的日志,或相对时间–until 时间显示自某个 timestamp 之前的日志,或相对时间--tail 数字显示最后多少条日志
eg:
查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
查看最近30分钟的日志:
$ docker logs --since 30m CONTAINER_ID
查看某时间之后的日志:
$ docker logs -t --since="2018-02-08T13:23:37" CONTAINER_ID
查看某时间段日志:
$ docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID
查看容器日志文件
在 linux 上, Docker 容器日志默认存放在 /var/lib/docker/containers/container_id/下面, 以 容器ID + -json.log结尾的文件就是该容器的日志文件.
查看各个日志文件大小的 shell 脚本如下:
#!/bin/sh
echo "======== docker containers logs file size ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
ls -lh $log
done
清理正在运行的容器的日志(治标)
如果 docker 容器正在运行, 那么使用 rm -rf 方式删除日志后, 通过 df -h 会发现磁盘空间并没有释放.
原因是在 Linux 系统中, 通过 rm -rf 或者文件管理器删除文件, 将会从文件系统的目录结构上解除链接(unlink). 如果文件是被打开的(有一个进程正在使用), 那么进程将仍然可以读取该文件, 磁盘空间也一直被占用. 正确姿势是 cat /dev/null > *-json.log, 当然你也可以通过 rm -rf 删除后重启 docker.
编写一个日志清理脚本内容如下:
#!/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 ========"
使用脚本 :
# chmod +x clean_docker_log.sh
# ./clean_docker_log.sh
但是, 这样清理之后, 随着时间的推移, 容器的日志依旧会占据很大的空间.
设置 Docker 容器的日志大小 ( 治本 )
① 设置一个容器服务的日志大小上限
在启动容器的时候增加一个参数设置该容器的日志大小, 及日志驱动.
--log-driver json-file 日志驱动
--log-opt max-size=[0-9+][k|m|g] 文件的大小
--log-opt max-file=[0-9+] 文件数量
然后重启 docker 守护进程:
// 重启 docker 守护进程
# systemctl daemon-reload
# systemctl restart docker
② 全局设置
编辑文件 /etc/docker/daemon.json, 增加以下日志的配置.
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
max-size=500m, 意味着一个容器日志大小上限是 500M,
max-file=3, 意味着一个容器有三个日志, 分别是 id+.json, id+1.json, id+2.json.
然后重启 docker 守护进程.