问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Docker容器日志导致磁盘占满?这份定时清理方案请收好!

创作时间:
作者:
@小白创作中心

Docker容器日志导致磁盘占满?这份定时清理方案请收好!

引用
CSDN
1.
https://m.blog.csdn.net/m0_53589360/article/details/145699151

在使用Docker时,容器日志的积累可能会导致服务器磁盘空间被占满。本文将介绍如何定位磁盘占用问题,并提供一个定时清理Docker容器日志的脚本方案,帮助你有效管理磁盘空间。

问题定位

要解决磁盘空间被占满的问题,首先需要定位是哪个目录占用了大量空间。以下是具体步骤:

  1. 查看磁盘使用情况:

    df -h
    
  2. 使用以下命令依次递归找出磁盘占用最高的目录:

  • 切换到Docker数据目录:
    cd /var/lib/docker/
    
  • 统计当前目录文件磁盘占用率:
    du -h --max-depth=1
    
    或者
    du -sh * | sort -nr
    

解决方案

为了解决Docker容器日志占用磁盘空间的问题,可以编写一个定时日志清理脚本。该脚本将Docker容器产生的日志先复制到临时目录保存,超过七天则自动删除,然后清空Docker容器原文件的内容。

以下是具体的Shell脚本内容:

#!/bin/bash
# 功能:定时清除docker容器日志
# 1.现将日志文件移动到临时日志文件夹
# 2.当临时日志文件夹日志超过七天则自动清除
# 3.将每天执行的计划记录到脚本执行日志

echo "======== start clean docker containers logs ========" >> "exec_log_file"

# 定义变量
docker_logs_dir="/var/lib/docker/containers/"
target_dir="/home/hvpc/logs/docker-log/"
max_days=1
exec_log_file="/home/hvpc/logs/docker-log/docker-logs-clean-execution.log"
script_path=/home/script/docker-logs-clean.sh

# 记录脚本执行时间
echo "Script execution log - $(date)" >> "$exec_log_file"

# 找出并处理日志文件
find "$docker_logs_dir" -name '*-json.log' |
while IFS= read -r log_file; do
    echo "Found log file: $log_file"
    # 获取文件名
    filename=$(basename "$log_file")
    # 复制日志文件到暂存目录
    cp "$log_file" "$target_dir$filename"
    echo "Log file moved to temporary storage: $target_dir" >> "$exec_log_file"
    # 清空原始文件内容
    truncate -s 0 "$log_file"
    echo "Original log file $log_file content cleared" >> "$log_file"
done

# 查找暂存目录下超过7天的日志文件
old_logs=$(find "$target_dir" -name '*-json.log' -type f -mtime +$max_days)
if [ -n "$old_logs" ]; then
    # 如果找到符合条件的日志文件,删除它们
    echo "找到超过 $max_days 天的日志文件:"
    echo "$old_logs"
    echo "正在删除..."
    find "$target_dir" -type f -mtime +$max_days -exec rm -f {} \;
    echo "已删除超过 $max_days 天的日志文件:$old_logs" >> "$exec_log_file"
else
    # 如果未找到符合条件的日志文件,显示提示信息
    echo "未找到超过 $max_days 天的日志文件" >> "$exec_log_file"
fi

# 检查是否已经存在定时任务
if ! crontab -l | grep -q "$script_path"; then
    # 如果不存在,添加定时任务
    echo "添加定时任务..."
    echo "0 3 * * * /bin/bash $script_path" | crontab -
    echo "已添加定时任务"
fi

# 写入脚本执行结束信息
echo "Script execution completed" >> "$exec_log_file"

拓展命令

为了更好地管理和查看日志文件,以下是一些常用的Linux命令示例:

  1. 将脚本上传至目录:

    cd /etc/cron/
    
  2. 设置脚本执行权限:

    chmod 777 docker-logs-clean.sh
    
  3. 修改crontab:

    crontab -e
    
  4. 加入定时计划:

    0 2 */1 * * sh /root/clean_docker_log.sh
    
  5. 查看定时计划是否生效:

    crontab -l
    
  6. 日志搜索:

    grep "error" logfile.log
    
  7. 动态日志搜索:

    tail -f logfile.log | grep "error"
    
  8. 在某个目录下的文件中搜索:

    grep -r "error" /path/to/directory
    
  9. 查找文件:

    find /path/to/search -name "*.txt" -type f  # 查找所有扩展名为 .txt 的文件
    
  • -name:指定文件名
  • -type:指定文件类型,f代表文件,d代表目录
  • -size:指定文件大小
  • -perm:指定文件权限
  1. 查找文件夹下面的文件个数:
    ls -l | grep "^-" | wc -l
    
  • ls -l:列出当前目录下的所有文件和详细信息。
  • grep "^-":筛选出普通文件(不包括目录和其他特殊类型的文件)。
  • wc -l:对筛选出的普通文件进行行数统计,即文件的数量。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号