基于Docker的Prometheus+Grafana监控平台实战指南【全流程解析】

1. 为什么你需要一个自己的监控平台?

如果你管理着几台服务器,或者正在学习容器技术,那你肯定遇到过这样的场景:半夜收到报警说网站打不开了,手忙脚乱地登录服务器,敲一堆命令查内存、查CPU、查网络,折腾半天才发现是某个服务自己崩了。又或者,你总觉得服务器有点“卡”,但说不清到底是哪里出了问题,是内存不够了,还是磁盘IO太高了?这种“两眼一抹黑”的感觉,对于任何一个开发者或者运维来说,都太难受了。

这就是监控平台的价值所在。它就像给你的服务器集群装上了一套“全景仪表盘”和“健康监测仪”。你不再需要手动敲命令,所有关键指标——CPU使用率、内存消耗、磁盘空间、网络流量、服务状态——都会以清晰、直观的图表形式,实时展示在你面前。任何风吹草动,你都能第一时间发现,甚至可以在问题发生前就收到预警。

今天我要跟你分享的,就是用 Docker 来快速搭建一套业界顶流的监控组合:Prometheus + Grafana。我选择Docker的方式,是因为它真的太方便了。想象一下,以前部署这些服务,你得操心操作系统版本、依赖库冲突、配置文件路径等等一堆破事。现在,你只需要几条简单的命令,就能把整个监控系统像搭积木一样跑起来,环境隔离得干干净净,卸载也只是一条命令的事,完全不会污染你的主机环境。这对于新手来说,门槛降低了不止一个档次。

这套组合里,Prometheus 负责“干活”,它是个专门收集和存储时间序列数据的“数据抓取器”和“数据库”。它会定期去你指定的目标(比如你的服务器、你的应用)那里拉取监控数据。而 Grafana 负责“美颜”,它是个强大的数据可视化工具,能把Prometheus里那些冷冰冰的数字,变成五彩斑斓、一目了然的图表和仪表盘。最后,我们还需要一个“小助手”叫 Node_exporter,它安装在被监控的服务器上,专门负责收集那台服务器本身的各项指标(比如CPU、内存),然后暴露给Prometheus来抓取。

接下来,我就带你从零开始,一步步把这块“全景仪表盘”给装起来。整个过程我会尽量讲得细一些,把我自己踩过的坑和总结的技巧都告诉你,保证你跟着做就能成功。

2. 动手之前:理清思路与准备环境

在真正敲命令之前,我们先花几分钟把整个架构和准备工作理清楚,这能帮你避免后面很多混乱。我画个简单的图给你看,你心里就有数了:

你的电脑/浏览器 (访问 Grafana 看图表)
          ↑
[ 主节点服务器 ]
  ├── Docker 容器 A: Prometheus (端口 9090) -> 抓取并存储数据
  └── Docker 容器 B: Grafana (端口 3000) -> 从 Prometheus 取数据并展示
          ↑ (Grafana 查询)
          ↑
[ Prometheus 定期抓取 ]
          ↑
[ 从节点服务器 (可以有多台) ]
  └── Docker 容器 C: Node_exporter (端口 9100) -> 暴露本机指标

核心流程是这样的

  1. 我们在主节点一台服务器上,用Docker启动Prometheus和Grafana。
  2. 从节点(也就是你想监控的服务器)上,用Docker启动Node_exporter。
  3. 配置Prometheus,告诉它:“你去某某从节点的9100端口抓数据。”
  4. 配置Grafana,告诉它:“你去连接主节点上9090端口的Prometheus,把它作为数据源。”
  5. 最后,在Grafana里选一个好看的仪表盘模板,数据就会自动呈现出来。

环境准备: 你需要至少两台安装了Linux的服务器(虚拟机或云服务器都行)。一台作为主节点(Master),另一台作为从节点(Slave)。如果只有一台机器,也可以把所有服务都装在上面,自己监控自己,用来学习和测试完全没问题。

最关键的一步:安装Docker。这是所有操作的基础。因为我们是“基于Docker”的实战,所以每台服务器上都必须先装好Docker和Docker Compose。这里我给出在CentOS 7/8或Ubuntu 20.04/22.04这类常见系统上的一条龙安装命令,你直接在服务器上执行就行:

# 一键安装Docker的脚本(适用于大多数Linux发行版)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装是否成功,看到版本号就对了
docker --version

