CnOps 智能运维与可观测社区
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题
导航菜单
首页开源项目实践文章视频课程常见问答开发者工具STAROps 专题

CnOps 智能运维与可观测社区

愿景

CnOps 智能运维与可观测社区是一个以"智能运维与可观测"为核心的开放、包容、分享的技术社区,旨在聚集运维专家、开发者和爱好者,共同探讨、学习和分享可观测最佳实践与最新技术,与众多技术社区合作互动,共同探讨交叉领域的技术挑战,推动可观测领域的创新与进步。

内容社区

  • 实践文章
  • 视频课程
  • 开源项目
  • 常见问答
  • 开发者工具

友情链接

  • Prometheus
  • Grafana Lab
  • OpenTelemetry
  • LoongCollector

关注我们

阿里云云原生公众号阿里云云原生
阿里云可观测公众号阿里云可观测

Copyright © 2026 CnOps 社区. All rights reserved.

首页/开源项目/Prometheus/使用 cAdvisor 监控 Docker 容器指标
文档目录
Docker Swarm使用 Prometheus 查询日志使用 TLS 加密保护 Prometheus API 和 UI 端点使用基本认证保护 Prometheus API 和 UI 端点使用 cAdvisor 监控 Docker 容器指标为 Prometheus 对 Go 应用程序进行插桩理解和使用多目标 Exporter 模式将 Prometheus 用作 OpenTelemetry 后端Prometheus 中的 UTF-8

Prometheus

使用 cAdvisor 监控 Docker 容器指标

cAdvisor(container Advisor 的缩写)分析并暴露正在运行的容器的资源使用和性能数据。cAdvisor 开箱即用地暴露 Prometheus 指标。在本指南中,我们将: 创建一个本地多容器 Docker Compose 环境,分别包含运行 Prometheus、cAdvisor 和 Redis 服务器的容器 查看由 Redis 容器产生、由 cAdvisor 采集、由...

cAdvisor(container Advisor 的缩写)分析并暴露正在运行的容器的资源使用和性能数据。cAdvisor 开箱即用地暴露 Prometheus 指标。在本指南中,我们将:

  • 创建一个本地多容器 Docker Compose 环境,分别包含运行 Prometheus、cAdvisor 和 Redis 服务器的容器
  • 查看由 Redis 容器产生、由 cAdvisor 采集、由 Prometheus 抓取的一些容器指标

Prometheus 配置

首先,你需要配置 Prometheus 来抓取 cAdvisor 的指标。创建一个 prometheus.yml 文件,写入以下配置:

scrape_configs:
- job_name: cadvisor
  scrape_interval: 5s
  static_configs:
  - targets:
    - cadvisor:8080

Docker Compose 配置

现在我们需要创建一个 Docker Compose 配置,指定哪些容器是我们安装环境的一部分,以及每个容器暴露哪些端口、使用哪些卷等。

在你创建 prometheus.yml 文件的同一目录下,创建一个 docker-compose.yml 文件,写入以下 Docker Compose 配置:

使用绑定挂载

version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - cadvisor
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis
  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

该配置指示 Docker Compose 运行三个服务,每个服务对应一个 Docker 容器:

  1. prometheus 服务使用本地 prometheus.yml 配置文件(通过 volumes 参数导入到容器中)。
  2. cadvisor 服务暴露端口 8080(cAdvisor 指标的默认端口),并依赖多个本地卷(/、/var/run 等)。
  3. redis 服务是一个标准的 Redis 服务器。cAdvisor 将自动从该容器收集容器指标,无需任何额外配置。

运行安装:

docker-compose up

如果 Docker Compose 成功启动了所有三个容器,你应该看到类似如下的输出:

prometheus  | level=info ts=2018-07-12T22:02:40.5195272Z caller=main.go:500 msg="Server is ready to receive web requests."

你可以使用 ps 命令验证所有三个容器是否正在运行:

docker-compose ps

输出将类似于:

   Name                 Command               State           Ports
