
1. 项目概述为什么要在Windows上部署这套监控栈如果你是一名在Windows环境下工作的开发者、运维工程师或者只是对系统监控感兴趣的技术爱好者那么“在Windows上用Docker跑起Prometheus和Grafana”这个想法很可能已经在你脑海里盘旋过。这确实是一个极具吸引力的组合Prometheus负责抓取和存储各种指标数据Grafana则以其强大的可视化能力将这些数据变成直观的图表和仪表盘。但问题来了Prometheus和Grafana的官方文档和社区案例绝大多数都围绕着Linux环境展开。在Windows上尤其是想通过Docker这种“一次构建到处运行”的容器化方式来部署总会遇到一些特有的“坑”。我最初尝试时也走了不少弯路。比如Docker Desktop在Windows上的网络模式、文件路径的权限问题、以及如何监控Windows主机本身这就需要windows_exporter等都是Linux教程里不会详细提及的。所以今天我想把自己从零开始在Windows 10/11专业版或企业版必须支持Hyper-V或WSL 2后端上通过Docker成功部署Prometheus、Grafana并接入Windows主机监控的完整过程、核心配置和踩过的坑系统地分享出来。无论你是想监控自己的开发机资源使用情况还是为部署在Windows服务器上的应用搭建监控体系这篇内容都能给你提供一份可直接“抄作业”的实操指南。2. 环境准备与Docker基础配置在开始部署监控栈之前我们必须确保Windows环境已经为运行Docker做好了充分准备。这一步的扎实程度直接决定了后续所有操作是顺风顺水还是举步维艰。2.1 启用必要的Windows功能与安装Docker Desktop首先你的Windows版本必须是64位的 Windows 10 版本 2004 及更高版本内部版本 19041 及更高版本或 Windows 11。家庭版通常不支持Hyper-V因此强烈建议使用专业版、企业版或教育版。第一步启用虚拟化与容器支持启用BIOS/UEFI中的虚拟化技术重启电脑进入BIOS/UEFI设置通常是开机时按F2、Del或F10键。找到与“Virtualization Technology”Intel VT-x 或 AMD-V相关的选项将其设置为“Enabled”。这是Docker运行的基础。启用Windows功能在Windows搜索栏输入“启用或关闭Windows功能”打开对话框。确保以下选项被勾选Hyper-V 如果打算使用Hyper-V作为Docker的后端传统方式。适用于Linux的Windows子系统和虚拟机平台 这是更现代、更推荐的方式即使用WSL 2作为Docker的后端。它性能更好资源占用更合理。注意Hyper-V和WSL 2后端在Docker Desktop中通常只能二选一。对于监控部署我强烈推荐使用WSL 2后端因为它与文件系统的集成更顺畅尤其是在处理配置文件映射时。第二步安装并配置Docker Desktop从Docker官网下载 Docker Desktop for Windows 安装程序。安装过程基本一路“Next”即可。安装完成后启动Docker Desktop。首次启动时可能会提示你选择使用WSL 2还是Hyper-V。选择“使用WSL 2”推荐。进入Docker Desktop的“Settings”设置有几个关键点需要配置General通用 确保“Start Docker Desktop when you log in”登录时启动被勾选方便后续服务自启动。Resources资源 根据你的机器配置适当调整分配给Docker的CPU核心数、内存建议至少4GB和Swap空间。监控系统本身资源消耗不大但留足余量是好的。Docker Engine 这里可以配置镜像加速器。国内用户建议添加阿里云或中科大的镜像地址以加速镜像拉取。配置示例如下添加到JSON配置中{ registry-mirrors: [ https://your-mirror.mirror.aliyuncs.com ] }2.2 规划项目目录结构清晰的目录结构是管理Docker Compose项目和配置文件的关键。我习惯在用户目录下创建一个专门的项目文件夹例如C:\Users\YourName\docker-monitoring。在这个文件夹里我们会创建以下子目录和文件docker-monitoring/ ├── prometheus/ │ ├── prometheus.yml # Prometheus主配置文件 │ └── alerts.yml # 告警规则配置文件可选 ├── grafana/ │ └── provisioning/ # Grafana预配置目录 │ ├── dashboards/ # 存放仪表板JSON文件 │ │ └── windows.json │ ├── datasources/ # 存放数据源配置 │ │ └── prometheus.yml │ └── dashboards.yml # 仪表板加载配置 ├── docker-compose.yml # 核心编排文件 └── .env # 环境变量文件可选用于存储密码等使用PowerShell或CMD进入你准备工作的磁盘如D盘然后执行mkdir docker-monitoring来创建这个根目录并依次创建上述子目录。3. 核心组件配置详解接下来我们将深入每个核心组件的配置文件。理解这些配置是定制化你自己监控系统的前提。3.1 编写Prometheus配置文件在prometheus/prometheus.yml中我们需要定义Prometheus如何工作抓取哪些目标、多久抓取一次、以及规则文件在哪里。global: scrape_interval: 15s # 全局抓取间隔每15秒抓取一次指标 evaluation_interval: 15s # 每15秒评估一次告警规则 # 告警规则文件配置 rule_files: # - alerts.yml # 如果需要告警取消注释并确保文件存在 # 抓取配置列表 scrape_configs: # 第一个任务监控Prometheus自身 - job_name: prometheus static_configs: - targets: [localhost:9090] # Prometheus自己的服务地址 # 第二个任务监控Windows主机这是核心 - job_name: windows static_configs: - targets: [host.docker.internal:9182] # 关键配置点 labels: instance: my-windows-pc # 给这台主机起个名字用于Grafana区分核心配置解析scrape_interval: 这个值决定了监控数据的粒度。15秒是一个平衡了实时性和资源消耗的常用值。对于测试或资源紧张的环境可以设为30s或60s。job_name: windows: 我们创建了一个名为“windows”的抓取任务。targets: [host.docker.internal:9182]:这是连接Docker容器与宿主机Windows的关键。host.docker.internal是Docker Desktop提供的一个特殊DNS名称它解析为宿主机的IP地址。9182是windows_exporter的默认监听端口。labels: 这里添加的标签如instance会附加到从这个目标抓取的所有指标上。在Grafana中你可以用instance”my-windows-pc”来筛选和查询特定主机的数据在多主机监控时尤其有用。3.2 编写Grafana预配置为了让Grafana容器一启动就拥有数据源和仪表板我们使用“Provisioning”机制。这比手动在Web界面配置更可靠且易于版本管理。1. 配置数据源 (grafana/provisioning/datasources/prometheus.yml)apiVersion: 1 datasources: - name: Prometheus # 数据源名称在Grafana界面中显示 type: prometheus access: proxy # 访问模式proxy表示通过Grafana服务器转发请求 url: http://prometheus:9090 # 关键使用Docker Compose中的服务名“prometheus”进行内部通信 isDefault: true # 设为默认数据源 editable: false # 禁止在Grafana界面中编辑此数据源保证配置一致性这里url: http://prometheus:9090利用了Docker Compose创建的网络直接通过服务名“prometheus”访问无需关心IP地址变化。2. 配置仪表板自动加载 (grafana/provisioning/dashboards/dashboards.yml)apiVersion: 1 providers: - name: default orgId: 1 folder: # 仪表板存放的文件夹空表示根目录 type: file disableDeletion: false # 允许删除 updateIntervalSeconds: 10 # 检查文件更新的间隔 allowUiUpdates: true # 允许通过Grafana界面更新仪表板更新后需同步回文件 options: path: /etc/grafana/provisioning/dashboards # 容器内仪表板配置的路径这个文件告诉Grafana去哪里找仪表板的JSON定义文件。3. 准备Windows监控仪表板 (grafana/provisioning/dashboards/windows.json)你可以从Grafana官方网站下载现成的仪表板。最常用的是Windows Exporter仪表板其ID通常是10467。你可以通过Grafana的“Import dashboard”功能输入ID在线导入但为了Provisioning我们需要其JSON内容。方法一推荐访问https://grafana.com/grafana/dashboards/10467-windows-exporter/点击“Download JSON”按钮将下载的JSON文件重命名为windows.json并放入上述目录。方法二如果你无法直接下载可以先用Docker启动一个临时Grafana在Web界面中导入ID为10467的仪表板然后通过“Share dashboard” - “Export” - “Save to file”将其导出为JSON文件。3.3 编写Docker Compose编排文件这是整个部署的“总指挥”位于项目根目录的docker-compose.yml。version: 3.8 services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped ports: - 9090:9090 # 将宿主机的9090端口映射到容器的9090端口 volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro # 挂载配置文件只读 - 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.time30d # 数据保留30天 networks: - monitoring grafana: image: grafana/grafana-enterprise:latest # 或使用 grafana/grafana:latest container_name: grafana restart: unless-stopped ports: - 3000:3000 environment: - GF_SECURITY_ADMIN_PASSWORDadmin123 # 设置初始管理员密码首次登录后请务必修改 - GF_INSTALL_PLUGINSgrafana-piechart-panel # 可选安装额外插件 volumes: - ./grafana/provisioning:/etc/grafana/provisioning:ro # 挂载预配置目录 - grafana_data:/var/lib/grafana # 持久化存储Grafana数据用户、仪表板等 networks: - monitoring depends_on: - prometheus volumes: prometheus_data: # 声明命名卷Docker会自动管理其在宿主机的存储位置 grafana_data: networks: monitoring: # 创建一个自定义网络方便服务间通信 driver: bridge关键配置解读与经验镜像选择我使用了prom/prometheus:latest和grafana/grafana-enterprise:latest。对于Grafana社区版 (grafana/grafana:latest) 对绝大多数功能已足够。企业版包含一些高级功能如报告、团队同步等个人使用社区版即可。数据持久化我们使用了Docker的“命名卷”prometheus_data,grafana_data。这是最佳实践。这些卷由Docker管理通常位于C:\ProgramData\Docker\volumes\下。即使容器被删除监控数据和Grafana的配置用户、仪表板等也会保留。切勿将重要数据只存在容器内部容器重建后数据会丢失。网络创建独立的monitoring网络让Prometheus和Grafana处于同一个网络空间内它们可以通过服务名如prometheus:9090直接通信安全且方便。环境变量GF_SECURITY_ADMIN_PASSWORD设置了Grafana的初始管理员密码。这是一个安全风险点。在生产环境中应通过Docker secrets或外部环境变量文件.env来管理密码并且一定要在首次登录后修改。depends_on这仅确保启动顺序先启动Prometheus但并不等待Prometheus“健康”。在实际复杂的编排中可能需要更健壮的健康检查等待逻辑。4. 部署与集成Windows主机监控配置文件就绪后我们就可以启动整个监控栈并将最重要的环节——Windows主机自身监控——集成进来。4.1 启动监控栈并验证打开PowerShell或CMD导航到你的项目根目录C:\Users\YourName\docker-monitoring或你自定义的路径。运行以下命令启动所有服务docker-compose up -d-d参数表示在后台运行分离模式。Docker会拉取镜像如果本地没有然后创建网络、卷并启动容器。验证服务是否运行正常docker-compose ps你应该看到prometheus和grafana两个服务的状态都是Up。访问服务进行验证Prometheus打开浏览器访问http://localhost:9090。你应该能看到Prometheus的Web界面。点击顶部菜单栏的“Status” - “Targets”。你应该看到两个目标prometheus (1/1 up)和windows (0/1 up)。windows目标状态为DOWN是正常的因为我们还没有启动windows_exporter。Grafana打开浏览器访问http://localhost:3000。使用默认用户名admin和你设置的密码如admin123登录。进入后导航到“Configuration” - “Data Sources”应该能看到一个名为“Prometheus”且状态为“Healthy”的数据源。再到“Dashboards” - “Browse”应该能看到我们通过provisioning导入的Windows仪表板可能需要稍等几秒加载。4.2 安装并配置Windows Exporterwindows_exporter是一个将Windows系统指标CPU、内存、磁盘、网络、服务等暴露为Prometheus格式的代理程序。下载访问windows_exporter的GitHub发布页面例如https://github.com/prometheus-community/windows_exporter/releases下载最新的.msi安装包如windows_exporter-0.24.0-amd64.msi。安装双击运行MSI安装程序。安装过程非常简单几乎一直“Next”即可。安装程序会将其注册为Windows服务。关键配置通过安装参数或修改服务默认情况下windows_exporter监听在http://localhost:9182并且只允许本地回环地址127.0.0.1访问。但我们的Prometheus运行在Docker容器内需要通过host.docker.internal来访问宿主机。因此我们需要让windows_exporter监听在所有网络接口上。方法一安装时指定以管理员身份打开CMD或PowerShell导航到MSI文件所在目录运行msiexec /i windows_exporter-0.24.0-amd64.msi LISTEN_ADDR0.0.0.0方法二修改已安装的服务如果已经安装需要修改服务启动参数。按Win R输入services.msc打开服务管理器。找到名为 “windows_exporter” 的服务右键选择“属性”。在“常规”选项卡找到“可执行文件的路径”。它看起来像C:\Program Files\windows_exporter\windows_exporter.exe。在路径末尾添加参数--telemetry.addr0.0.0.0:9182。完整的路径应类似于C:\Program Files\windows_exporter\windows_exporter.exe --telemetry.addr0.0.0.0:9182点击“应用”然后停止并重新启动该服务。验证打开浏览器访问http://localhost:9182/metrics。你应该能看到大量以# HELP和# TYPE开头后面跟着windows_为前缀的指标数据行。这证明windows_exporter正在工作并暴露了指标。防火墙规则为了让Docker容器能访问9182端口你可能需要在Windows防火墙中添加入站规则允许TCP端口9182的通信。可以在“高级安全Windows Defender防火墙”中手动创建或者如果提示时选择“允许访问”。4.3 在Grafana中查看监控数据完成以上步骤后回到Prometheus的Targets页面 (http://localhost:9090/targets)。刷新后你应该能看到windows任务的状态从DOWN变成了UP。现在打开Grafana (http://localhost:3000)点击左侧导航栏的“搜索”图标放大镜或直接进入“Dashboards” - “Browse”。你应该能看到一个名为 “Windows Exporter” 或类似名称的仪表板取决于你下载的JSON文件中的名称。点击它。一个完整的Windows主机监控仪表板将展现在你面前。通常它会包含多个面板分别展示系统概览CPU使用率、内存使用量、系统启动时间。CPU每个核心的使用率、中断、上下文切换。内存已用、缓存、可用内存分页情况。磁盘每个逻辑分区的使用率、读写速率、IOPS。网络每个网络接口的流量、错误包、连接数。服务指定服务的运行状态。你可以通过仪表板顶部的下拉菜单选择不同的主机如果你配置了多台和时间范围。至此一个基于Docker的、监控Windows主机的PrometheusGrafana系统就完全搭建成功了。5. 进阶配置、优化与故障排查基础系统跑起来后我们可以根据需求进行一些优化和功能增强并了解如何应对常见问题。5.1 配置告警规则可选但重要Prometheus不仅可以收集数据还能基于规则发出告警。我们需要配置告警规则文件和Alertmanager另一个组件来处理告警通知。这里我们先介绍规则配置。创建告警规则文件在prometheus/目录下创建alerts.yml。groups: - name: windows_alerts rules: - alert: HighCPUUsage expr: avg(rate(windows_cpu_time_total{mode!idle}[5m])) by (instance) * 100 80 for: 5m labels: severity: warning annotations: summary: 高CPU使用率 (实例 {{ $labels.instance }}) description: CPU使用率持续5分钟超过80%当前值为 {{ $value }}%. - alert: HighMemoryUsage expr: (1 - (windows_os_physical_memory_free_bytes / windows_cs_physical_memory_bytes)) * 100 85 for: 5m labels: severity: warning annotations: summary: 高内存使用率 (实例 {{ $labels.instance }}) description: 内存使用率持续5分钟超过85%当前值为 {{ $value }}%. - alert: ServiceDown expr: windows_service_status{status!running} 1 for: 1m labels: severity: critical annotations: summary: 服务停止 (实例 {{ $labels.instance }}, 服务 {{ $labels.service }}) description: 服务 {{ $labels.service }} 已停止运行超过1分钟。这个文件定义了三个告警规则高CPU使用率、高内存使用率和服务停止。expr是PromQL表达式用于定义触发条件。for表示条件持续多久才触发告警用于避免瞬时抖动。labels和annotations用于丰富告警信息。修改Prometheus配置编辑prometheus/prometheus.yml取消rule_files部分的注释使其指向我们的规则文件rule_files: - alerts.yml重新加载配置无需重启整个容器Prometheus支持动态重载配置。有两种方式发送SIGHUP信号docker-compose exec prometheus kill -HUP 1通过HTTP API向http://localhost:9090/-/reload发送POST请求需要启动Prometheus时添加--web.enable-lifecycle参数并在command中补充。 更简单的方式是重启Prometheus服务docker-compose restart prometheus。验证规则在Prometheus Web界面进入“Status” - “Rules”你应该能看到定义的告警规则及其状态绿色表示正常黄色表示触发红色表示严重。注意告警规则本身只负责“触发”要将告警发送到邮箱、Slack、钉钉等还需要部署和配置Alertmanager。这涉及到另一个服务的编排和配置是更进阶的话题。你可以先让Prometheus记录告警在Web界面的“Alerts”菜单中查看。5.2 性能优化与数据保留策略Prometheus数据保留在docker-compose.yml中我们通过--storage.tsdb.retention.time30d设置了数据保留30天。你可以根据磁盘空间和监控需求调整例如7d、90d。更长的保留时间需要更多的磁盘空间。资源限制在docker-compose.yml中可以为服务添加资源限制防止监控系统本身消耗过多资源。services: prometheus: # ... 其他配置 ... deploy: # 注意deploy 仅在 docker-compose 版本3.4且使用Swarm模式时完全生效单机版可用resources resources: limits: cpus: 1 memory: 2G reservations: cpus: 0.5 memory: 1G对于单机Docker Compose更常用的方式是在服务下直接使用resources字段与deploy平级但语法略有不同且部分旧版本可能不支持。最稳妥的方式是在Docker Desktop的Settings - Resources中全局限制。Grafana插件管理通过环境变量GF_INSTALL_PLUGINS可以预安装插件插件间用逗号分隔。例如- GF_INSTALL_PLUGINSgrafana-piechart-panel,grafana-clock-panel。5.3 常见问题与排查实录在实际操作中你几乎一定会遇到一些问题。以下是我遇到过的典型问题及解决方法问题1Prometheus Targets中windows状态为DOWN。可能原因1windows_exporter未运行或监听地址不对。排查在Windows上访问http://localhost:9182/metrics。如果无法访问检查服务是否运行并确认监听地址是0.0.0.0:9182。可能原因2防火墙阻止了连接。排查在Windows宿主机上用telnet localhost 9182测试端口是否可访问。如果宿主机可访问但容器内不可需要在Windows防火墙中为9182端口添加允许规则特别是“专用”和“公用”网络。可能原因3Prometheus配置中的target地址错误。排查确认prometheus.yml中targets写的是host.docker.internal:9182。在容器内部可以尝试docker-compose exec prometheus ping host.docker.internal测试网络连通性。问题2Grafana无法连接到Prometheus数据源。可能原因1数据源URL配置错误。排查检查Grafana数据源配置provisioning/datasources/prometheus.yml中的url。在Docker Compose网络中必须使用服务名http://prometheus:9090而不是localhost或127.0.0.1。可能原因2Prometheus服务未启动或网络问题。排查运行docker-compose logs prometheus查看Prometheus容器日志是否有错误。运行docker-compose exec grafana curl http://prometheus:9090/-/healthy在Grafana容器内测试是否能访问Prometheus。问题3Docker Desktop启动失败提示“Virtualization support not detected”。可能原因BIOS/UEFI中的虚拟化技术Intel VT-x/AMD-V未开启或Windows功能Hyper-V/WSL2未启用。解决这是最基础的问题。务必进入BIOS开启虚拟化并在Windows功能中确保“Hyper-V”或“WSL”及“虚拟机平台”已启用。对于WSL2后端还需要安装WSL2内核更新包微软官网提供。问题4磁盘空间占用增长过快。可能原因Prometheus默认数据保留时间为15天如果抓取目标多、指标多数据量会很大。解决调整--storage.tsdb.retention.time参数缩短保留时间。在prometheus.yml的scrape_configs中为每个job调整scrape_interval降低抓取频率但会影响数据粒度。定期清理旧的Docker镜像和容器docker system prune -a谨慎使用会删除未使用的资源。问题5如何更新镜像版本解决修改docker-compose.yml中的image标签到新版本如prom/prometheus:v2.48.0然后运行docker-compose pull # 拉取新镜像 docker-compose up -d # 重新创建并启动容器会使用新镜像由于使用了数据卷你的配置和监控数据不会丢失。6. 扩展思路还能监控什么至此一个核心的Windows主机监控系统已经搭建完成。但Prometheus和Grafana的能力远不止于此。你可以以此为基地轻松扩展监控范围监控容器本身在docker-compose.yml中增加一个cadvisor服务它可以收集Docker容器级别的资源使用和性能指标。监控自定义应用如果你的应用是Java、Go、Python等编写的可以集成对应的Prometheus客户端库如micrometer,prometheus_client在应用中暴露/metrics端点然后在Prometheus配置中添加新的job来抓取。监控数据库和中间件许多流行的数据库MySQL, PostgreSQL, Redis和中间件Kafka, Nginx都有官方的或社区的Prometheus导出器exporter部署它们并添加到抓取配置中即可。搭建完整的告警链路如前所述部署Alertmanager并配置邮件、Webhook等接收器实现告警的聚合、去重、静默和分级通知。这个基于Docker的部署方式最大的优势就是“可移植性”和“可复现性”。你的整个监控栈包括配置都封装在了代码和配置文件中。你可以轻松地将整个docker-monitoring文件夹复制到另一台Windows机器上一条docker-compose up -d命令就能快速重建出一模一样的监控环境。这对于开发、测试和生产环境的一致性保障以及个人学习实验来说价值巨大。