# (可选但强烈推荐)安装Docker Compose
# 下载最新版本的Docker Compose,这里以v2.20.0为例,你可以去官网查最新版
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version

安装完成后,建议运行一下 sudo docker run hello-world 这个测试镜像,如果能看到欢迎信息,说明你的Docker环境完全正常。好了,基础打牢了,我们接下来就开始搭建监控系统的核心——主节点。

3. 搭建监控大脑:主节点部署 Prometheus 与 Grafana

现在,我们登录到主节点服务器,开始部署两个核心服务。我会用最直接、最清晰的Docker命令来操作,同时解释每个参数的作用,让你知其然也知其所以然。

3.1 部署 Prometheus:数据的抓取与存储中心

Prometheus 是我们监控系统的“数据仓库”。它主动去拉取(Pull)各个目标的数据,并存储在自己的时序数据库中。

首先,我们把Prometheus的官方镜像拉取到本地。Docker镜像就像是一个打包好的软件安装包,拉取就是从仓库下载这个包。

docker pull prom/prometheus:latest

接下来是运行容器。这条命令看起来有点长,别怕,我们拆开看:

docker run -d \
  --name=prometheus \
  --restart=always \
  -p 9090:9090 \
  -v /your/local/path/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v prometheus_data:/prometheus \
  prom/prometheus
  • -d:让容器在后台运行,这样你退出终端它也不会停。
  • --name=prometheus:给容器起个名字,方便后续管理,比如重启、查看日志。
  • --restart=always:这是非常重要的一个参数。它意味着如果容器因为任何原因退出(比如服务器重启),Docker会自动重新启动它。对于监控这种基础服务,必须保证高可用。
  • -p 9090:9090:端口映射。把容器内部的9090端口映射到主机的9090端口。这样你通过访问 服务器IP:9090 就能看到Prometheus的Web界面了。
  • -v /your/local/path/prometheus.yml:/etc/prometheus/prometheus.yml:这是配置持久化的关键-v 参数用于挂载卷(Volume)。容器内的配置默认是临时的,容器删除就没了。我们把主机上的一个配置文件(比如 /home/user/prometheus.yml)映射到容器内的配置文件路径。这样,我们可以在主机上直接修改配置,然后重启容器生效,配置永远不会丢失。你需要把 /your/local/path/ 替换成你主机上的真实路径。
  • -v prometheus_data:/prometheus:这是数据持久化的关键prometheus_data 是一个Docker管理的命名卷,它对应容器内存储监控数据的 /prometheus 目录。即使容器被删除,这个卷里的数据(也就是你所有的历史监控数据)也会保留下来。下次用同一个卷名启动新容器,数据就恢复了。

运行命令后,用 docker ps 查看一下,如果看到 prometheus 容器状态是 Up,就说明启动成功了。

3.2 部署 Grafana:炫酷的可视化仪表盘

Grafana 是我们的“展示大屏”。它从Prometheus读取数据,然后渲染成各种漂亮的图表。

同样,先拉取镜像:

docker pull grafana/grafana:latest

然后运行Grafana容器:

docker run -d \
  --name=grafana \
  --restart=always \
  -p 3000:3000 \
  -v grafana_storage:/var/lib/grafana \
  grafana/grafana

这里的参数和Prometheus类似:

  • -p 3000:3000:将Grafana的Web界面映射到主机的3000端口。
  • -v grafana_storage:/var/lib/grafana:同样使用命名卷 grafana_storage 来持久化Grafana的所有数据,包括你创建的仪表盘、数据源配置、用户信息等。这是必须的,否则你一重启容器,所有配置都得重来。

3.3 防火墙与首次访问

如果你的服务器开启了防火墙(比如firewalld或ufw),需要放行我们刚才映射的端口。

对于CentOS/RHEL(使用firewalld):

sudo firewall-cmd --permanent --add-port=9090/tcp
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload

对于Ubuntu/Debian(使用ufw):

sudo ufw allow 9090/tcp
sudo ufw allow 3000/tcp
sudo ufw reload

现在,打开你的浏览器:

  1. 访问 http://你的主节点IP:9090。你应该能看到Prometheus的界面,在顶部导航栏点击“Status” -> “Targets”,这里以后会显示你监控的所有目标状态(目前可能只有它自己)。
  2. 访问 http://你的主节点IP:3000。这是Grafana的登录页。默认账号密码都是 admin。第一次登录会要求你修改密码,为了安全,建议修改一个强密码。