----------------------------------------------------------------------------
cadvisor     /usr/bin/cadvisor -logtostderr   Up      8080/tcp
prometheus   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp
redis        docker-entrypoint.sh redis ...   Up      0.0.0.0:6379->6379/tcp

替代方案:使用内联 Docker 配置(远程部署)

如果你正在管理远程 Docker 主机,并且希望将所有配置保留在 docker-compose.yml 文件中(避免在主机上管理单独的配置文件),你可以使用 Docker 的 configs 功能:

version: '3.8'

configs:
  prometheus_config:
    content: |
      scrape_configs:
        - job_name: 'cadvisor'
          scrape_interval: 5s
          static_configs:
            - targets: ['cadvisor:8080']

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - 9090:9090
    command:
      - --config.file=/etc/prometheus/prometheus.yml
    configs:
      - source: prometheus_config
        target: /etc/prometheus/prometheus.yml
        uid: "65534"    # Required: numeric UID for 'nobody' user
        gid: "65534"    # Required: numeric GID for 'nobody' group
        mode: 0400      # Required: read-only permissions
    depends_on:
      - cadvisor

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
      - 8080:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
      - redis

  redis:
    image: redis:latest
    container_name: redis
    ports:
      - 6379:6379

重要说明

⚠️ 必填字段:使用 Docker configs 时,你必须以数字值明确指定 uid、gid 和 mode:

  • uid: "65534" - 数字用户 ID(65534 = Prometheus 镜像中的 nobody 用户)
  • gid: "65534" - 数字组 ID(65534 = nobody 组)
  • mode: 0400 - 文件权限(所有者只读)

如果省略这些字段或使用字符串值如 "nobody",将导致以下错误:

strconv.Atoi: parsing "nobody": invalid syntax

浏览 cAdvisor Web UI

你可以通过 http://localhost:8080 访问 cAdvisor 的 Web UI。你可以在 http://localhost:8080/docker/<container> 浏览我们安装环境中特定 Docker 容器的统计数据和图表。例如,Redis 容器的指标可以通过 http://localhost:8080/docker/redis 访问,Prometheus 通过 http://localhost:8080/docker/prometheus 访问,以此类推。

在表达式浏览器中浏览指标

cAdvisor 的 Web UI 是探索 cAdvisor 监控内容的有用界面,但它不提供浏览容器指标的界面。为此,我们需要使用 Prometheus 表达式浏览器,可通过 http://localhost:9090/graph 访问。你可以在表达式栏中输入 Prometheus 表达式,如下所示:

Prometheus 表达式栏

让我们从探索 container_start_time_seconds 指标开始,该指标记录容器的启动时间(以秒为单位)。你可以使用 name="<container_name>" 表达式按名称筛选特定容器。容器名称对应 Docker Compose 配置中的 container_name 参数。例如,container_start_time_seconds{name="redis"} 表达式显示 redis 容器的启动时间。

NOTE: 暴露给 Prometheus 的 cAdvisor 容器指标完整列表可以在 cAdvisor 文档中找到。

其他表达式

下表列出了一些其他示例表达式

表达式 描述 适用对象
rate(container_cpu_usage_seconds_total{name="redis"}[1m]) cgroup 在最近一分钟内的 CPU 使用率 redis 容器
container_memory_usage_bytes{name="redis"} cgroup 的总内存使用量(字节) redis 容器
rate(container_network_transmit_bytes_total[1m]) 最近一分钟内容器每秒通过网络发送的字节数 所有容器
rate(container_network_receive_bytes_total[1m]) 最近一分钟内容器每秒通过网络接收的字节数 所有容器

总结

在本指南中,我们使用 Docker Compose 在单个安装环境中运行了三个独立的容器:一个 Prometheus 容器从 cAdvisor 容器抓取指标,而 cAdvisor 容器又从 Redis 容器收集指标。然后我们使用 Prometheus 表达式浏览器探索了一些 cAdvisor 容器指标。

文章大纲