【Prometheus】Prometheus监控Docker实战
👻创作者:丶重明
👻创作时间:2025年8月23日
👻擅长领域:运维
目录
- 前言
- 什么是Prometheus和cAdvisor
- Prometheus
- cAdvisor
- 部署操作
- 部署cAdvisor
- 部署Prometheus
- 指标说明
- cpu相关指标
- 内存相关指标
- 磁盘相关指标
- 网络相关指标
- 其他相关指标
前言
在现代微服务架构中,容器化技术已成为应用部署的标准方式。随着Docker容器数量的增长,监控容器资源使用情况和性能指标变得至关重要。本文将介绍如何使用Prometheus和cAdvisor搭建一个完整的Docker容器监控解决方案,所有组件都通过Docker容器部署。
什么是Prometheus和cAdvisor
Prometheus
Prometheus
是一款开源的系统监控和警报工具包,以其强大的多维数据模型、灵活的查询语言和高效的时序数据库而闻名。它采用拉取模式
从目标收集指标,非常适合监控容器化环境。
cAdvisor
cAdvisor(Container Advisor)
是Google开源的容器资源使用和性能分析工具。它能够自动收集、聚合、处理并导出运行中容器的资源隔离参数、资源使用情况和历史性能数据。
部署操作
部署cAdvisor
cAdvisor作为数据收集器,需要访问宿主机的各种资源信息。
docker pull spcodes/cadvisor:v0.47.2
docker run -d \--name=cadvisor \--volume=/:/rootfs:ro \--volume=/var/run:/var/run:ro \--volume=/sys:/sys:ro \--volume=/var/lib/docker/:/var/lib/docker:ro \--volume=/sys/fs/cgroup:/sys/fs/cgroup:ro \--volume=/dev/disk/:/dev/disk:ro \--volume=/var/run/docker.sock:/var/run/docker.sock \--publish=8080:8080 \--detach=true \--privileged \--device=/dev/kmsg \spcodes/cadvisor:v0.47.2
参数解释:
-
--volume
:将宿主机目录挂载到容器中,使cadvisor可以访问系统资源 -
--publish=8080:8080
:将容器内端口8080映射到宿主机端口8080 -
--privileged和--device
:授予容器访问系统设备的权限
部署完成后可通过ip:8080
访问cadvisor的web界面
部署Prometheus
首先准备好prometheus的配置文件,方便一会挂载使用
mkdir /prom/prometheus -p
vim prometheus.yml# prometheus.yml内容
global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']- job_name: 'cadvisor'static_configs:- targets: ['192.168.10.13:8080']
拉取镜像并启动prometheus容器
docker pull prom/prometheus:v3.5.0
docker run -d \-p 9090:9090 \-v /prom/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \--name prometheus \prom/prometheus:v3.5.0
参数解释:
-v /prom/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
:挂载自定义配置文件到容器内
运行成功后可以通过ip:9090
访问到Prometheus的web页面
点击Status >> Target health
可以查看两个实例的运行情况
指标说明
cpu相关指标
指标名称 | 指标类型 | 指标含义 |
---|---|---|
container_cpu_usage_seconds_total | counter | 容器启动以来总消耗cpu时间 |
container_cpu_system_seconds_total | counter | 容器启动以来内核态消耗cpu时间 |
container_cpu_user_seconds_total | counter | 容器启动以来用户态消耗cpu时间 |
案例:计算每个运行中的容器在过去1分钟的平均cpu使用率
sum (rate(container_cpu_usage_seconds_total{name!=""}[1m])) by (instance,job,name) * 100
内存相关指标
指标名称 | 指标类型 | 指标含义 |
---|---|---|
container_memory_usage_bytes | gauge | 容器当前正在使用的总内存量 |
container_memory_working_set_bytes | gauge | 容器“工作集”内存大小 |
container_spec_memory_limit_bytes | gauge | 容器内存使用上限 |
machine_memory_bytes | gauge | 当前主机总内存量 |
案例:获取每个容器内存实际使用量(单位:MB)
sum (container_memory_working_set_bytes{name!=""}) by (increase,name) / 1024 / 1024
案例:计算所有容器的内存和占物理内存的比例
sum(container_memory_working_set_bytes{name!=""}) / sum(machine_memory_bytes) * 100
磁盘相关指标
指标名称 | 指标类型 | 指标含义 |
---|---|---|
container_fs_reads_bytes_total | counter | 容器读入总大小 |
container_fs_writes_bytes_total | counter | 容器写入总大小 |
container_fs_reads_total | counter | 容器启动以来文件系统IO读操作总次数 |
container_fs_writes_total | counter | 容器启动以来文件系统IO写操作总次数 |
案例:计算每个容器每秒磁盘写入吞吐量(单位:MB)
sum (rate(container_fs_writes_bytes_total{name!=""}[1m])) by (increase,name) /1024 /1024
网络相关指标
指标名称 | 指标类型 | 指标含义 |
---|---|---|
container_network_transmit_bytes_total | counter | 发送的网络流量的总量 |
container_network_receive_bytes_total | counter | 接收的网络流量的总量 |
案例:查询每个容器“接收”的总流量大小(单位:MB)
sum (container_network_receive_bytes_total{name!=""}) by (instance,job,name) /1024 /1024
其他相关指标
指标名称 | 指标类型 | 指标含义 |
---|---|---|
container_last_seen | gauge | 容器最后一次被探到的时间戳 |
container_tasks_state | gauge | 跟踪不同状态容器额数量 |
container_start_time_seconds | gauge | 容器启动的时间戳 |
案例:查询正在运行的容器数量
count(container_tasks_state{name!="",state="running"})
案例:查询每个容器运行的时长(单位:小时)
sum (time() - container_start_time_seconds{name!=""}) by (instance,name) /3600