至此,主节点的两个核心服务就部署完毕了。它们已经跑起来了,但Prometheus还不知道要去监控谁。接下来,我们就要去“谁”(从节点)身上安装数据采集器。

4. 安装数据采集器:从节点部署 Node_exporter

Node_exporter 是一个“采集探针”,它安装在被监控的机器上,负责收集这台机器本身的硬件和操作系统指标,并通过HTTP接口暴露出来,等着Prometheus来抓取。

登录到你的从节点服务器(也就是你想监控的那台机器),执行以下操作。

4.1 部署 Node_exporter 容器

拉取镜像:

docker pull prom/node-exporter:latest

运行容器。Node_exporter需要访问宿主机的系统文件(如 /proc, /sys)来获取指标,所以挂载卷的方式和之前略有不同:

docker run -d \
  --name=node-exporter \
  --restart=always \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  prom/node-exporter:latest \
  --path.rootfs=/host

这条命令参数比较多,我重点解释几个关键的:

  • --net="host"--pid="host":让容器使用宿主机的网络命名空间和PID命名空间。这样Node_exporter才能准确地收集到整个宿主机的网络和进程信息,而不是容器内部受限的信息。
  • -v "/:/host:ro,rslave":将宿主机的根目录 / 以只读(ro)方式挂载到容器内的 /host 目录。rslave 是递归绑定挂载的选项,确保挂载点内的挂载也能正确传播。这是为了让Node_exporter能读取到 /proc, /sys 等关键系统信息。
  • --path.rootfs=/host:告诉Node_exporter,宿主机的根文件系统在容器内的 /host 路径下。

运行后,用 docker ps 确认容器状态。然后,你可以在从节点上访问 http://localhost:9100/metrics,应该能看到一大堆以 node_ 开头的监控指标文本。这就说明Node_exporter工作正常,正在暴露数据。

4.2 配置从节点防火墙

同样,如果从节点有防火墙,需要放行Node_exporter的端口(默认9100)。

CentOS/RHEL:

sudo firewall-cmd --permanent --add-port=9100/tcp
sudo firewall-cmd --reload

Ubuntu/Debian:

sudo ufw allow 9100/tcp
sudo ufw reload

现在,数据采集器已经在从节点上就位了。但是主节点的Prometheus还不知道它的存在。下一步,我们就要告诉Prometheus:“嘿,去那个地址抓数据!”

5. 连接大脑与探针:配置 Prometheus 抓取目标

这是整个流程中最关键的一步配置。我们需要修改主节点上Prometheus的配置文件,添加上从节点的地址。

还记得我们启动Prometheus容器时挂载的本地配置文件吗?(-v /your/local/path/prometheus.yml:/etc/prometheus/prometheus.yml)。现在,我们编辑主机上的这个文件。

5.1 编辑 Prometheus 配置文件

用你喜欢的文本编辑器(如 vimnano)打开这个文件:

vim /your/local/path/prometheus.yml

你会看到一个默认的配置文件,找到 scrape_configs: 这个部分。我们需要在它下面添加一个新的抓取任务(job)。修改后的部分看起来应该是这样的:

scrape_configs:
  # 这个job是监控Prometheus自身的
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # !!!这是我们新增的,用于监控Linux服务器!!!
  - job_name: 'linux_servers' # 给这个监控任务起个名字,比如‘linux_servers’
    static_configs:
      - targets: ['从节点1的IP:9100', '从节点2的IP:9100'] # 这里填写你的从节点IP和端口
        labels:
          group: 'production' # 可以给这组机器打上标签,方便在Grafana里筛选
          instance: 'web-server-01' # 给单个实例起个别名,显示时更友好

重点解释:

  • job_name:定义一个抓取任务组,名字可以自定义。
  • targets:这是核心配置。填入你的从节点服务器的IP地址和Node_exporter的端口(9100)。请务必将示例中的 从节点1的IP 替换成你真实的从节点IP地址。如果有多个从节点,用逗号隔开,例如 ['192.168.1.101:9100', '192.168.1.102:9100']
  • labels:可以为这些目标添加额外的标签。标签在Prometheus里非常强大,可以用来对监控对象进行分组、筛选,在Grafana里也能用上。比如,你可以用 env: prodrole: db 来区分生产环境和数据库角色。

