Docker监控与日志管理实战指南
Docker监控与日志管理实战指南
一、容器监控:实时掌握运行状态
1. Docker Stats API:内置监控能力
Docker自带的监控接口提供了基础的资源使用数据:
# 查看所有容器实时数据
docker stats
# 输出特定容器指标(JSON格式)
docker stats --no-stream --format "{{ json . }}" container_name
典型输出字段:
- CPU百分比
- 内存使用量/限制
- 网络I/O
- 块设备I/O
实践建议:
- 适合快速诊断,但缺乏历史数据存储
- 生产环境建议结合时间序列数据库
2. Prometheus + cAdvisor:企业级监控方案
部署步骤:
启动cAdvisor容器(自动发现宿主机所有容器):
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest
Prometheus配置示例(prometheus.yml):
scrape_configs: - job_name: 'docker' static_configs: - targets: ['cadvisor:8080']
关键指标:
- 容器CPU使用率
- 内存OOM风险预警
- 存储空间使用趋势
- 网络吞吐量异常
实践建议:
- 设置合理的告警规则(如内存使用>90%持续5分钟)
- 对Kubernetes集群建议使用kube-state-metrics补充采集
二、日志管理:从收集到分析
1. 日志驱动选择
驱动类型 | 适用场景 | 配置示例 |
---|---|---|
json-file | 本地开发环境(默认) | --log-driver=json-file |
syslog | 集中式Unix日志系统 | --log-driver=syslog --log-opt syslog-address=udp://loghost:514 |
fluentd | 日志分析管道 | --log-driver=fluentd --log-opt fluentd-address=fluentdhost:24224 |
awslogs | AWS云环境 | --log-driver=awslogs --log-opt awslogs-region=us-east-1 |
生产环境推荐方案:
# 启动容器时指定Fluentd驱动
docker run --log-driver=fluentd \
--log-opt fluentd-address=10.2.3.4:24224 \
--log-opt tag="app.{{.Name}}" \
nginx
2. 高级日志处理技巧
标签过滤:
# 只显示包含"error"的日志
docker logs --since 1h container_name | grep -i error
# 使用jq处理JSON日志
docker logs container_name 2>&1 | jq '.'
多容器日志聚合:
# 使用Docker Compose统一日志配置
services:
web:
image: nginx
logging:
driver: "fluentd"
options:
fluentd-address: "fluentd:24224"
tag: "frontend.{{.Name}}"
日志轮转配置(daemon.json):
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
三、最佳实践总结
监控层面:
- 开发环境使用
docker stats
快速验证 - 生产环境部署Prometheus+cAdvisor+Grafana完整方案
- 关键指标设置基线告警阈值
- 开发环境使用
日志层面:
- 避免直接登录服务器查看日志文件
- 为日志添加业务标签(如
app=order-service
) - 敏感信息过滤后再输出到日志
性能优化:
- 高频日志改为异步写入
- 限制单个容器日志文件大小
- 重要业务日志单独存储
故障排查示例:
# 1. 检查容器实时资源
docker stats problematic_container
# 2. 查看最近错误日志
docker logs --tail 100 -t problematic_container 2>&1 | grep -A 10 -B 10 "ERROR"
# 3. 结合Prometheus分析历史趋势
increase(container_cpu_usage_seconds_total{name="problematic_container"}[5m])
通过合理的监控告警和日志管理,可以显著提升容器化应用的运维效率。建议在项目初期就规划好监控日志体系,避免后期改造成本。