跳转到内容

Docker容器监控

来自代码酷


Docker容器监控是容器运维中的关键环节,指通过工具或命令实时收集、分析容器的运行状态(如CPU、内存、磁盘I/O、网络流量等指标),以确保服务稳定性并快速定位问题。本页面将详细介绍监控原理、工具链及实践方法。

监控核心指标[编辑 | 编辑源代码]

Docker容器的监控通常关注以下四类核心指标:

容器监控指标分类
指标类型 说明 典型工具
资源使用率 CPU、内存、磁盘占用 docker stats, cAdvisor
性能数据 线程数、文件描述符数 Prometheus + Node Exporter
日志流 标准输出/错误日志 ELK Stack, Fluentd
网络状态 连接数、带宽、延迟 Weave Scope, NetData

原生监控工具[编辑 | 编辑源代码]

docker stats[编辑 | 编辑源代码]

Docker内置的实时监控命令,无需额外安装:

# 查看所有运行中容器的资源使用
docker stats

# 输出示例:
CONTAINER ID   NAME        CPU %   MEM USAGE / LIMIT     MEM %   NET I/O       BLOCK I/O   PIDS
a1b2c3d4e5f6   nginx       0.02%   15MiB / 1GiB          1.47%   1.2kB / 648B  0B / 0B     3

docker top[编辑 | 编辑源代码]

查看容器内进程列表:

docker top my_container

# 输出示例:
UID    PID    PPID   C   STIME   TTY   TIME       CMD
root   1234   456    0   14:30   ?     00:00:01   nginx: master process

高级监控方案[编辑 | 编辑源代码]

cAdvisor[编辑 | 编辑源代码]

Google开发的容器资源监控工具,提供Web界面:

# 快速启动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 \
  gcr.io/cadvisor/cadvisor:v0.47.0

访问 http://localhost:8080 可查看可视化监控面板。

Prometheus + Grafana[编辑 | 编辑源代码]

工业级监控方案配置流程:

1. 创建Prometheus配置文件 prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['docker-host:9323']

2. 启动容器时暴露指标接口:

docker run -d \
  --name my_app \
  -p 8080:8080 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

3. 使用Grafana创建仪表盘:

graph LR A[Docker Containers] -->|Expose Metrics| B(Prometheus) B --> C{Grafana} C --> D[CPU Dashboard] C --> E[Memory Dashboard]

日志监控实践[编辑 | 编辑源代码]

配置JSON日志驱动进行结构化日志收集:

docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 nginx

使用ELK Stack分析日志: 1. Filebeat配置示例:

filebeat.inputs:
- type: container
  paths:
    - '/var/lib/docker/containers/*/*.log'
output.elasticsearch:
  hosts: ["elasticsearch:9200"]

性能调优案例[编辑 | 编辑源代码]

场景:某Web服务容器内存持续增长
排查步骤: 1. 使用docker stats确认内存泄漏 2. 通过docker exec -it container_id top定位异常进程 3. 使用cAdvisor历史数据确认增长趋势 4. 最终发现是未关闭的数据库连接导致

解决方案

# 修复代码示例(Python Flask)
@app.teardown_appcontext
def shutdown_session(exception=None):
    db.session.remove()

监控指标计算原理[编辑 | 编辑源代码]

关键指标计算公式:

  • CPU使用率:

解析失败 (语法错误): {\displaystyle \text{CPU\%} = \frac{\Delta \text{CPU\_time}}{\Delta \text{Real\_time}} \times 100\% }

  • 内存使用率:

解析失败 (语法错误): {\displaystyle \text{Mem\%} = \frac{\text{RSS}}{\text{Memory\_Limit}} \times 100\% }

安全监控建议[编辑 | 编辑源代码]

1. 监控容器特权模式使用 2. 跟踪敏感目录挂载 3. 检测异常网络连接 4. 使用docker audit插件记录安全事件

扩展阅读[编辑 | 编辑源代码]

  • Docker官方文档:容器指标收集
  • Prometheus Query Language (PromQL) 手册
  • 分布式系统监控设计模式