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:企业级监控方案

图1

部署步骤

  1. 启动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
  2. 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
awslogsAWS云环境--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"
  }
}

三、最佳实践总结

  1. 监控层面

    • 开发环境使用docker stats快速验证
    • 生产环境部署Prometheus+cAdvisor+Grafana完整方案
    • 关键指标设置基线告警阈值
  2. 日志层面

    • 避免直接登录服务器查看日志文件
    • 为日志添加业务标签(如app=order-service
    • 敏感信息过滤后再输出到日志
  3. 性能优化

    • 高频日志改为异步写入
    • 限制单个容器日志文件大小
    • 重要业务日志单独存储

故障排查示例

# 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])

通过合理的监控告警和日志管理,可以显著提升容器化应用的运维效率。建议在项目初期就规划好监控日志体系,避免后期改造成本。

添加新评论