Docker安装Prometheus+Grafana

1828 字
9 分钟
Docker安装Prometheus+Grafana

1. Prometheus简介#

Prometheus 是一个开源的系统监控和报警系统,在 2012 年由 SoundCloud 公司创建,并于 2015 年正式发布。2016 年,Prometheus 正式加入 CNCF (Cloud Native Computing Foundation),成为继kubernetes之后第二个在CNCF托管的项目, 现已广泛用于在容器和微服务领域中得到了广泛的应用,当然不仅限于此Prometheus 本身基于Go语言开发的一套开源的系统监控报警框架和时序列数据库(TSDB)。

Prometheus 的监控功能很完善和全面,性能也足够支撑上万台规模的集群。

网站:https://prometheus.io/

github:https://github.com/prometheus

2. 工作原理#

2.1 核心组件一览#

一个典型的 Prometheus 生态系统包含以下组件:

组件功能描述
Prometheus Server核心服务,负责数据采集、存储和提供查询接口
Exporter将第三方服务(如 MySQL、Redis、Linux 系统)的监控指标转换成 Prometheus 能识别的格式并暴露出来。
Pushgateway短生命周期任务提供指标暂存和中转服务。
Alertmanager接收和处理告警,进行分组、去重路由分发
Client Library官方提供的客户端库,用于在应用程序代码中直接埋点,暴露自定义指标。

2.2 工作流程#

  1. 定义数据模型:多维时间序列 Prometheus 将所有监控数据都保存为时间序列(Time Series)。每个时间序列由三部分唯一标识:
    • 指标名称(Metric Name):描述监控对象的一般特征,例如 http_requests_total(HTTP请求总数)。
    • 标签(Labels):一组可选的键值对(key=value),用于提供指标的维度信息。例如,{method="POST", status="200"} 表示“POST方法的、状态码为200的”HTTP请求。通过标签,可以轻松地对数据进行过滤、聚合和分组。
  2. 数据采集:基于“拉取”模型 这是 Prometheus 最核心的设计理念之一。
    • 主动拉取:Prometheus 服务器不会被动等待数据,而是根据配置,定期(默认15秒或1分钟)通过 HTTP 协议主动访问监控目标的 /metrics 接口来“拉取”(Pull)数据。
    • 优势
      • 控制权在监控系统:可以统一控制数据采集的频率和速度,避免被监控服务的数据推送压垮。
      • 健康检查:如果拉取失败,可以自然发现目标服务已宕机或不可用。
      • 适配动态环境:结合服务发现机制(如 Kubernetes),可以自动发现和监控新启动的服务实例。
    • 例外情况:对于无法长期暴露 /metrics 接口的短生命周期任务(如批处理作业),Prometheus 提供了 Pushgateway 组件作为中转。任务先将指标推送到 Pushgateway,然后 Prometheus 再从那里拉取数据。
  3. 数据存储:本地时序数据库(TSDB)
    • 本地存储:Prometheus 将拉取到的数据存储在本地磁盘上,不依赖分布式存储或网络服务。这使得它在网络分区或其它组件故障时依然可用,保证了可靠性。
    • 高效存储:它内置了高效的时序数据库(TSDB),数据会先缓存在内存中,再批量写入磁盘。数据按时间分块存储并压缩,平均每个数据点仅占约 3.5 个字节,非常高效。
    • 数据保留:默认情况下,Prometheus 会保留最近 15 天的数据,这个时间可以通过启动参数调整。
  4. 数据查询:PromQL Prometheus 提供了自己的查询语言 PromQL (Prometheus Query Language)。它是一种强大的函数式语言,允许用户实时地筛选、聚合和计算时间序列数据。例如,可以用一条语句计算出“过去5分钟内,api 服务中状态码为 500 的请求速率”。
  5. 告警:Alertmanager 用户可以在 Prometheus 中定义告警规则。当 PromQL 查询的结果满足特定条件时(如“CPU使用率超过90%”),Prometheus 会向 Alertmanager 发送告警。Alertmanager 负责对告警进行去重、分组和路由,最终通过邮件、钉钉、Webhook 等方式通知用户。

2.3 特殊组件 Pushgateway#

