Node Exporter Prometheus Grafana本文档介绍如何在 Ubuntu 24.04 上安装 Node Exporter、Prometheus 和 Grafana。软件安装说明Node ExporterGithub release 包安装在宿主机上Prometheusdocker 安装无宿主机依赖要求用 docker 安装Grafanadocker 安装无宿主机依赖要求用 docker 安装一、Node ExporterGithub node_exporter一下载 release 包wgethttps://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz二解压tar-zxvfnode_exporter-1.11.1.linux-amd64.tar.gz# 目录中包含 node_exporter 可执行文件node_exporter-1.11.1.linux-amd64$lsLICENSE node_exporter NOTICE三移动专属目录1. 创建专属目录sudomkdir/opt/node_exporter2. 复制 node_exporter 可执行文件到专属目录sudocp./node_exporter /opt/node_exporter/3. 给 node_exporter 可执行文件添加执行权限sudochmodx /opt/node_exporter/node_exporter四配置 Systemd 服务1. 创建 Systemd 服务文件sudonano/etc/systemd/system/node_exporter.service写入以下内容注意ExecStart的路径:[Unit] DescriptionPrometheus Node Exporter Afternetwork-online.target [Service] Usernode_exporter Groupnode_exporter Typesimple ExecStart/opt/node_exporter/node_exporter [Install] WantedBymulti-user.target2. 创建专用 node_exporter 用户创建用户sudouseradd--no-create-home--shell/bin/false node_exporter参数解释--no-create-home: 不创建用户家目录--shell /bin/false: 将该用户的默认 Shell 设置为/bin/false防止用户登录node_exporter: 用户名读取和执行权限sudochown-Rnode_exporter:node_exporter /opt/node_exporter五启动并验证服务1. 重新加载 Systemd 配置sudosystemctl daemon-reload2. 启动服务并设置开机自启sudosystemctlenable--nownode_exporter3. 检查运行状态sudosystemctl status node_exporter六验证数据1. 在浏览器中验证最直观打开浏览器主机就可以不需要虚拟机在地址栏输入http://您虚拟机的IP地址:9100/metrics2. 在终端中验证最快在当前的终端中执行以下命令curl-shttp://localhost:9100/metrics|head-n15如果一切正常会看到类似下面这样的文本输出包含大量的 # HELP 和 node_ 开头的指标数据# HELP go_gc_duration_seconds A summary of the wall-time pause (stop-the-world) duration in garbage collection cycles. # TYPE go_gc_duration_seconds summary go_gc_duration_seconds{quantile0} 1.9215e-05 go_gc_duration_seconds{quantile0.25} 3.921e-05 go_gc_duration_seconds{quantile0.5} 8.7665e-05 go_gc_duration_seconds{quantile0.75} 0.000221364 go_gc_duration_seconds{quantile1} 0.000286378 go_gc_duration_seconds_sum 0.000653832 go_gc_duration_seconds_count 5 # HELP go_gc_gogc_percent Heap size target percentage configured by the user, otherwise 100. This value is set by the GOGC environment variable, and the runtime/debug.SetGCPercent function. Sourced from /gc/gogc:percent. # TYPE go_gc_gogc_percent gauge go_gc_gogc_percent 100 # HELP go_gc_gomemlimit_bytes Go runtime memory limit configured by the user, otherwise math.MaxInt64. This value is set by the GOMEMLIMIT environment variable, and the runtime/debug.SetMemoryLimit function. Sourced from /gc/gomemlimit:bytes. # TYPE go_gc_gomemlimit_bytes gauge go_gc_gomemlimit_bytes 9.223372036854776e18二、docker docker composePrometheus 和 Grafana 使用 docker 安装这里介绍安装 docker 和 docker compose。一安装必要依赖sudoaptupdatesudoaptinstall-yca-certificatescurlgnupg二创建密钥环目录并添加 Docker 官方的 GPG 密钥使用阿里云加速sudoinstall-m0755-d/etc/apt/keyringssudocurl-fsSLhttps://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg-o/etc/apt/keyrings/docker.ascsudochmodar /etc/apt/keyrings/docker.asc三将 Docker 的 apt 仓库源添加到系统中echo\deb [arch$(dpkg --print-architecture)signed-by/etc/apt/keyrings/docker.asc] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(./etc/os-releaseecho$VERSION_CODENAME)stable|\sudotee/etc/apt/sources.list.d/docker.list/dev/null四再次更新 apt 索引并安装 Docker 引擎及 Compose V2 插件sudoaptupdatesudoaptinstall-ydocker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin五将当前用户加入 docker 组免 sudo 执行 docker 命令sudousermod-aGdocker$USER六验证安装sudodocker--version# 注意compose 后面是空格不是连字符sudodockercompose version七让当前终端立刻生效 docker 组权限这样后面敲命令就不用一直加 sudo 了newgrpdocker三、Prometheus一创建目录结构与设置权限1. 创建主目录和 Prometheus 的专属子目录包含配置目录和数据目录sudomkdir-p/opt/monitoring/prometheus/data2. 给 Prometheus 的数据目录赋予正确的权限 (容器内是 nobody 用户UID 65534)sudochown-R65534:65534 /opt/monitoring/prometheus/data3. 进入主工作目录cd/opt/monitoring二编写 Prometheus 配置文件在 Prometheus 自己的目录下创建它的配置文件sudonanoprometheus/prometheus.yml粘贴以下内容保存并退出global:scrape_interval:15sscrape_configs:-job_name:prometheusstatic_configs:-targets:[localhost:9090]-job_name:node_exporterstatic_configs:# 使用魔法域名跨越网络访问宿主机上的 Node Exporter-targets:[host.docker.internal:9100]三编写 docker-compose.yml (仅包含 Prometheus)在主目录monitoring/下创建总控文件。注意看volumes里的路径现在它们指向了子文件夹。sudonanodocker-compose.yml粘贴以下内容保存并退出services:prometheus:image:prom/prometheus:latestcontainer_name:prometheusrestart:unless-stoppedvolumes:# 注意这里的路径变化指向了 prometheus 子文件夹-./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml-./prometheus/data:/prometheusports:-9090:9090# 核心魔法让容器能通过 host.docker.internal 访问宿主机extra_hosts:-host.docker.internal:host-gateway四启动 Prometheus确保还在monitoring/主目录下也就是docker-compose.yml所在的目录执行dockercompose up-d第一次运行会下载镜像看到 Started 即可。/opt/monitoring$dockercompose up-d[]up13/13 ✔ Image prom/prometheus:latest Pulled28.4s ✔ Network monitoring_default Created0.8s ✔ Container prometheus Started12.9s五验证 Prometheus确保 Prometheus 已经成功启动打开浏览器访问http://您的虚拟机IP:9090/targets验收标准页面能正常打开。在 “Targets” 列表中prometheus状态是绿色的 UP。最重要的一点node_exporter状态也必须是绿色的 UP。(如果node_exporter是红色的 DOWN通常是宿主机防火墙拦截了请在终端执行sudo ufw allow 9100/tcp后刷新页面重试。)四、Grafana一创建目录结构与设置权限1. 创建主目录和 Grafana 的专属子目录用于持久化仪表盘/数据sudomkdir-p/opt/monitoring/grafana2. 给 Grafana 的数据目录赋予正确的权限Grafana 容器内使用 grafana 用户 (UID 472)sudochown-R472:472 /opt/monitoring/grafana二编写 docker-compose.yml (追加 Grafana 服务)打开 compose 文件nanodocker-compose.yml在文件末尾prometheus 服务后面添加以下内容grafana:image:grafana/grafana:latestcontainer_name:grafanaports:-3000:3000volumes:-./grafana:/var/lib/grafanadepends_on:-prometheusrestart:unless-stopped三启动 Grafana确保还在monitoring/主目录下也就是docker-compose.yml所在的目录执行dockercompose up-d第一次运行会下载镜像看到 Started 即可。/opt/monitoring$dockercompose up-d[]up14/14 ✔ Image grafana/grafana:latest Pulled158.7s ✔ Container prometheus Running0.0s ✔ Container grafana Started7.4s四验证 Grafana打开浏览器访问http://您的虚拟机IP:3000验收标准页面能正常打开。登录时用户名是 admin密码是admin。五、Grafana 配置 Prometheus 数据源1. 点击 Connections ➡️ Add new conncetion ➡️ Prometheus2. 点击 Add new data source3. 填写相关数据信息精简配置配置项当前错误值正确值为什么Prometheus server URLhttp://localhost:9090http://prometheus:9090✅ Docker Compose 服务名自动解析为容器 IPAuthentication methodNo Authentication保持默认✅ 我们没设置 Prometheus 认证Scrape interval15s保持默认✅ 与 Prometheus 配置一致4. 点击 Save Test六、Grafana 配置 Dashboards 仪表盘Grafana dashboards 上有很多可用的仪表盘。在导入界面也有链接可跳转找到心仪的仪表盘。1. 点击 Dashboards ➡️ New ➡️ Import dashboard2. 导入 1860 仪表盘3. 点击 Import4. 确认并保存如需 Edit如果需要编辑仪表盘点击Edit按钮进入编辑模式修改完成后点击Save保存。有关问题一镜像下载网络问题1. 问题现象/opt/monitoring$dockercompose up-d[]up1/1 ✘ Image prom/prometheus:latest Error failed to resolve referencedocker.io/prom/prometheus:latest:failed todorequest: Headhttps://registry-1.docker.io/v2/prom/prometheus/manifests/latest:dial tcp108.160.172.232:443: connect: connection refused21.3s Error response from daemon: failed to resolve referencedocker.io/prom/prometheus:latest:failed todorequest: Headhttps://registry-1.docker.io/v2/prom/prometheus/manifests/latest:dial tcp108.160.172.232:443: connect: connection refused2. 问题原因典型的网络问题错误信息里的connection refused和访问registry-1.docker.io失败表明您的虚拟机当前无法直接连接到 Docker Hub 的官方服务器这是国内网络环境的常见限制。需要给 Docker 配置一个国内镜像加速器让它从国内的代理节点下载镜像。或者给 Docker 配置代理软件让它通过代理下载镜像。3. 解决方法这里通过配置代理软件来解决。我的代理软件运行在Windows 宿主机上第一步创建 Docker 的 systemd 代理配置在终端执行以下命令直接通过 echo 把配置写入文件1. 创建存放 Docker 服务覆盖配置的目录sudomkdir-p/etc/systemd/system/docker.service.d2. 将代理配置写入文件 (直接使用 Windows IP 和 代理端口)sudotee/etc/systemd/system/docker.service.d/http-proxy.conf-EOF [Service] EnvironmentHTTP_PROXYhttp://192.168.1.13:7890 EnvironmentHTTPS_PROXYhttp://192.168.1.13:7890 EnvironmentNO_PROXYlocalhost,127.0.0.0/8,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12 EOF 注意NO_PROXY 里的 192.168.0.0/16 很重要它确保了以后 Grafana 容器通过局域网 IP 连接 Prometheus 容器时不会傻傻地去绕一圈 Windows 代理而是直接在内网通信。第二步重载配置并重启 Dockersudosystemctl daemon-reloadsudosystemctl restartdocker第三步验证代理是否配置成功执行以下命令检查 Docker 是否已经吃到了代理环境变量sudosystemctl show--propertyEnvironmentdocker二docker docker composeDocker 是什么做什么用的Docker是一个开源的应用容器引擎它是整个容器化生态的“底座”。做什么用它允许开发者把应用程序以及它运行所需的所有依赖代码、运行环境、系统工具、数据库驱动等打包成一个轻量级、可移植的“镜像(Image)”。这个镜像可以运行在任何安装了 Docker 的机器上运行运行起来的实例叫做“容器(Container)”。解决的核心痛点彻底消灭了“这段代码在我的电脑上明明能跑怎么到你那里就报错了”的环境不一致问题。Docker Compose 是什么做什么用的Docker Compose是建立在 Docker 之上的一个多容器编排工具。做什么用在实际开发中一个完整的项目往往不止一个服务。比如一个典型的Web应用可能包含前端 Nginx后端 Node.js/JavaMySQL 数据库Redis 缓存。如果用纯 Docker需要手动敲4条docker run命令还要手动配置它们之间的网络互通和启动顺序非常繁琐且容易出错。解决的核心痛点它允许你通过一个YAML格式的配置文件通常叫docker-compose.yml把整个项目的所有服务、网络、数据卷一次性定义好然后一键启动/停止整个项目集群。两者关系依赖关系Docker Compose 是 Docker 的补充和高级封装。没有 DockerDocker Compose 就无法工作Compose 底层调用的依然是 Docker 的 API 来创建和管理容器。分工明确Docker 负责“制造和管理单个集装箱”构建镜像、运行单个容器。Docker Compose 负责“编排一堆集装箱”管理多个容器组成的微服务架构。核心区别对比对比维度DockerDocker Compose管理对象单个容器 / 镜像多个容器组成的应用服务栈配置文件Dockerfile用于定义如何构建单个镜像compose.yaml用于定义如何编排多个容器启动命令docker run [一长串参数] [镜像名]docker compose up自动读取配置一键启动网络管理需要手动创建网络、配置容器互联自动为项目创建一个隔离的默认网络容器间可通过服务名直接互相访问依赖与顺序难以控制多个容器的启动先后顺序支持配置depends_on确保数据库等基础服务先于应用服务启动适用场景运行单一服务如单纯跑个 MySQL 或 Nginx 测试运行完整的本地开发环境、微服务架构、CI/CD 自动化测试环境补充说明命令的演进网上资料可能会有两种写法:docker-compose和docker compose带横杠和空格隔开。过去V1 版本docker-compose是一个用 Python 写的独立脚本需要额外单独安装命令带横杠。目前已被官方废弃。现在V2 版本docker compose是用 Go 语言重写的已经作为原生插件直接集成到了 Docker CLI 中。只要安装了较新的 Docker就自带这个命令中间是空格。三Node Exporter 监控问题node exporter 如果使用 docker 镜像安装启动则 node exporter 的监控对象取决于启动 Docker 容器时的配置方式。简答来说如果直接启动不做特殊配置它监控的只是Docker 容器自身的信息这通常毫无意义。如果做了正确配置它监控的就是宿主机的信息。为什么默认监控的是 Docker 容器自身Node Exporter 采集系统指标如 CPU、内存、磁盘、网络的原理是读取 Linux 系统的虚拟文件系统主要是/proc和/sys。由于 Docker 容器具有命名空间隔离Namespace特性容器内部有自己独立的/proc和/sys。如果你只是简单地运行docker run prom/node-exporter它读取到的仅仅是这个容器内部的资源使用情况而不是宿主机的。如何让 Docker 版 Node Exporter 监控宿主机为了让容器内的 Node Exporter 看到宿主机的真实数据需要在启动时做三件事挂载宿主机的目录到容器内。共享网络和 PID 命名空间让容器能看到宿主机的网络接口和进程。通过启动参数告诉 Node Exporter 去读取挂载进来的宿主机路径。方式一使用 docker run 命令dockerrun-d\--namenode_exporter\--restartunless-stopped\--nethost\--pidhost\-v/:/host:ro,rslave\-v/proc:/host/proc:ro\-v/sys:/host/sys:ro\prom/node-exporter:latest\--path.rootfs/host\--path.procfs/host/proc\--path.sysfs/host/sys方式二使用docker-compose.ymlversion:3.8services:node_exporter:image:prom/node-exporter:latestcontainer_name:node_exporterrestart:unless-stoppednetwork_mode:hostpid:hostvolumes:-/:/host:ro,rslave-/proc:/host/proc:ro-/sys:/host/sys:rocommand:---path.rootfs/host---path.procfs/host/proc---path.sysfs/host/sys关键参数原理解析参数作用解释--nethost共享网络命名空间。让 Node Exporter 能采集到宿主机真实的网卡信息如eth0、bond0和网络流量而不是容器虚拟的eth0。--pidhost共享 PID 命名空间。让 Node Exporter 能看到宿主机上所有的进程信息从而正确统计系统负载load average和进程状态。-v /proc:/host/proc:ro将宿主机的/proc包含 CPU、内存、负载等内核信息以只读方式挂载到容器的/host/proc。-v /sys:/host/sys:ro将宿主机的/sys包含硬件设备、内核模块等信息以只读方式挂载到容器的/host/sys。-v /:/host:ro,rslave将宿主机的根目录挂载进去主要用于采集磁盘/文件系统的使用情况如/dev/sda1挂载在/上的空间使用率。rslave确保宿主机后续的挂载事件能传播到容器内。--path.rootfs/host告诉 Node Exporter 程序“宿主机的根文件系统在/host目录下请去那里读取磁盘信息”。