使用 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 配置。
使用绑定挂载 (Bind Mounts)
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 容器。
prometheus服务使用本地的prometheus.yml配置文件(通过volumes参数导入到容器中)。cadvisor服务暴露端口 8080(cAdvisor 指标的默认端口),并依赖多个本地卷(/、/var/run等)。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
你可以通过 https://:8080 访问 cAdvisor Web UI 。你可以在 https://:8080/docker/<container> 探索安装中特定 Docker 容器的统计信息和图表。例如,Redis 容器的指标可以在 https://:8080/docker/redis 访问,Prometheus 的指标可以在 https://:8080/docker/prometheus 访问,依此类推。
在表达式浏览器中探索指标
cAdvisor 的 Web UI 是探索 cAdvisor 监控内容的有用界面,但它并不提供探索容器指标的界面。为此,我们需要使用 Prometheus 的表达式浏览器,它位于 https://:9090/graph。你可以在表达式栏中输入 Prometheus 表达式,界面如下所示:

让我们从探索 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 容器指标。