【Prometheus 】Prometheus + Docker 监控服务器CPU、内存完整实战

📅 2026/7/22 15:25:55 👁️ 阅读次数 📝 编程学习
【Prometheus 】Prometheus + Docker 监控服务器CPU、内存完整实战

Prometheus + Docker 监控服务器CPU、内存完整实战

承接上一篇 Java JVM 监控,这里分两套方案:

  1. node-exporter(标准方案):采集宿主机整机CPU、内存、磁盘、网络
  2. 配套 Prometheus 配置、Grafana 面板、CPU/内存告警、Mermaid 流程图

一、整体架构图 Mermaid

暴露服务器硬件指标

物理/云服务器

node-exporter容器 9100端口

Prometheus

Grafana 展示CPU/内存曲线

告警规则 CPU高、内存溢出

node-exporter 专门抓取 Linux 系统层指标:CPU使用率、总内存/可用内存、Swap、磁盘IO、负载等。

二、Docker 部署 node-exporter 🐳

1. 启动 node-exporter 容器

dockerrun-d\--namenode-exporter\--net=host\--pid=host\-v/:/host:ro,rslave\-v/run/udev:/run/udev:ro\quay.io/prometheus/node-exporter:v1.8.2\--path.rootfs=/host
  • --net=host:共享宿主机网络,暴露 9100 端口
  • --pid=host:读取宿主机进程、CPU、内存信息
    访问指标地址:http://服务器IP:9100/metrics

三、修改 Prometheus 配置 prometheus.yml

新增抓取 node-exporter 的 job,同时保留之前 Java JVM 任务:

global:scrape_interval:10sevaluation_interval:10srule_files:-"alert-rules.yml"scrape_configs:# 1、Java JVM监控(原有)-job_name:"java-jvm-demo"metrics_path:"/actuator/prometheus"static_configs:-targets:["host.docker.internal:8080"]labels:service:java-app# 2、服务器宿主机监控CPU/内存-job_name:"linux-server-node"static_configs:-targets:["host.docker.internal:9100"]labels:env:production

重启 Prometheus 生效:

docker-composerestart prometheus

打开 PrometheusStatus -> Targets,看到linux-server-node状态 UP 即采集成功。

四、核心CPU、内存 PromQL 查询语句 📊

1. CPU 使用率(常用)

1)单CPU核心空闲率,计算1分钟内非空闲CPU占比
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
  • 结果:0~100,代表整机CPU总使用率
2)各核心CPU使用率
100 - (irate(node_cpu_seconds_total{mode="idle"}[1m]) * 100)
3)系统负载 1分钟/5分钟/15分钟
node_load1 node_load5 node_load15

2. 内存使用率

1)物理内存使用率(百分比)
(1 - node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100
2)可用内存(MB)
node_memory_MemFree_bytes / 1024 / 1024
3)Swap交换分区使用率
(1 - node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes) * 100

五、Grafana 服务器监控大盘导入

官方 Linux Node 监控模板 ID:1860

  1. Grafana -> Import,输入 1860
  2. 数据源选择 Prometheus
    自动生成完整面板:
  • CPU总使用率、单核曲线、CPU上下文切换
  • 内存、Swap、缓存、缓冲区占用
  • 磁盘读写、磁盘使用率、网络流量

六、CPU/内存告警规则 alert-rules.yml ⚠️

groups:-name:server-resource-alertrules:# CPU使用率超过85%持续5分钟告警-alert:ServerCpuHighexpr:100-(avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)>85for:5mlabels:severity:warningannotations:summary:"服务器CPU使用率过高"description:"机器{{$labels.instance}} CPU使用率 {{$value}}%,持续超过85%"# 内存使用率超过90%持续3分钟严重告警-alert:ServerMemHighexpr:(1-node_memory_MemFree_bytes / node_memory_MemTotal_bytes) * 100>90for:3mlabels:severity:criticalannotations:summary:"服务器内存占用过高,存在OOM风险"description:"机器{{$labels.instance}} 内存使用率 {{$value}}%"# Swap大量使用,内存不足-alert:ServerSwapUsedexpr:(1-node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes) * 100>50for:2mlabels:severity:warningannotations:summary:"Swap交换分区占用过高"

七、整合进 docker-compose.yml(完整容器编排)

原有 compose 增加 node-exporter 服务:

version:'3.8'volumes:prom_data:grafana_data:services:prometheus:image:prom/prometheus:v2.47.0container_name:prometheusports:-"9090:9090"volumes:-./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml-./prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml-prom_data:/prometheuscommand:-'--config.file=/etc/prometheus/prometheus.yml'-'--storage.tsdb.retention.time=15d'extra_hosts:-"host.docker.internal:host-gateway"restart:unless-stoppedgrafana:image:grafana/grafana:10.2.0container_name:grafanaports:-"3000:3000"volumes:-grafana_data:/var/lib/grafanaenvironment:-GF_SECURITY_ADMIN_USER=admin-GF_SECURITY_ADMIN_PASSWORD=123456depends_on:-prometheusrestart:unless-stopped# 新增:服务器资源采集器node-exporter:image:quay.io/prometheus/node-exporter:v1.8.2container_name:node-exporternetwork_mode:hostpid:hostvolumes:-/:/host:ro,rslave-/run/udev:/run/udev:rocommand:---path.rootfs=/hostrestart:unless-stopped

一键启动:

docker-composeup-d

八、常见问题 💡

  1. Targets 显示 DOWN
    • Linux 环境不能用host.docker.internal,target 改为172.17.0.1:9100
    • 防火墙放行 9100、9090、3000 端口
  2. CPU 指标全为0
    node-exporter 必须加--net=host --pid=host才能读取宿主机硬件数据
  3. 内存指标不准
    使用node_memory_MemFree_bytes,不要用缓存内存做判断

九、区分两个监控范围(重点)

  1. node-exporter:服务器整机CPU、内存、磁盘、系统负载
  2. SpringBoot actuator/prometheus:单个Java进程JVM堆、GC、线程、应用CPU占用

两者搭配使用,既能看机器资源,又能定位是哪个Java服务吃光CPU/内存。