使用 cAdvisor 监控 Docker 容器指标

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

浏览 cAdvisor Web UI

您可以在 https://127.0.0.1:8080 访问 cAdvisor Web UI。您可以在 https://127.0.0.1:8080/docker/<container> 浏览我们安装中特定 Docker 容器的统计信息和图表。例如,Redis 容器的指标可以在 https://127.0.0.1:8080/docker/redis 访问,Prometheus 可以在 https://127.0.0.1:8080/docker/prometheus 访问,等等。

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

cAdvisor 的 Web UI 是一个有用的界面,用于浏览 cAdvisor 监控的各种内容,但它不提供浏览容器指标的界面。为此,我们需要 Prometheus 表达式浏览器,它可以在 https://127.0.0.1:9090/graph 访问。您可以在表达式栏中输入 Prometheus 表达式,如下所示

Prometheus expression bar

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

注意:cAdvisor 文档中可以找到暴露给 Prometheus 的 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 容器指标。

本文档是开源的。请通过提交问题或拉取请求来帮助改进它。