Docker 日志与监控
1. 日志原则
应用把结构化事件写 stdout/stderr,由 Docker logging driver 收集。业务审计日志需独立、可靠、不可随普通容器日志清理。
bash
docker logs --tail 100 --timestamps api
docker logs --since 30m -f api2. Logging driver
bash
docker info --format '{{.LoggingDriver}}'
docker inspect api \
--format '{{json .HostConfig.LogConfig}}'Docker 默认通常是 json-file,默认不轮转;官方建议一般场景使用自动轮转、格式更高效的 local driver。
/etc/docker/daemon.json:
json
{
"log-driver": "local",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}验证 JSON 后重启 daemon。变更只影响新建容器,旧容器必须重建。
单容器:
bash
docker run -d \
--log-driver local \
--log-opt max-size=20m \
--log-opt max-file=5 \
team-api:latest3. 外部日志驱动
可选 journald、syslog、fluentd、gelf、awslogs、splunk 等。评估:
- 日志后端不可用时,应用是否阻塞;
- buffer 大小和丢弃策略;
- TLS、认证和敏感字段;
docker logs是否仍可用;- 网络和成本。
非阻塞模式可能丢日志:
bash
docker run -d \
--log-driver fluentd \
--log-opt mode=non-blocking \
--log-opt max-buffer-size=4m \
team-api:latest这是可用性与完整性的权衡,审计日志不应依赖可能丢弃的通道。
4. 不要直接操作内部日志文件
不要 rm、truncate 或用外部工具修改 Docker 管理的容器日志文件。使用日志驱动轮转、重建容器或官方 API;直接改文件会干扰 daemon。
磁盘检查:
bash
docker system df -v
df -hT
df -i
sudo du -xhd1 /var/lib/docker | sort -h5. Events
bash
docker events
docker events --since 30m
docker events \
--filter type=container \
--filter event=die \
--format '{{json .}}'Events 是实时/短期诊断信号,不是永久审计库。需要长期分析时发送到外部系统。
6. Stats
bash
docker stats
docker stats --no-stream \
--format 'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}'关键指标:
- CPU usage 与 throttling;
- working set、limit、OOM;
- PIDs;
- 网络吞吐、错误和丢包;
- block I/O、磁盘空间/inode;
- restart count、health、exit code;
- 应用 QPS、延迟、错误率和队列深度。
7. 容器状态
bash
docker ps --filter health=unhealthy
docker inspect api \
--format 'status={{.State.Status}} health={{if .State.Health}}{{.State.Health.Status}}{{end}} restart={{.RestartCount}} oom={{.State.OOMKilled}}'对 exited 容器:
bash
docker inspect job \
--format 'exit={{.State.ExitCode}} error={{.State.Error}} finished={{.State.FinishedAt}}'8. Daemon 日志
Linux systemd:
bash
sudo journalctl -u docker --since '1 hour ago' --no-pager
sudo journalctl -u containerd --since '1 hour ago' --no-pager不要长期打开 debug daemon 日志,除非有明确排障窗口;它增加噪声、磁盘和敏感信息风险。
9. Prometheus 指标
Engine 可配置实验性 metrics endpoint,生产必须只绑定管理网络并通过网络策略保护。不要把未认证指标端点暴露公网。
常用容器监控组合:
- node exporter:宿主机;
- cAdvisor 或平台集成:容器/cgroup;
- 应用 Prometheus endpoint;
- 日志集中系统;
- Grafana dashboard 与告警。
版本和部署方式要按官方/供应商当前文档确认。
10. 告警建议
| 告警 | 示例条件 |
|---|---|
| 容器反复重启 | 时间窗口内 restart 增量 |
| unhealthy | 持续多个检查周期 |
| OOMKilled | 任意生产容器 OOM |
| CPU throttling | 持续且伴随延迟 |
| 内存逼近 limit | 有泄漏趋势或低余量 |
| 磁盘/inode | 阈值 + 增长趋势 |
| 日志采集失败 | agent buffer/发送错误 |
| daemon 不可用 | API 探测失败 |
| 镜像异常 | 运行 digest 与批准清单不一致 |
告警必须关联 runbook、负责人和可操作上下文。
11. 关联字段
日志至少包括:
- timestamp(带时区或 UTC);
- level;
- service、environment、release;
- trace/request ID;
- event/message;
- error code;
- 不含密码、token、完整个人敏感数据。
用 labels 提供容器元数据:
bash
docker run -d \
--label com.example.service=api \
--label com.example.release=git-a1b2c3d \
team-api:latest12. 现场采集
bash
docker version
docker info
docker ps -a --no-trunc
docker inspect CONTAINER
docker logs --since 1h --timestamps CONTAINER
docker stats --no-stream
docker events --since 1h
docker system df -v输出可能含环境变量、挂载、网络地址和 Registry 信息,对外发送前脱敏。
13. 官方参考
继续阅读
- 命令
- 命令
- 故障排查