使用 cAdvisor 监控 docker 容器数据指标

cAdvisor(container Advisor 的简写) 分析并公开正在运行的容器的资源使用情况和性能数据。cAdvisor 公开的 Prometheus 指标可以立即使用 。在本指南中,我们将:

  • 创建一个本地多容器 Docker Compose安装,包括分别运行 Prometheus,cAdvisor 和 Redis 服务的容器.
  • 检查由 Redis 容器产生,由 cAdvisor 收集并由 Prometheus 采集的一些数据指标

Prometheus 配置

首先,您需要配置 Prometheus 从 cAdvisor 采集指标。创建一个 prometheus.yml 文件,并使用以下配置填充它:

  1. scrape_configs:
  2. - job_name: cadvisor
  3. scrape_interval: 5s
  4. static_configs:
  5. - targets:
  6. - cadvisor:8080

Docker Compose 配置

我们需要创建一个 Docker Compose 配置,该配置指定我们安装的是哪些容器,以及每个容器公开哪些端口,使用哪些卷等等。

在创建 prometheus.yml 文件的同一文件夹中,创建一个 docker-compose.yml文件,并使用以下Docker Compose配置填充它:

  1. version: '3.2'
  2. services:
  3. prometheus:
  4. image: prom/prometheus:latest
  5. container_name: prometheus
  6. ports:
  7. - 9090:9090
  8. command:
  9. - --config.file=/etc/prometheus/prometheus.yml
  10. volumes:
  11. - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
  12. depends_on:
  13. - cadvisor
  14. cadvisor:
  15. image: google/cadvisor:latest
  16. container_name: cadvisor
  17. ports:
  18. - 8080:8080
  19. volumes:
  20. - /:/rootfs:ro
  21. - /var/run:/var/run:rw
  22. - /sys:/sys:ro
  23. - /var/lib/docker/:/var/lib/docker:ro
  24. depends_on:
  25. - redis
  26. redis:
  27. image: redis:latest
  28. container_name: redis
  29. ports:
  30. - 6379:6379

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

  1. prometheus 服务使用本地 prometheus.yml 配置文件(通过 volumes 参数导入到容器中)
  2. cadvisor 服务公开端口 8080(cAdvisor 数据指标的默认端口)并挂载了各种本地卷(/, /var, /run等)
  3. redis 服务是标准的 Redis 服务。cAdvisor 将自动从该容器收集容器指标,即无需任何进一步配置。

使用如下命令运行安装

  1. docker-compose up

如果 Docker Compose 成功启动了三个容器,则应该看到如下输出:

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

您可以使用 ps 命令验证三个容器都在运行

  1. docker-compose ps

您将看到类似于如下的输出

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

Exploring the cAdvisor web UI

您可以通过 http://localhost:8080 访问 cAdvisor Web UI。您可以在 http://localhost:8080/docker/<container> 的浏览指定已经安装的 Docker 容器的统计信息和图表。例如,可以在 http://localhost:8080/docker/redis 上访问 Redis 容器的,在 http://localhost:8080/docker/prometheus 上访问 Prometheus 的,等等

在表达式浏览器中检索数据指标

cAdvisor Web UI 是用于浏览 cAdvisor 监控服务的接口,但是它不提供用于浏览容器指标的界面。 为此,我们需要 Prometheus 表达式浏览器,该浏览器可从 http://localhost:9090/graph 访问。您可以在表达式栏中输入 Prometheus 表达式,如下所示:

Prometheus expression bar

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

info NOTE: 可以在 cAdvisor 文档中找到公开给 Prometheus 的 cAdvisor 收集的容器数据指标的的完整列表。

其它表达式

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

Expression Description For
rate(container_cpu_usage_seconds_total{name="redis"}[1m])\&g0.tab=1) cgroup 最近一分钟的 CPU 使用率 redis 容器
container_memory_usage_bytes{name="redis"} cgroup 的内存使用率(以 bytes 为单位) redis 容器
rate(container_network_transmit_bytes_total[1m])\&g0.tab=1) 容器在最近一分钟内每秒通过网络传输的字节数 所有容器
rate(container_network_receive_bytes_total[1m])\&g0.tab=1) 容器在最近一分钟内每秒通过网络接收的字节数 所有容器

小结

在本指南中,我们使用 Docker Compose 运行了三个单独的容器: Prometheus 容器从 cAdvisor 容器中采集指标,而 cAdvisor 容器又收集了 Redis 容器生成的指标。然后,我们使用 Prometheus 表达式浏览器检索了少数 cAdvisor 容器指标。