Pushgateway是指用于支持短期临时或批量计划任务工作的汇聚节点。主要用于短期的job,此类存在的job时间较短,可能在Prometheus来pull之前就自动消失了。所以针对这类job,设计成可以直接向Pushgateway推送metric,这样Prometheus服务器端便可以定时去Pushgateway拉去metric

3. Prometheus服务发现#

由于 Prometheus 是通过 Pull 的方式主动获取监控数据,也就是每隔几秒钟去各个target采集一次metric。所以需要手工指定监控节点的列表,当监控的节点增多之后,每次增加节点都需要更改配置文件,尽管可以使用接口去热更新配置文件,但仍然非常麻烦,这个时候就需要通过服务发现(service discovery,SD)机制去解决。

Prometheus 支持多种服务发现机制,可以自动获取要收集的 targets,包含的服务发现机制包括:azure、consul、dns、ec2、openstack、file、gce、kubernetes、marathon、triton、zookeeper(nerve、serverset),配置方法可以参考手册的配置页面。可以说 SD 机制是非常丰富的,但目前由于开发资源有限,已经不再开发新的 SD 机制,只对基于文件的 SD 机制进行维护。针对我们现有的系统情况,我们选择了静态配置方式。

4. 部署环境#

系统版本:Ununtu Server 24.04.4 docker版本:Docker Engine 29.7.2

  • 关闭防火墙
Terminal window
systemctl stop firewalld.service
  • 禁止防火墙开机自启
Terminal window
systemctl disable firewalld.service
  • 关闭selinux
Terminal window
sed -i ‘s/SELINUX=enforcing /SELINUX=disabled/g’ /etc/selinux/config
  • 重启系统
Terminal window
reboot

5. 安装部署#

5.1 安装 Prometheus Server#

这里使用docker-compose

  • docker-compose.yaml
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090" # 将主机的9090端口映射到容器的9090端口
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro # 挂载配置文件(只读)
- prometheus-data:/prometheus # 使用命名卷持久化数据
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus' # 指定数据存储路径
- '--storage.tsdb.retention.time=15d' # 数据保留15天
volumes:
prometheus-data: # 声明一个名为 prometheus-data 的卷
  • prometheus.yml

这是 Prometheus 自身的配置文件,用于定义抓取规则。

global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
# Prometheus 自监控
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# Node Exporter 监控
- job_name: 'Server-2'
static_configs:
- targets: ['node-ip:9100']

5.2 安装 Node Exporter#

这里使用docker-compose

  • docker-compose.yaml
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100" # 可选:把宿主机的9100也映射出来,方便直接访问
volumes:
- /proc:/host/proc:ro # 挂载宿主机 /proc(只读)
- /sys:/host/sys:ro # 挂载宿主机 /sys(只读)
- /:/rootfs:ro # 挂载宿主机根文件系统(只读)
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(dev|proc|sys|var/lib/docker/.+)($|/)' # 排除无用挂载点

5.3 安装Grafana监控面板#

这里使用docker-compose

  • docker-compose.yaml
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana-storage:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
# 如果想跳过首次登录强制修改密码的步骤,可加下面这行
# - GF_AUTH_DISABLE_LOGIN_FORM=false
volumes:
grafana-storage:

6. 查看Prometheus Server发现的服务#

http://prometheus-server-ip:9090

prometheus-sd-info
prometheus-sd-info

7. 创建仪表盘#

  1. 左侧列表选择 仪表盘
  2. 点击右上角 新建 ,选择 Import dashboard
  3. https://grafana.com/grafana/dashboards/ 里找一个想要的仪表旁
  4. 点击 Copy ID to Clipboard 把仪表盘的ID复制到剪切板
  5. 导入仪表板 处填入ID,然后点击加载
  6. 点击页面下方 加载 创建仪表盘

这里我使用 1860 (Node Exporter Full)

8. 效果展示#

node-explorer-full
node-explorer-full

9. 结尾#

没了喵,谢谢欣赏

gopher
gopher

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Docker安装Prometheus+Grafana
https://blog.tuf3i.cc/posts/grafana-prometheus-setup/
作者
TuF3i
发布于
2026-08-14
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TuF3i
一只区,什么也不想写
分类
标签
站点统计
文章
16
分类
9
标签
18
总字数
43,299
运行时长
0
最后活动
0 天前

目录