容器化应用上线后,日志既是排查故障的重要依据,也可能成为磁盘空间的隐患。Docker 默认通过日志驱动接收容器写入标准输出和标准错误的内容,如果缺少采集规范与轮转限制,高频日志可能持续增长,最终影响宿主机稳定性。本文将从日志驱动、轮转配置、集中采集和日常检查几个方面,给出一套可直接落地的实践方案。🧰
一、理解 Docker 日志的工作方式
Docker 使用日志驱动决定容器日志的存储位置和传输方式。常见驱动包括 json-file、local、journald、syslog、fluentd 和 gelf。其中,json-file 兼容性较好,也是常见的默认驱动,但在未配置轮转参数时,日志文件可能不断增大。
可通过以下命令查看 Docker 守护进程当前使用的默认日志驱动:
docker info --format '{{.LoggingDriver}}'
查看某个容器实际采用的日志驱动,可执行:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' 容器名称
选择日志方案时,不应只考虑能否执行 docker logs,还应综合评估磁盘占用、查询方式、传输可靠性以及现有监控平台。Docker 对各类日志驱动的说明可参考 官方日志驱动文档。
二、为 json-file 配置日志轮转
对于单机部署、小型服务或仍依赖 docker logs 的环境,可以继续使用 json-file,但应设置单文件大小和保留数量。Linux 环境通常可编辑 /etc/docker/daemon.json,加入以下配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}
- max-size:单个日志文件达到指定大小后触发轮转。
- max-file:限制保留的日志文件数量,旧文件会按轮转顺序被清理。
- 注意类型:daemon.json 中的 log-opts 参数值应写成字符串,因此数字也需要使用引号。
修改前应先确认 daemon.json 中是否已有其他配置,避免覆盖镜像仓库、存储驱动等现有选项。完成修改后,可先检查 JSON 格式,再重启 Docker:
sudo systemctl restart docker
全局日志配置通常只对之后创建的容器生效,现有容器不会自动切换参数。因此,生产环境应安排维护窗口,通过 Docker Compose 或原有部署流程逐步重建容器,而不是误以为重启 Docker 后所有旧容器都已启用轮转。⚠️
三、使用 local 驱动简化本地管理
如果没有必须直接读取 json-file 文件的兼容性要求,可以考虑使用 local 驱动。该驱动采用更适合本地存储的格式,并默认执行日志轮转。全局配置可以简化为:
{
"log-driver": "local"
}
local 驱动适合希望降低本机日志占用、同时保留 docker logs 使用体验的场景。不过,运维人员不应直接编辑、移动或使用外部工具操作 Docker 管理的日志文件,否则可能干扰 Docker 对文件的正常维护。
四、针对单个容器设置轮转策略
不同服务的日志量差异明显。网关和任务调度服务可能输出较多,而低频后台服务日志量较小,因此可以使用容器级配置覆盖全局默认值:
docker run -d --name web \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
在 Docker Compose 中,可以在服务下增加 logging 配置:
services:
web:
image: nginx
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
建议将 Compose 文件纳入版本管理,使日志策略与应用配置一同审查和发布,避免依赖临时命令造成环境差异。📦
五、建立集中式日志采集
当容器数量增加或服务分布在多台主机时,只保留本地日志会提高检索和关联分析的难度。此时可选择两类方案:一类是通过 fluentd、syslog、gelf 等日志驱动直接发送;另一类是在宿主机部署采集代理,读取容器日志后转发到 Loki、Elasticsearch 或其他日志平台。
集中采集时应统一补充服务名、环境、版本、主机和容器标识等字段,并避免在日志中输出密码、访问令牌、身份证件信息等敏感内容。对于远程日志后端,还需要评估网络中断时的缓冲策略。使用非阻塞传输可以降低日志背压对应用的影响,但缓冲区满后可能丢失新日志,因此必须结合业务容错要求选择。
六、日常检查与故障处理
- 定期使用 df -h 和 du 检查 Docker 数据目录的磁盘占用。
- 通过 docker logs --since、--tail 和 --timestamps 缩小查询范围,避免一次读取大量历史日志。
- 为磁盘使用率、日志写入异常和采集延迟设置监控告警。
- 轮转参数应根据日志产生速度、排障周期和磁盘容量确定,不宜机械照搬固定数值。
- 发现超大日志时,不要直接删除正在使用的文件,应先确认容器日志驱动和轮转状态,再通过重建容器或规范的维护流程处理。
总结
可靠的 Docker 日志管理应同时覆盖输出规范、容量限制、集中采集、敏感信息保护和持续监控。小型环境可以优先使用 local 驱动,或为 json-file 设置 max-size 与 max-file;多主机生产环境则应建设集中式日志平台,并保留合理的本地缓冲。配置完成后,还需重建旧容器并验证实际日志驱动,才能真正避免磁盘被日志占满,同时保证故障发生时有据可查。✅