如何配置Docker实现容器日志每日压缩、满一个月后自动删除
Docker容器日志自动化归档及清理实现方案
提供三种可直接落地的实现方案,你可以根据自己的需求选择:
方案1:Linux自带logrotate工具(最推荐,无需自定义脚本)
logrotate是Linux系统内置的日志轮转工具,不需要额外安装依赖,配置后自动执行:
- 新建logrotate配置文件:
/etc/logrotate.d/docker-logs,写入以下内容:
/var/lib/docker/containers/*/*-json.log { daily # 每天执行一次轮转 rotate 30 # 最多保留30份日志,即留存30天 compress # 自动对轮转后的日志做gzip压缩 missingok # 日志文件不存在也不报错 notifempty # 日志为空时不轮转 copytruncate # 复制原日志内容后清空原文件,不需要重启Docker服务 dateext # 归档文件名添加日期后缀 dateformat -%Y%m%d # 日期后缀格式为年月日 olddir /data/docker_logs/archive # 归档文件存储路径,需要提前创建 }
- 手动触发测试配置是否生效:
logrotate -f /etc/logrotate.d/docker-logs
工具本身会被系统自带的定时任务触发,不需要额外配置crontab。
方案2:自定义脚本+crontab定时任务(灵活性最高,适合有自定义归档逻辑的场景)
步骤1:编写日志处理脚本
新建脚本文件/usr/local/bin/docker_log_archive.sh,内容如下:
#!/bin/bash # 自定义配置项 DOCKER_LOG_PATH="/var/lib/docker/containers" # Docker默认日志存储路径,自定义路径可替换 ARCHIVE_PATH="/data/docker_logs/archive" # 归档文件存储路径 RETENTION_DAYS=30 # 日志留存天数 DATE_SUFFIX=$(date +%Y%m%d) # 自动创建归档目录 mkdir -p ${ARCHIVE_PATH} # 遍历所有容器日志,按容器名+日期归档 for log_file in $(find ${DOCKER_LOG_PATH} -name "*-json.log" -size +0); do container_id=$(basename $(dirname ${log_file})) # 自动获取容器名,方便归档文件识别 container_name=$(docker inspect --format '{{.Name}}' ${container_id} | sed 's/\///') # 压缩日志到归档目录 gzip -c ${log_file} > ${ARCHIVE_PATH}/${container_name}_${container_id}_${DATE_SUFFIX}.log.gz # 清空原日志文件,Docker会自动向空文件写入新日志 > ${log_file} done # 自动删除超过留存期的归档文件 find ${ARCHIVE_PATH} -name "*.log.gz" -mtime +${RETENTION_DAYS} -delete
步骤2:添加执行权限并配置定时任务
- 给脚本添加执行权限:
chmod +x /usr/local/bin/docker_log_archive.sh - 编辑crontab定时任务:执行
crontab -e,添加以下行设置每天凌晨2点执行脚本:
0 2 * * * /usr/local/bin/docker_log_archive.sh >> /var/log/docker_log_archive.log 2>&1
执行日志会写入/var/log/docker_log_archive.log,方便后续排查问题。
方案3:Docker内置日志驱动配置(最简单,无需额外工具)
Docker的默认json-file日志驱动本身支持日志轮转、压缩、保留个数配置,不需要额外安装任何工具:
- 编辑Docker全局配置文件
/etc/docker/daemon.json,添加以下配置:
{ "log-driver": "json-file", "log-opts": { "max-size": "100m", # 单个日志文件最大100M,超过自动轮转 "max-file": "30", # 最多保留30份日志,超过自动删除 "compress": "true" # 自动压缩轮转后的日志 } }
- 重启Docker生效:
systemctl daemon-reload && systemctl restart docker
如果不需要全局生效,也可以在单个容器启动时单独指定参数,示例:
docker run -d --log-opt max-size=100m --log-opt max-file=30 --log-opt compress=true nginx
注意事项
- 以上方案默认适配Docker默认
json-file日志驱动,如果你使用journald/syslog等其他驱动,需要对应调整配置,比如journald可以直接修改/etc/systemd/journald.conf中的MaxRetentionSec=1month参数实现自动清理。 - 所有操作首次执行前建议先备份现有日志,避免误操作丢失数据。
- 脚本或logrotate运行的用户需要有Docker目录和归档目录的读写权限,建议用root用户配置。
内容的提问来源于stack exchange,提问作者user6236933
相关产品推荐
相关产品推荐

