Docker.logs-->日志清理

1.手动清理->切换到日志目录,直接执行命令


#找到需要清理日志的容器Id-->"0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60"
#可以格式化一下返回结果-->docker ps --format "{{.ID}}\t{{.Names}}"
docker ps

#容器默认目录-->"/var/lib/docker/containers"
cd /var/lib/docker/containers/0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60/

#查看容器中是否存在log日志文件-->发现确实存在日志文件.{0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60-json.log}
ll

#清除日志
cat /dev/null > 0cf869a294227d349c946292ea06e9dbfbf4c4a07e16c191e1b02a37a890cc60-json.log

#验证日志是否清除-->{test}为容器名称
docker logs test


自动清理->执行脚本清理Docker容器日志(治标)

#docker_logs_clean.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容器日志大小(治本)

单独容器设置

上述方法,日志文件迟早又会涨回来.
要从根本上解决问题,需要限制容器服务的日志大小上限.
这个通过配置容器docker-compose的max-size选项来实现


nginx:
image: nginx:1.12.1
restart: always
logging:
driver: “json-file”
options:
max-size: “5g”

重启nginx容器之后,其日志文件的大小就被限制在5GB,再也不用担心了.


全局设置

新建.{/etc/docker/daemon.json}(若有就不用新建了)
添加log-dirver和log-opts参数,样例如下↓


# 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、id+1.json、id+2.json。


// 重启docker守护进程
# systemctl daemon-reload
# systemctl restart docker

注意-->设置的日志大小,只对新建的容器有效.


附加脚本->查找日志的大小


#错误示范
[root@node1 ~]# mkdir /root/file/docker_scripts/logs_scripts
mkdir: cannot create directory ‘/root/file/docker_scripts/logs_scripts’: No such file or directory
#正确操作(参数.{-p}又忘了...)
[root@node1 ~]# mkdir -p /root/file/docker_scripts/logs_scripts
[root@node1 ~]# cd /root/file/docker_scripts/logs_scripts/

#在{/var/lib/docker/containers/}目录下查找以.log结尾的文件名

#查找-->log文件-->参数.{name}不忽略大小写
find /var/lib/docker/containers/ -name *-json.log

#查找-->log文件-->参数.{iname}不忽略大小写
find /var/lib/docker/containers/ -iname *-json.LOG

docker_logs_size.sh源码(正确版本)

#!/bin/bash

echo "=========docker containers logs file size ========="
#注意-->用户自定义变量,变量名称和值之间的等于号("=")不需要空格
logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs 
	do
		ls -lh $log
	done

#新建/编辑-->文件
vim docker_logs_size.sh


小结

小结

docker_logs_size.sh是我纯手打,
所以有一些意外的收获(报错),如果直接复制过来的话,
可能就不会发现这些小细节了...

并且有个报错-->logs: command not found,
这个需要有个思想的转换,直接搜索这个错误是不会有太大的提示作用的,
要理清楚,这一步是做什么导致出错的.
就像是做功能开发,要先理解需求,
要将问题抽象出来,
这个地方抽象出来的搜索关键字就是-->"Shell(Bash)用户自定义变量使用方法"


附加.1.错误版本

#!/bin/bash
o "=========docker containers logs file size ========="
logs = $(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs 
	do
		ls -lh $log
	done

附加.2.Shell(Bash)用户自定义变量使用方法示范

Shell(Bash)用户自定义变量使用方法示范(又是一个小细节)

#正确示范
[root@node1 logs_scripts]# name="ok"
[root@node1 logs_scripts]# echo $name
ok

#错误示范
[root@node1 logs_scripts]# name = "ok"
-bash: name: command not found


附加.3.报错集锦

报错-->拼写错误-->chmod

#"chomod"-->拼写错误.{"正确":"chmod","错误":"chomod"}
[root@node1 logs_scripts]# chomod +x docker_logs_size.sh
-bash: chomod: command not found
[root@node1 logs_scripts]# chmod +x docker_logs_size.sh

报错-->拼写错误-->chmod +x(如果多空格会报错)

#"chmod +x"-->拼写错误.{"正确":"chmod +x","错误":"chmod + x"}
[root@node1 logs_scripts]# chomod + x docker_logs_size.sh
[root@iZ2zeca7jric8sx4f3n7spZ logs]# chmod + x docker_logs_size.sh
chmod: cannot access 'x': No such file or directory
#正确
[root@node1 logs_scripts]# chmod +x docker_logs_size.sh

报错-->拼写错误-->"echo"

[root@node1 logs_scripts]# ./docker_logs_size.sh
./docker_logs_size.sh: line 1: o: command not found
./docker_logs_size.sh: line 2: logs: command not found


#修改{docker_logs_size.sh}源码
[root@node1 logs_scripts]# vim docker_logs_size.sh
#继续报错
[root@node1 logs_scripts]# ./docker_logs_size.sh
=========docker containers logs file size =========
./docker_logs_size.sh: line 2: logs: command not found
ls: cannot access logs: No such file or directory

#这个问题是由于用户自定义变量使用不规范导致

报错-->语法错误-->用户自定义变量

#错误示范(注意空格)
logs = $(find /var/lib/docker/containers/ -name *-json.log)
#正确示范
logs=$(find /var/lib/docker/containers/ -name *-json.log)

摘抄文档

posted @ 2021-04-25 08:52  zh89233  阅读(2419)  评论(0编辑  收藏  举报