Docker安装Prometheus+Grafana
1. Prometheus简介
Prometheus 是一个开源的系统监控和报警系统,在 2012 年由 SoundCloud 公司创建,并于 2015 年正式发布。2016 年,Prometheus 正式加入 CNCF (Cloud Native Computing Foundation),成为继kubernetes之后第二个在CNCF托管的项目, 现已广泛用于在容器和微服务领域中得到了广泛的应用,当然不仅限于此Prometheus 本身基于Go语言开发的一套开源的系统监控报警框架和时序列数据库(TSDB)。
Prometheus 的监控功能很完善和全面,性能也足够支撑上万台规模的集群。
2. 工作原理
2.1 核心组件一览
一个典型的 Prometheus 生态系统包含以下组件:
| 组件 | 功能描述 |
|---|---|
| Prometheus Server | 核心服务,负责数据采集、存储和提供查询接口。 |
| Exporter | 将第三方服务(如 MySQL、Redis、Linux 系统)的监控指标转换成 Prometheus 能识别的格式并暴露出来。 |
| Pushgateway | 为短生命周期任务提供指标暂存和中转服务。 |
| Alertmanager | 接收和处理告警,进行分组、去重和路由分发。 |
| Client Library | 官方提供的客户端库,用于在应用程序代码中直接埋点,暴露自定义指标。 |
2.2 工作流程
- 定义数据模型:多维时间序列
Prometheus 将所有监控数据都保存为时间序列(Time Series)。每个时间序列由三部分唯一标识:
- 指标名称(Metric Name):描述监控对象的一般特征,例如
http_requests_total(HTTP请求总数)。 - 标签(Labels):一组可选的键值对(key=value),用于提供指标的维度信息。例如,
{method="POST", status="200"}表示“POST方法的、状态码为200的”HTTP请求。通过标签,可以轻松地对数据进行过滤、聚合和分组。
- 指标名称(Metric Name):描述监控对象的一般特征,例如
- 数据采集:基于“拉取”模型
这是 Prometheus 最核心的设计理念之一。
- 主动拉取:Prometheus 服务器不会被动等待数据,而是根据配置,定期(默认15秒或1分钟)通过 HTTP 协议主动访问监控目标的
/metrics接口来“拉取”(Pull)数据。 - 优势:
- 控制权在监控系统:可以统一控制数据采集的频率和速度,避免被监控服务的数据推送压垮。
- 健康检查:如果拉取失败,可以自然发现目标服务已宕机或不可用。
- 适配动态环境:结合服务发现机制(如 Kubernetes),可以自动发现和监控新启动的服务实例。
- 例外情况:对于无法长期暴露
/metrics接口的短生命周期任务(如批处理作业),Prometheus 提供了 Pushgateway 组件作为中转。任务先将指标推送到 Pushgateway,然后 Prometheus 再从那里拉取数据。
- 主动拉取:Prometheus 服务器不会被动等待数据,而是根据配置,定期(默认15秒或1分钟)通过 HTTP 协议主动访问监控目标的
- 数据存储:本地时序数据库(TSDB)
- 本地存储:Prometheus 将拉取到的数据存储在本地磁盘上,不依赖分布式存储或网络服务。这使得它在网络分区或其它组件故障时依然可用,保证了可靠性。
- 高效存储:它内置了高效的时序数据库(TSDB),数据会先缓存在内存中,再批量写入磁盘。数据按时间分块存储并压缩,平均每个数据点仅占约 3.5 个字节,非常高效。
- 数据保留:默认情况下,Prometheus 会保留最近 15 天的数据,这个时间可以通过启动参数调整。
- 数据查询:PromQL
Prometheus 提供了自己的查询语言 PromQL (Prometheus Query Language)。它是一种强大的函数式语言,允许用户实时地筛选、聚合和计算时间序列数据。例如,可以用一条语句计算出“过去5分钟内,
api服务中状态码为500的请求速率”。 - 告警: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
- 关闭防火墙
systemctl stop firewalld.service- 禁止防火墙开机自启
systemctl disable firewalld.service- 关闭selinux
sed -i ‘s/SELINUX=enforcing /SELINUX=disabled/g’ /etc/selinux/config- 重启系统
reboot5. 安装部署
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发现的服务

7. 创建仪表盘
- 左侧列表选择 仪表盘
- 点击右上角 新建 ,选择 Import dashboard
- 在
https://grafana.com/grafana/dashboards/里找一个想要的仪表旁 - 点击 Copy ID to Clipboard 把仪表盘的ID复制到剪切板
- 在 导入仪表板 处填入ID,然后点击加载
- 点击页面下方 加载 创建仪表盘
这里我使用
1860(Node Exporter Full)
8. 效果展示

9. 结尾
没了喵,谢谢欣赏

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