解决docker容器日志导致主机磁盘空间占满【生产实操】

问题:docker容器日志导致主机磁盘空间满了

Docker在不重建容器的情况下,日志文件默认会一直追加,时间一长会逐渐占满服务器的硬盘的空间,内存消耗也会一直增加。

docker logs -f container_name噼里啪啦一大堆很占用空间,致使磁盘空间被占满。

解决方案 :

第一种 : 脚本实现

clean_logs.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   =========================="

编写定时任务,定时清理:

[root@wsc~]# crontab -e
	
0 0 0 * * /bin/sh /opt/clean_logs.sh &>/dev/null

[root@wsc ~]# crontab -l
	
0 0 0 * * /bin/sh /opt/clean_logs.sh &>/dev/null

第二种: 设置Docker容器日志大小(治本)

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

logging:
      driver: "json-file"
      options:
        max-size: "500m"      # 日志文件大小
        max-file: "6"		# 日志的数量

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

容器范围内

#docker run时添加--log-opt max-size=500m --log-opt max-file=3参数,如创建并运行
docker run -name xxx -p 80:80 --log-opt max-size=500m  --log-opt max-file=3 xxx:v1 

第三种: 全局设置(治根)

Docker 日志分为两类:

  • Docker 引擎日志(也就是 dockerd 运行时的日志),
  • 容器的日志,容器内的服务产生的日志。

常用查看日志命令——docker logs

Docker 日志 驱动:默认的日志驱动—JSON

所有容器默认的日志驱动 json-file

json-file 日志驱动 记录从容器的 STOUT/STDERR 的输出 ,用 JSON 的格式写到文件中,日志中不仅包含着 输出日志,还有时间戳和 输出格式。下面是一个 ping www.baidu.com 对应的 JSON 日志

{"log":"64 bytes from 14.215.177.39: seq=34 ttl=55 time=7.067 ms\r\n","stream":"stdout","time":"2019-05-16T14:14:15.030612567Z"}

json-file 日志的路径位于 /var/lib/docker/containers/下格式:/var/lib/docker/containers/container_id/container_id-json.log

选项 描述 示例值
max-size 切割之前日志的最大大小。可取值单位为(k,m,g), 默认为-1(表示无限制)。 --log-opt max-size=10m
max-file 可以存在的最大日志文件数。如果切割日志会创建超过阈值的文件数,则会删除最旧的文件。仅在max-size设置时有效。正整数。默认为1。 --log-opt max-file=3

配置文件 /etc/docker/daemon.json 添加log-dirver和log-opts参数:

#	max-size=500m,意味着一个容器日志大小上限是500M,
#	max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。
	
{
   "log-driver":"json-file",
   "log-opts": {"max-size":"500m", "max-file":"3"}
}

CentOS7的操作:修改配置文件后重启docker守护进程

	systemctl daemon-reload
	systemctl restart docker

注意:设置的日志大小,只对新建的容器有效。



扩展

查出占用磁盘较大的文件

Docker 的日志文件存在 /var/lib/docker/containers 目录中,通过下面的命令可以将日志文件夹根据升序的方式罗列出来。

sudo du -d1 -h /var/lib/docker/containers | sort -h



40K     /var/lib/docker/containers/7bbec35275e8f63784107d486c9c40cb62902afd6815c569b36947f0b0ed6405

40K     /var/lib/docker/containers/7df78d67728173c13b4a238518b79d4b4a384d38026102a61aef290e53f2f1a6

40K     /var/lib/docker/containers/8d59b4f970a1b5cb20fc281d73f5c643bd0514b25cac3e0fae13bcec99c45e05

40K     /var/lib/docker/containers/965375d69bca2e43a4f7d3306508cc1db40fa0b783b1d7fe4b6fa7e333926b8c

40K     /var/lib/docker/containers/e04e90f0d466ab5b969fd72894b23444d495a84591b1e93d5bef03da30b1fc2d

40K     /var/lib/docker/containers/f31069b69d329fcac0939bbb6310afa66535ff4573591414fbfabecdb0eeeb79

44K     /var/lib/docker/containers/1995f5cf52e09b3d6d2ec6760e3e29c51b645d1629a7f65415abb984a370bea4

