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查看磁盘空间使用情况,确认日志占用是否减少。