xiaoming728

xiaoming728

Docker容器日志查看与配置

2023-12-11
Docker容器日志查看与配置

来源:CSDN-Locutus

链接:https://blog.csdn.net/yjk13703623757/article/details/80283729

来源:CSDN-写代码的蓝胖子

链接:https://blog.csdn.net/huangliuyu00/article/details/90384345

1、问题

docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志如何清理?

2、查看Docker容器日志

在linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件(业务日志)很大。

查看各个日志文件大小的脚本docker_log_size.sh,内容如下:

#!/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  
# 设置脚本可执行权限
chmod +x docker_log_size.sh
# 启动脚本
./docker_log_size.sh

查询结果显示:

======== docker containers logs file size ========
-rw-r-----. 1 root root 33K 4月  14 10:34 /var/lib/docker/containers/d57a8ec2ef7a0b7ffffe316bb00041404308358fa5244b95dd0d599a13f65245/d57a8ec2ef7a0b7ffffe316bb00041404308358fa5244b95dd0d599a13f65245-json.log
-rw-r-----. 1 root root 28K 1月  28 20:08 /var/lib/docker/containers/ad2e10a57aba2c1c9ff3cec6581db03b4b70e196648a4e8ecba66d75927fa44f/ad2e10a57aba2c1c9ff3cec6581db03b4b70e196648a4e8ecba66d75927fa44f-json.log
-rw-r-----. 1 root root 645 1月  18 16:31 /var/lib/docker/containers/212ef1629aeac225f7de56e1989912a352a3f92cd50d08c5fba388adb57ffde5/212ef1629aeac225f7de56e1989912a352a3f92cd50d08c5fba388adb57ffde5-json.log
-rw-r-----. 1 root root 374M 4月  14 11:03 /var/lib/docker/containers/a8831197437bddc86b807753e146d55070dc036125aa3d34fc67822140f8304d/a8831197437bddc86b807753e146d55070dc036125aa3d34fc67822140f8304d-json.log
-rw-r-----. 1 root root 15G 4月  14 10:41 /var/lib/docker/containers/c9721b7cf6e956e6250d43a93cdc9a7b421bb9338d35a5a5d021855004abb364/c9721b7cf6e956e6250d43a93cdc9a7b421bb9338d35a5a5d021855004abb364-json.log
-rw-r-----. 1 root root 3.2K 2月  25 11:41 /var/lib/docker/containers/d27972bdc595f1b87f2f49e5ee10fff2b3419b76e6d5103a0c08e11433079a71/d27972bdc595f1b87f2f49e5ee10fff2b3419b76e6d5103a0c08e11433079a71-json.log
-rw-r--r--. 1 root root 1.5G 4月  14 10:44 /var/lib/docker/containers/4e23e075d62ff9217d7bddd3dba04c9cb4477728860e73906d3b2af871a77372/4e23e075d62ff9217d7bddd3dba04c9cb4477728860e73906d3b2af871a77372-json.log
-rw-r-----. 1 root root 3.1G 4月  14 11:02 /var/lib/docker/containers/0bc74214f5eacf999f10caa43405701b8381497e01197e9d4f27e1a021d8aa79/0bc74214f5eacf999f10caa43405701b8381497e01197e9d4f27e1a021d8aa79-json.log
-rw-r-----. 1 root root 12G 4月  14 11:03 /var/lib/docker/containers/e1691d4090e7a526f0f792d0b91f5814145393954dada013c76f8b5d77401a89/e1691d4090e7a526f0f792d0b91f5814145393954dada013c76f8b5d77401a89-json.log
-rw-r-----. 1 root root 54K 3月  10 09:41 /var/lib/docker/containers/61fd9b363b71fd0113769f292e5f393d325a230e6a030775a5ce88c670897f1c/61fd9b363b71fd0113769f292e5f393d325a230e6a030775a5ce88c670897f1c-json.log
-rw-r-----. 1 root root 22M 4月  14 11:03 /var/lib/docker/containers/b85667dfa132e108c5c21f35c130e8bce60faedcec5377cabcd49a34e82fe180/b85667dfa132e108c5c21f35c130e8bce60faedcec5377cabcd49a34e82fe180-json.log
-rw-r-----. 1 root root 18M 4月  14 11:02 /var/lib/docker/containers/9185d37555557b1213dc57e83e491985772785f1b8b4dbaa93837bffb7f4d2f3/9185d37555557b1213dc57e83e491985772785f1b8b4dbaa93837bffb7f4d2f3-json.log

3、清理Docker容器日志(治标)

如果docker容器正在运行,那么使用rm -rf方式删除日志后,通过df -h会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过rm -rf或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。

提供一个日志清理脚本clean_docker_log.sh,内容如下:

#!/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

但是,这样清理之后,随着时间的推移,容器日志会像杂草一样,卷土重来。


4、设置Docker容器日志大小(治本)

全局设置

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

{
    "registry-mirrors": [
        "https://reg-mirror.qiniu.com/",
        "https://hub-mirror.c.163.com/",
        "https://mu8wy6wu.mirror.aliyuncs.com/"
    ],
    "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
# 注意:设置的日志大小,只对新建的容器有效。

容器设置

另外在创建容器时也可以指定log文件的限制,添加log-opts参数,样例如下:

docker run \
--log-opt max-size=500m \
--log-opt max-file=3 \
......

max-size=500m,意味着一个容器日志大小上限是500M,

max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

5、参考文章

https://blog.csdn.net/xunzhaoyao/article/details/72959917

https://www.cnblogs.com/testzcy/p/7904829.html

https://docs.docker.com/config/containers/logging/configure/