docker容器日志轮转需通过--log-driver json-file配合--log-opt max-size和--log-opt max-file参数实现,例如max-size=10m与max-file=5,使docker引擎自动截断并归档stdout/stderr输出,无需修改镜像或容器内操作。

容器本身不提供自动备份与日志轮转功能,必须通过启动参数配合外部工具或内置机制来实现。核心思路是:用 日志驱动参数控制输出日志轮转,用 挂载+脚本+定时任务实现数据备份。两者需分开配置,不能混为一谈。
一、用启动参数控制容器日志自动轮转
这是最轻量、最推荐的方案,适用于所有标准 Docker 容器(如 Nginx、MySQL、Redis 等),无需修改镜像或安装额外工具。
- 使用
json-file或local日志驱动,通过--log-opt指定轮转规则 - 常用组合:
--log-driver json-file --log-opt max-size=10m --log-opt max-file=5 - 含义:单个日志文件最大 10MB,最多保留 5 个历史文件(共约 50MB)
- 也可在
docker-compose.yml中统一配置:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
该配置生效后,Docker 引擎会自动截断并归档 stdout/stderr 输出,无需容器内任何改动。
二、用挂载卷 + 外部脚本实现数据自动备份
容器内业务数据(如 MySQL 表、上传文件、配置目录)必须持久化到宿主机,再由外部脚本定期备份。容器启动时需确保路径可访问。
- 启动容器时挂载数据目录,例如 MySQL 容器挂载
/var/lib/mysql到宿主机/data/mysql - 在宿主机编写备份脚本,调用
docker exec执行mysqldump或直接tar挂载目录 - 脚本中指定备份路径、压缩、时间戳命名、过期清理(如
find /backup -name "*.sql.gz" -mtime +7 -delete) - 赋予脚本执行权限:
chmod +x /opt/backup.sh
三、用 crontab 或 systemd timer 触发定时任务
备份脚本写好后,需靠宿主机的调度器运行,不能依赖容器内部 cron(易随容器销毁而失效)。
- 编辑用户级定时任务:
crontab -e - 添加一行,例如每天凌晨 2 点执行:
0 2 * * * /opt/backup.sh >/dev/null 2>&1 - 测试是否生效:
sudo systemctl restart cron(Ubuntu/Debian)或sudo systemctl enable crond(CentOS) - 更可靠的做法是用 systemd timer 替代 crontab,支持依赖检查和日志追踪
四、进阶:用 logrotate 管理容器内应用日志(非 Docker 日志)
当应用自身输出日志到文件(如 Tomcat 的 catalina.out、Nginx 的 access.log),且未使用 stdout 输出时,需在容器内启用 logrotate。
- 构建镜像时安装 logrotate:
RUN apt-get update && apt-get install -y logrotate - 复制配置文件到
/etc/logrotate.d/myapp,内容类似:
daily
rotate 14
compress
missingok
notifempty
copytruncate
}
注意:copytruncate 是关键,它允许 logrotate 复制日志后清空原文件,避免重启应用。











