Docker 容器日志清理

🚀 作者主页: 有来技术

🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot

🌺 仓库主页: Gitee 💫 Github 💫 GitCode

💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正!

目录

  • Docker 容器日志查看
  • Docker 容器日志清理
    • 单容器日志清理
    • 所有容器日志清理
    • 定时清理
    • 设置 Docker 容器日志大小限制
      • 全局设置
      • 单容器设置
      • 常用命令

        Docker 容器日志查看

        查看所有容器数据大小并按倒序排列:

        du -d1 -h /var/lib/docker/containers | sort -rh
        
        • du: 用于估算文件或目录空间使用量。
        • -d1: 仅显示深度为1的目录,即只显示直接子目录的信息。
        • -h: 以人类可读的格式显示文件大小。
        • /var/lib/docker/containers: 要查看的目录路径,这是 Docker 存储容器数据的默认路径。
        • sort -rh: 对 du 的输出进行排序。-r 表示逆序(降序),-h 表示以人类可读的格式排序(KB、MB、GB)。

          上图可以看到容器ID为 5c51773bc35d19d69c8f07895232295e4abeb0c9f25e25ca3884fec6ebd6f3fa 的数据较大。

          cd /var/lib/docker/containers/5c51773bc35d19d69c8f07895232295e4abeb0c9f25e25ca3884fec6ebd6f3fa
          # 查看容器数据目录下的文件大小
          du -sh * | sort -rh
          

          Docker 容器日志清理

          单容器日志清理

          直接使用 rm -rf -json.log 删除日志文件可能导致文件被占用,因为容器仍在运行,并且可能仍在使用该文件的文件描述符。这样的操作可能会导致文件系统空间不会立即释放。

          为确保不中断容器日志记录,并释放文件描述符,可以使用以下命令:

          truncate -s 0 -json.log
          

          这个命令会将指定文件的大小截断为零字节,但不会删除文件。这样,容器的日志文件会被清空,但文件描述符仍然保持打开,不会影响正在运行的容器。

          所有容器日志清理

          创建了一个名为 clean_docker_logs.sh的清理脚本

          touch clean_docker_logs.sh
          vi clean_docker_logs.sh
          

          复制下面内容至 clean_docker_logs.sh

          #!/bin/bash
          # Docker容器日志清理脚本
          # 设置Docker日志文件存储路径
          log_path="/var/lib/docker/containers"
          # 获取所有容器ID
          container_ids=$(ls -1 $log_path)
          # 循环处理每个容器
          for container_id in $container_ids; do
              # 构造日志文件路径
              log_file="${log_path}/${container_id}/${container_id}-json.log"
              # 检查日志文件是否存在
              if [ -f "$log_file" ]; then
                  echo "清理容器 ${container_id} 的日志文件: ${log_file}"
                  
                  # 清空日志文件
                  truncate -s 0 "$log_file"
              else
                  echo "未找到容器 ${container_id} 的日志文件: ${log_file}"
              fi
          done
          echo "日志清理完成。"
          

          将 clean_docker_logs.sh 脚本复制到 /usr/local/bin 目录(这个目录通常包含用户自己安装的可执行文件),并给予执行权限:

          cp clean_docker_logs.sh /usr/local/bin/
          chmod +x /usr/local/bin/clean_docker_logs.sh
          

          然后执行清理脚本:

          sh /usr/local/bin/clean_docker_logs.sh
          

          执行完清理脚本查看所有容器的日志已清理完毕

          定时清理

          如果想将清理容器日志的操作做成一个定时任务,可以使用 cron 作业。

          编辑 cron 表

          crontab -e
          

          在文件末尾添加类似如下行,以每天凌晨凌晨执行清理任务为例:

          0 0 * * * /usr/local/bin/clean_docker_logs.sh
          

          第一个字段(0):分钟(0-59)

          第二个字段(0):小时(0-23)

          第三个字段():天(1-31)

          第四个字段():月份(1-12)

          第五个字段(*):星期几(0-6,0 表示星期日)

          Docker 容器的日志大小可以通过 Docker Daemon 的配置进行全局设置,也可以通过在运行容器时指定参数进行单独设置。

          设置 Docker 容器日志大小限制

          全局设置

          要在 Docker Daemon 上全局设置日志大小,你需要修改 Docker Daemon 的配置文件(通常是 /etc/docker/daemon.json)。

          打开 Docker Daemon 配置文件:

          nano /etc/docker/daemon.json
          

          如果文件不存在,你可能需要创建它。在文件中添加以下配置:

           { "log-driver": "json-file",
               "log-opts": { "max-size": "10m",  # 设置日志文件最大大小
                 "max-file": "3"     # 设置最大日志文件数量
               }
             }
          

          这里的 "max-size": "10m" 表示每个日志文件的最大大小为 10MB,而 "max-file": "3" 表示保留最多 3 个旧的日志文件。

          重新启动 Docker 服务,以应用新的配置:

           systemctl restart docker
          

          单容器设置

          如果你想为单个容器设置不同的日志大小,可以在运行容器时使用 --log-opt 参数。

          docker run -d --log-opt max-size=10m --log-opt max-file=3 your_image
          

          这样会覆盖 Docker Daemon 全局设置,为该容器设置特定的日志大小。

          常用命令

          列出当前目录和文件的大小

          du -h -x --max-depth=1 | sort -rh
          
          • du:用于估算文件空间使用情况。
          • -h:以人类可读的格式显示文件大小(例如,1K、234M、2G)。
          • -x:跳过不同文件系统的目录。
          • –max-depth=1:只显示指定目录的总计,不进入子目录。
          • sort -rh:以逆数值顺序(-r)排序,并使用人类可读的数值(-h)