容器是短命的,容器一删里面的文件就没了。日志和监控是你了解容器内部状态的唯一窗口。本文讲清 Docker 的日志模型、docker logs 用法、日志轮转配置,以及常用监控手段。
容器日志模型
Docker 的日志模型非常简单:只关心标准输出(stdout)和标准错误(stderr)。
容器主进程写到 stdout 和 stderr 的内容,会被日志驱动捕获保存。写到文件里的内容,Docker 一概不管。这带来一条重要原则:应用应该把日志输出到 stdout,而不是写文件。
十二要素应用(Twelve-Factor App)把「日志当作事件流」列为核心原则。应用不操心日志存哪,交给运行环境处理。
docker logs 用法
docker logs 是排查问题的第一把钥匙。
docker logs 只读 stdout 和 stderr。应用把日志写进容器内文件的话,要用 docker exec 进容器看,更好的做法是改应用输出方式。
日志驱动总览
日志驱动决定 Docker 把捕获的日志存到哪里。用 docker info 可以查看当前驱动。常用的几种:
只有 json-file、local、journald 支持 docker logs 命令。用 fluentd 等远程驱动时,日志要去对应平台看。
日志轮转配置
json-file 驱动默认不轮转,容器跑久了日志能把磁盘撑爆。生产环境必须配置轮转。
Daemon 级配置
编辑 /etc/docker/daemon.json,对所有新建容器生效:
max-size 是单个日志文件上限,max-file 是保留文件个数。改完执行 sudo systemctl restart docker 生效。
Daemon 级配置只对重启后新建的容器生效。已有容器的日志配置在创建时固定,需要重建容器。
容器级配置
单个容器可以覆盖 daemon 配置:
Compose 里用 YAML 写法:
监控三板斧
Docker 自带三个命令,覆盖大部分日常监控需求。
docker stats 看 CPU、内存、网络 IO、磁盘 IO。docker events 适合接脚本做告警。docker system df 用来盯磁盘。
生产监控方案
单机命令适合救火,不适合常态化监控。生产环境的标准组合是 cAdvisor + Prometheus + Grafana:cAdvisor 采集容器指标,Prometheus 存储查询,Grafana 画图展示。
先用 Compose 把 cAdvisor 跑起来:
启动后访问 http://localhost:8080 能看到每个容器的实时指标。之后让 Prometheus 抓取 cAdvisor 的 /metrics 接口,再用 Grafana 配面板,就是完整监控体系。
容器健康检查 HEALTHCHECK
HEALTHCHECK 让 Docker 主动探测容器是否真健康,而不只是进程活着。
运行后 docker ps 的 STATUS 列会显示 Up 5 minutes (healthy)。状态共三种:starting、healthy、unhealthy。
编排系统会按健康状态做流量调度和自动重启。单机场景下,HEALTHCHECK 配合 docker events 也能实现基础故障告警。
延伸阅读