44K     /var/lib/docker/containers/44fdc73c0e48797faffdfd4abe17ccdc3e617542d68f6f5a073bbfc343fdc0dd

44K     /var/lib/docker/containers/c3cb05fd745cfa1d527717ef63d7f9cc0dd81530d4f432538ce4fb89c0b1655f

164K    /var/lib/docker/containers/c742626988ae6237b0fc591b0604313b5ca29ebec4d91173cab3ef838d2a8967

448K    /var/lib/docker/containers/8d4ea3635d5cf9cb09b3f3652df29727288ef01adfc9963291ef53a7ed1f8a91

536K    /var/lib/docker/containers/16b599deca2f0e80024e1a342aec281c5578909c564a4a1127c92985396b91e4

1.4M    /var/lib/docker/containers/426d63b3423eaded89f4ecf1b35493f79f654903d8655af321b24307cc763e8e

5.5M    /var/lib/docker/containers/5206c2f48bd01de60a5c6576e7607ffcc6be3def17ee5dbc2be393311c2638c2

9.3M    /var/lib/docker/containers

清理单个文件

感觉哪个容器的日志太大就清理哪个

#${log_file} 就是日志文件
sudo sh -c "cat /dev/null > ${log_file}"

可以通过find命令查找全部日志

sudo find /var/lib/docker/containers -name *.log
/var/lib/docker/containers/7b3fd134954c459695092e4b79e840e7d864f6dd19b468af92ea3f83663b12b2/7b3fd134954c459695092e4b79e840e7d864f6dd19b468af92ea3f83663b12b2-json.log
/var/lib/docker/containers/dd88e4755c5bcacdbd540d21f0392c8d04a5317123a1b99ba2926ae59a72b7d0/dd88e4755c5bcacdbd540d21f0392c8d04a5317123a1b99ba2926ae59a72b7d0-json.log
/var/lib/docker/containers/7a854e0a7ca1e5029a1ac4aa689d48103d7240bded3c17f414a63368b4534da1/7a854e0a7ca1e5029a1ac4aa689d48103d7240bded3c17f414a63368b4534da1-json.log
/var/lib/docker/containers/965375d69bca2e43a4f7d3306508cc1db40fa0b783b1d7fe4b6fa7e333926b8c/965375d69bca2e43a4f7d3306508cc1db40fa0b783b1d7fe4b6fa7e333926b8c-json.log
/var/lib/docker/containers/54ef85ae58acd8fdfd028efa4e393512f4741ec3c5b0c3d690698c89c29256ac/54ef85ae58acd8fdfd028efa4e393512f4741ec3c5b0c3d690698c89c29256ac-json.log
/var/lib/docker/containers/90a9707a0edb5f38acff7e4bd225b4bea0e2f5aa12e56ed436af0ef6a88d1e28/90a9707a0edb5f38acff7e4bd225b4bea0e2f5aa12e56ed436af0ef6a88d1e28-json.log
/var/lib/docker/containers/c00c03b592b00931d7885aa4e9081f749ce844a9bdc2995e9d6bb46ed1277666/c00c03b592b00931d7885aa4e9081f749ce844a9bdc2995e9d6bb46ed1277666-json.log
/var/lib/docker/containers/ac6bc5a3db5be1f5c5a400d3b4d34427e55373aa50498594451bc48d73784248/ac6bc5a3db5be1f5c5a400d3b4d34427e55373aa50498594451bc48d73784248-json.log
/var/lib/docker/containers/e0136d5b180b7f85175e6a9db027a29bbcbc99ce077b96fda35987951dd5bae7/e0136d5b180b7f85175e6a9db027a29bbcbc99ce077b96fda35987951dd5bae7-json.log
...

或者查看具体容器名称的日志位置

docker inspect --format='{{.LogPath}}' containerName

/var/lib/docker/containers/c742626988ae6237b0fc591b0604313b5ca29ebec4d91173cab3ef838d2a8967/c742626988ae6237b0fc591b0604313b5ca29ebec4d91173cab3ef838d2a8967-json.log

你可能感兴趣的:(docker,项目发布,Linux,docker,linux,运维)