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
查看磁盤空間使用情況,確認日志占用是否減少。