Skip to content

Docker 日志与监控 ​

1. 日志原则 ​

应用把结构化事件写 stdout/stderr,由 Docker logging driver 收集。业务审计日志需独立、可靠、不可随普通容器日志清理。

bash
docker logs --tail 100 --timestamps api
docker logs --since 30m -f api

2. 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:latest

3. 外部日志驱动 ​

可选 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 -h

5. 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:latest

12. 现场采集 ​

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. 官方参考 ​

继续阅读