Ubuntu下清理Docker日志的常用方法
若需快速清理单个容器的日志,可通过以下步骤操作:
docker container ls -a
,获取目标容器的CONTAINER ID
。/var/lib/docker/containers/<容器ID>/<容器ID>-json.log
。truncate
命令(推荐,不影响正在运行的容器)或cat
命令清理日志:sudo truncate -s 0 /var/lib/docker/containers/<容器ID>/<容器ID>-json.log # 清空文件内容,保留文件 # 或(容器停止时使用) sudo cat /dev/null > /var/lib/docker/containers/<容器ID>/<容器ID>-json.log
注意:
truncate
不会删除文件,仅将文件大小置零,避免影响容器日志进程;cat /dev/null
会清空文件,但需确保容器未在使用日志文件。
若需清理所有容器的日志,可编写批量清理脚本:
clean_docker_logs.sh
,内容如下:#!/bin/bash LOG_PATH="/var/lib/docker/containers" CONTAINERS=$(ls -1 $LOG_PATH) for CONTAINER in $CONTAINERS; do LOG_FILE="${LOG_PATH}/${CONTAINER}/${CONTAINER}-json.log" if [ -f "$LOG_FILE" ]; then echo "清理容器 ${CONTAINER} 的日志:${LOG_FILE}" sudo truncate -s 0 "$LOG_FILE" fi done echo "所有容器日志清理完成。"
chmod +x clean_docker_logs.sh sudo ./clean_docker_logs.sh
该脚本会遍历/var/lib/docker/containers
目录下的所有容器,清空其日志文件。为避免日志再次堆积,可设置cron
定时任务定期执行清理:
crontab -e
,添加以下内容(例如每天凌晨0点执行):0 0 * * * /usr/local/bin/clean_docker_logs.sh # 假设脚本路径为/usr/local/bin/
若容器日志持续快速增长,建议通过限制日志大小从根源解决问题:
/etc/docker/daemon.json
(若不存在则创建),添加以下内容:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", // 单个日志文件最大10MB "max-file": "3" // 保留最多3个旧日志文件 } }
保存后重启Docker服务:sudo systemctl restart docker
--log-opt
参数指定日志限制:docker run -d --log-opt max-size=10m --log-opt max-file=3 your_image
此设置会覆盖全局配置,仅对该容器生效。logrotate
是Linux系统自带的日志轮转工具,可实现日志的压缩、归档、删除自动化管理:
sudo apt-get install logrotate
/etc/logrotate.d/docker
,内容如下:/var/lib/docker/containers/*.log { rotate 7 # 保留最近7天的日志 daily # 每天轮转一次 missingok # 若日志文件不存在则忽略 notifempty # 若日志为空则不轮转 compress # 压缩旧日志(如.gz格式) delaycompress # 延迟压缩(下一次轮转时再压缩) copytruncate # 复制日志内容到新文件,清空原文件(不影响容器运行) }
该配置会自动处理Docker容器日志的轮转,无需手动干预。cp /var/lib/docker/containers/<容器ID>/<容器ID>-json.log ~/backup/
)。docker stop <容器ID>
),但需注意容器停止会影响业务。df -h
查看磁盘空间使用情况,确认日志占用是否减少。