You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Docker实现容器日志每日压缩、满一个月后自动删除

Docker容器日志自动化归档及清理实现方案

提供三种可直接落地的实现方案,你可以根据自己的需求选择:


方案1:Linux自带logrotate工具(最推荐,无需自定义脚本)

logrotate是Linux系统内置的日志轮转工具,不需要额外安装依赖,配置后自动执行:

  1. 新建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  # 归档文件存储路径,需要提前创建
}
  1. 手动触发测试配置是否生效: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:添加执行权限并配置定时任务

  1. 给脚本添加执行权限:chmod +x /usr/local/bin/docker_log_archive.sh
  2. 编辑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日志驱动本身支持日志轮转、压缩、保留个数配置,不需要额外安装任何工具:

  1. 编辑Docker全局配置文件/etc/docker/daemon.json,添加以下配置:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",    # 单个日志文件最大100M,超过自动轮转
    "max-file": "30",      # 最多保留30份日志,超过自动删除
    "compress": "true"     # 自动压缩轮转后的日志
  }
}
  1. 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:36:01