5.2 让配置生效

保存并退出编辑器后,我们需要让Prometheus容器重新加载这个配置文件。最简单的方式是重启容器:

docker restart prometheus

等待几秒钟,然后再次访问Prometheus的Web界面(http://主节点IP:9090)。

  1. 点击顶部菜单的 “Status” -> “Targets”
  2. 你应该能看到两个目标:一个是 prometheus (状态为UP),另一个就是你刚配置的 linux_servers 下的目标。

如果 linux_servers 的状态是 UP,并且 Last Scrape 时间是最新的,那么恭喜你!Prometheus已经成功连接到从节点,并开始抓取数据了。如果状态是 DOWN,请检查:从节点防火墙是否开放了9100端口?从节点的Node_exporter容器是否在运行?主节点是否能ping通从节点的IP?

6. 打造监控仪表盘:Grafana 配置与美化

数据已经源源不断地流入Prometheus,现在是时候用Grafana把它们变成直观的图表了。再次访问 http://主节点IP:3000,用你的账号密码登录。

6.1 添加 Prometheus 数据源

这是Grafana获取数据的第一步。

  1. 点击左侧导航栏的齿轮图标(Configuration) -> Data Sources
  2. 点击蓝色的 “Add data source” 按钮。
  3. 在列表中找到并选择 “Prometheus”
  4. 在配置页面,只有一个关键项需要填写:URL。这里填入你的Prometheus服务地址。因为Grafana和Prometheus都运行在主节点的Docker容器里,它们可以通过Docker的内部网络通信。最简单的方式是填写 http://prometheus:9090。如果你不确定,也可以填写主节点的实际IP,如 http://主节点IP:9090
  5. 其他设置保持默认即可,滚动到页面最下方,点击 “Save & Test”
  6. 如果看到绿色的 “Data source is working” 提示框,说明数据源连接成功!

6.2 导入现成的仪表盘模板

从头创建一个仪表盘对于新手来说比较困难。幸运的是,Grafana社区有成千上万的用户贡献了精美的仪表盘模板,我们直接“拿来主义”就行。

  1. 点击左侧导航栏的 “+” 号 -> “Import”
  2. 你会看到一个输入框,要求输入 “Grafana.com Dashboard URL or ID”。这就是模板ID。
  3. 我强烈推荐一个非常经典和全面的Node_exporter仪表盘模板,它的ID是 1860。你直接在输入框里填入 1860,然后点击 “Load”

    小贴士:你可以在 Grafana官方仪表盘市场 搜索 “node exporter”,会找到很多模板,1860 号是其中使用最广泛的一个。

  4. 在下一个页面,为这个仪表盘起个名字(比如 “Linux Server Overview”),然后最关键的一步:在 “Prometheus” 下拉菜单中,选择你刚才创建好的那个Prometheus数据源。
  5. 最后,点击 “Import”

奇迹发生了!一个功能完整、图表丰富的服务器监控仪表盘瞬间出现在你面前。你会看到CPU、内存、磁盘IO、网络流量、系统负载、进程数量等几乎所有关键指标的实时图表。

6.3 探索与自定义

导入的模板已经非常好用,但你完全可以在此基础上进行自定义。

  • 调整时间范围:仪表盘右上角可以切换查看过去1小时、6小时、一天甚至自定义时间范围的数据。
  • 查看单个图表:将鼠标悬停在图表上,可以看到精确的数据点信息。点击图表标题,选择 “Edit”,可以进入编辑模式,查看和修改这个图表背后的查询语句(使用的是PromQL,Prometheus的查询语言)。
  • 添加新图表:点击仪表盘标题右侧的 “Add panel” 按钮(一个带加号的图表图标),可以创建全新的图表。你可以尝试用PromQL写一些简单的查询,比如 node_memory_MemAvailable_bytes 来查看可用内存。

到这里,一个基于Docker的、完整的Prometheus+Grafana监控平台就已经搭建成功了。你可以看到从节点的各项指标正在实时刷新。这套系统不仅适用于监控服务器,通过添加不同的Exporter(如 mysql_exporter, redis_exporter),你还可以监控数据库、缓存、Web应用等各种服务。Docker化部署让扩展变得异常简单,你需要监控新服务时,往往只需要再运行一个对应的Exporter容器,然后在Prometheus配置里加一行target即可。

7. 进阶技巧与避坑指南

按照上面的步骤,你的监控平台应该已经跑起来了。但在实际生产环境中,我踩过不少坑,也总结了一些让系统更稳健、更好用的技巧,在这里分享给你。

7.1 使用 Docker Compose 统一管理

之前我们用了三条独立的 docker run 命令。当服务多了,管理起来会有点乱。我强烈推荐使用 Docker Compose。你可以创建一个 docker-compose.yml 文件,把Prometheus、Grafana的配置都写进去,一键启动、停止、重建。

在主节点上创建一个目录,比如 monitor,然后创建 docker-compose.yml

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--storage.tsdb.retention.time=30d' # 设置数据保留30天

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - grafana_storage:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=your_strong_password_here # 设置Grafana管理员密码

volumes:
  prometheus_data:
  grafana_storage:

同时,把编辑好的 prometheus.yml 配置文件也放在同一目录下。然后,只需要在这个目录下执行一条命令:

docker-compose up -d

Docker Compose会自动创建网络、卷,并启动所有服务。管理起来清爽多了。停止服务用 docker-compose down,查看日志用 docker-compose logs -f

7.2 配置告警规则(Alerting)

监控的可视化只是第一步,更关键的是“预警”。你不可能一直盯着仪表盘。Prometheus 配合 Alertmanager 可以实现强大的告警功能。

  1. 部署 Alertmanager:同样可以用Docker运行一个Alertmanager容器。
  2. 配置告警规则:在Prometheus配置目录下,创建一个 alerts.yml 文件,里面用PromQL定义告警条件。例如,当CPU使用率超过80%持续5分钟时触发告警。
  3. 配置告警接收器:在Alertmanager配置中,设置告警通知到哪里,比如发送邮件到你的邮箱,或者通过Webhook推送到钉钉、企业微信、Slack等聊天工具。

这是一个简单的告警规则示例(alerts.yml):

groups:
- name: host_alerts
  rules:
  - alert: HostHighCpuUsage
    expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "高CPU使用率告警 (实例 {{ $labels.instance }})"
      description: "实例 {{ $labels.instance }} 的CPU使用率已超过80%持续5分钟,当前值为 {{ $value }}%。"

然后,在 prometheus.yml 中引用这个规则文件,并指向Alertmanager的地址。这样,当条件触发时,你就能及时收到通知,在用户感知到问题之前就介入处理。

7.3 常见问题与排查

  • Grafana 里看不到数据/显示 “No Data”

    • 首先,去Prometheus的Targets页面(Status -> Targets),确认你的从节点状态是否是 UP
    • 如果状态是DOWN,检查从节点的Node_exporter容器日志:docker logs node-exporter
    • 检查主节点是否能telnet通从节点的9100端口:telnet 从节点IP 9100(如果没安装telnet,可以用 nc -zv 从节点IP 9100)。
    • 最可能的原因是防火墙没开,或者Prometheus配置中的IP地址写错了。
  • Prometheus 容器启动失败

    • 检查 prometheus.yml 文件的语法是否正确。YAML文件对缩进非常敏感,建议使用在线YAML校验工具检查一下。
    • 查看容器日志:docker logs prometheus,通常错误信息会直接打印出来。
  • 数据没有持久化,重启后丢了

    • 确保你启动容器时使用了 -v 参数挂载了卷(Volume),并且卷名是固定的。使用Docker Compose是避免这个问题的最佳实践。
  • 想监控更多东西

    • 去Prometheus官网的 Exporter列表 查找。几乎所有的常用服务,如MySQL (mysqld_exporter), Redis (redis_exporter), Nginx (nginx-vts-exporter) 都有对应的Exporter。部署方式大同小异,基本都是拉取镜像、运行容器、在Prometheus配置中添加新的 job_name

这套基于Docker的监控方案,我从几年前开始就在团队里推广和使用,它最大的优点就是轻量、灵活、易维护。无论是个人项目的小服务器,还是拥有几十个节点的内部集群,它都能很好地胜任。希望这份超详细的指南能帮你顺利搭建起自己的监控系统,从此告别对服务器状态的“盲人摸象”,真正实现运筹帷幄,了然于胸。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值