docker 日志清理的实际管理措施
场景: 当我们在实际业务场景中,是用docker 或者使用k8s 部署我们的服务时, 服务在运行过程中打印的 print 日志,实际上是被记录的 在 “/var/lib/container/docker/overlay2/{dockerid}/” 路径下的 *-json.log 日志中. 如果不控制当前服务日志的输出量级以及应用日志向控制台日志输出级别, 那么 docker 中的 日志文件的增量是巨大的。
我们可以通过 docker 命令 来查看 docker 磁盘 占用空间情况
docker system df
如下shell 脚本 直接运行,清理服务器中的docker 已产生的日志,如果你的应用是群集时,你可以将如下脚本 通过POERJOB 或者 XXL-JOB 或者 在构建一个
ansible shell 定时脚本来清理群集中每台机子的 docker日志。
- delete-docker-logs.sh
#!/bin/bash for i in `find /var/lib/docker/containers -name *-json.log`;do cat /dev/null > $i;done
或者 delete-docker-logs.sh 的脚本 也可以 使用 docker 原生管理命令:
docker system prune -a // 【慎用】命令清理更干净、彻底,可以将没有容器使用的Docker镜像都删掉
note 踩坑记录: 通过 docker system prune -a 清理了无用的镜像后 或者通过上述 命令清理docker 日志后,系统磁盘var/lib/container/docker/overlay2/{dockerid}/文件占用磁盘还是很大,那么,继续是用 du -sh * 命令继续往下查,发现,var/lib/container/docker/overlay2/{dockerid}/ 具体实例的 执行 下的 diff 和 merged 占用很大的磁盘空间, 基本上docker 执行 的系统日志输出,进入 diff 下的 tmp 目录下,将其日志清理掉就行.
下面介绍下 通过 ansible 执行多台机子的脚本 delete-docker-logs.sh
- 安装 ansible
yum install ansible
- 配置hosts,ansible 安装完成默认配置文件在/etc/ansible里面,需要配置host才能进行脚本分发
cat /etc/ansible/hosts [all] 填写ip ansible_ssh_port=22 ansible_ssh_user=用户名 ansible_ssh_pass=密码 填写ip ansible_ssh_port=22 ansible_ssh_user=用户名 ansible_ssh_pass=密码
- ansible-delete-logs.sh
#!/bin/bash ansible all -m copy -a "src=/etc/ansible/delete-docker-logs.sh dest=/tmp/" ansible all -m shell -a 'chmod u+x /tmp/delete-logs.sh && sh /tmp/delete-logs.sh' echo $(date +"%Y-%m-%d:%T") >> /tmp/delete-k8s-log.txt
最后还是建议大家通过 POWERJOB 来群集管理多台机子的运维脚本,会更加方便。