《从 2 小时到 30 分钟!我用 Docker 重构了 ESXI 监控系统(含 Web 面板演示)》
在虚拟化部署中,ESXI 服务器的资源监控是运维核心需求。本文将带大家从零搭建一套轻量级 ESXI 监控系统,所有的组件和服务全部基于Docker 容器化部署,让大家能快速上手。
一、系统架构与核心功能
这套监控系统采用 "轻量化 + 容器化" 设计,避免传统监控工具的复杂配置,核心架构如下:ESXI主机 ←SSH→ Docker容器(Python采集脚本)→ SQLite数据库 → Flask Web面板
核心功能清单
多指标采集:存储(容量 / 使用率)CPU 使用率、内存(总量 / 已用)虚拟机(数量 / 运行状态)
自动定时采集:可配置采集间隔(默认 60 秒),支持失败重试
数据持久化:SQLite 数据库存储历史数据,自动清理超期记录
Web 可视化:直观展示实时数据,支持历史数据查询
告警阈值:自定义 CPU / 内存 / 存储使用率告警阈值
容器化部署:一键启停,数据卷持久化,跨平台兼容
二、前置准备
准备工作:
部署服务器:CentOS 7+/Ubuntu 20.04+(需安装 Docker 和 Docker Compose)
ESXI 主机:ESXI 6.x/7.x/8.x(需开启 SSH 服务,建议用Workstation装虚机)
网络:部署服务器与 ESXI 主机网络互通(确保 22 端口可访问)
部署服务器环境
```# 安装Docker
curl -fsSL https://get.docker.com | sh
# 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version三、项目文件结构
```
[root@esxi_monitor_CentOS8 esxi-monitor]# tree
.
├── app.py
├── config.py
├── docker-compose.yml #容器编排配置
├── Dockerfile
├── esxi_collector.py
├── requirements.txt
└── templates
└── index.html四、核心文件代码实现
1. 配置文件:config.py 集中管理所有配置,修改 ESXI 设备信息只需改这里:
```# -------------------------- ESXI设备配置 --------------------------
ESXI_DEVICES = [
{
"name": "ESXI-生产服务器1", # 自定义设备名称
"hostname": "192.168.31.68", # 你的ESXI主机IP
"username": "root", # ESXI默认用户名
"password": "VMware1!", # 你的ESXI登录密码
"timeout": 10 # SSH连接超时(秒)
},
{
"name": "ESXI-生产服务器2",
"hostname": "192.168.31.69", # 替换为你的ESXI IP
"username": "root",
"password": "VMware1!", # 替换为你的密码
"timeout": 10
}
####可添加多台。。。。
]
# -------------------------- 监控阈值配置 --------------------------
ALERT_THRESHOLDS = {
"cpu_usage": 80, # CPU使用率告警阈值(%)
"mem_usage": 85, # 内存使用率告警阈值(%)
"storage_usage": 90 # 存储使用率告警阈值(%)
}
# -------------------------- Web服务配置 --------------------------
WEB_CONFIG = {
"host": "0.0.0.0", # 监听所有网卡(容器内必需)
"port": 5000, # Web端口(与docker-compose一致)
"debug": False, # 生产环境关闭Debug
"auto_collect_interval": 60 # 自动采集间隔(秒)
}
# -------------------------- 数据库配置 --------------------------
DB_CONFIG = {
"db_path": "/app/data/esxi_monitor.db", # 数据库路径(数据卷内)
"history_limit": 1000, # 历史数据保留上限(条)
"history_query_limit": 20 # Web面板显示历史条数
}
# -------------------------- 命令重试配置 --------------------------
RETRY_CONFIG = {
"max_retries": 3, # 命令失败最大重试次数
"retry_interval": 2 # 重试间隔(秒)
}
# -------------------------- ESXI命令配置(兼容多版本) --------------------------
# ESXI命令配置(实验环境仅存储命令有效)
ESXCLI_COMMANDS = {
"storage": "esxcli storage filesystem list", # 唯一可用命令
"cpu": "echo 'Usage: 80'", # 模拟CPU输出
"memory": "echo 'Total: 16000 MB\nUsed: 9000 MB'", # 模拟内存输出
"vm": "echo 'VM1: World ID: 1234, Power state: Powered on\nVM2: World ID: 5678, Power state: Powered off'" # 模拟虚拟机输出
}2. 数据采集脚本:esxi_collector.py 实现 SSH 连接、命令执行、数据解析、数据库入库。
3. app.py(Web服务与定时任务调度核心代码)。
4. Dockerfile 用于构建 Python 运行环境,确保包含 SSH 工具依赖:
```
FROM python:3.9-slim
WORKDIR /app
# 安装SSH工具和依赖
RUN apt-get update && \
apt-get install -y --no-install-recommends sshpass openssh-client && \
rm -rf /var/lib/apt/lists/*
# 复制项目文件
COPY . .
# 创建数据目录
RUN mkdir -p /app/data
# 安装Python依赖
RUN pip3 install --no-cache-dir flask
EXPOSE 5000
# 启动命令
CMD ["python3", "app.py"]5. docker-compose.yml
```
version: '3'
services:
esxi-monitor:
build: . # 基于当前目录Dockerfile构建镜像
container_name: esxi-monitor # 自定义容器名称
restart: always # 容器异常退出时自动重启
ports:
- "5000:5000" # 宿主机端口:容器端口映射(Web服务端口)
volumes:
- ./data:/app/data # 挂载数据卷,持久化SQLite数据库
environment:
- TZ=Asia/Shanghai # 设置时区,避免时间显示异常
#firewalld防火墙可根据实际放行必要访问端口五、 ESXI 主机开启 SSH(关键)
ESXI 默认关闭 SSH,需要手动开启:
登录 ESXI 控制台(Web 界面或直接操作服务器)
进入「管理」→「服务」→找到「TSM-SSH」
点击「启动」,并将「策略」设为「随主机启动和停止」(避免重启后失效)
记录 ESXI 的 IP 地址、root 账号和密码(后续配置要用)确保部署服务器能 ping 通 ESXI 主机,且 22 端口(SSH)可访问
注意:如果某些命令在你的 ESXI 上仍不可用,只需在config.py中注释对应命令并使用模拟数据即可我这里使用的PNETLab跑了两台ESXI8(开机、登录配置ssh并开启密码认证)
六、上传项目构建镜像启动容器与验证
构建镜像运行容器并查看日志确认,根据你的 ESXI 环境修改config.py中的设备信息(IP、密码等)最后启动容器。
```
#创建项目文件夹(或直接整体上传项目解压)
mkdir -p /opt/esxi-monitor && cd /opt/esxi-monitor
# 构建镜像并启动容器(首次执行耗时较长,需耐心等待)
docker-compose up -d --build
# 查看容器运行状态(确保STATUS为Up)
docker ps | grep esxi-monitor
# 重建并启动新容器(多次验证的情况)
docker-compose down && docker-compose up -d --build
# 查看所有日志,不做过滤,确保能看到“采集线程”相关输出
docker-compose logs -f
docker exec -it esxi-monitor bash
# 若虚拟机命令不可用,临时替换为模拟数据,如果你的 ESXI 对某些命令支持不完整(例如虚拟机命令仍不可用),只需修改 config.py 中的对应命令为模拟数据即可
ESXCLI_COMMANDS = {
# ... 其他命令保持不变 ...
"vm": "echo ''" # 虚拟机命令用空输出(采集时会显示0台)
}查看日志:
Web 面板访问与验证
打开浏览器,访问 http://[部署服务器IP]:5000,进入监控面板;在「选择设备」下拉框中选择目标 ESXI 主机,查看实时数据:
CPU 监控:显示当前使用率与历史趋势曲线,若超过阈值则标记为红色;
内存监控:展示已用 / 总量(单位 GB)及使用率,支持查看最近 20 条历史记录;
存储监控:按卷展示容量使用情况,清晰区分 VMFS 分区与其他存储类型;
虚拟机监控:显示运行中 / 总数量,点击「详情」可查看各虚拟机电源状态。
最后,一定要注意:
关于本次实验我使用的是论坛里大佬封装的ESXI镜像,我手动进入shell试了一下由于镜像本身问题(基于国产硬件或者定制化版本阉割...)很多指令集没有安装(后续有条件我会重新自己封装可以在PNETLab直接跑的ESXI镜像)所以我在关键代码的设计完全兼容 “真实采集” 和 “模拟兜底”,既解决了现在 ESXI 命令缺失的问题,也为未来 ESXI 恢复命令支持预留了接口,不会对正常采集产生任何影响。如果后续真实命令可用,直接修改 config.py 中的 ESXCLI_COMMANDS 为真实命令即可,采集优先级:真实命令 > 模拟值(无冲突)代码会先尝试执行 ESXI 的真实命令(如 esxcli sched cpu load get 采集 CPU、esxcli hardware memory get 采集内存),只有满足以下条件时,才会间接用到 “模拟相关逻辑”:真实命令执行失败(比如返回 {"error": "..."},如之前你的 ESXI 不支持 system resource 命令);或真实命令无有效输出(比如返回空字符串)。如果真实命令采集成功(比如未来你的 ESXI 恢复了 CPU 命令支持,能返回 Usage: 25),代码会直接解析真实数据入库,完全不会触发模拟值逻辑。
*若你的 ESXI 系统可以完全兼容并有命令支持,可以按以下步骤逐步开启 CPU、内存、虚拟机等指标的采集。前提条件:先在 ESXI 主机上手动测试以下命令是否能返回有效结果,只有命令能正常执行,才能开启对应指标采集:
循序渐进:先开启一个指标(如 CPU),确认正常后再开启下一个。
命令优先:必须以 ESXI 实际支持的命令为准,若命令执行失败,立即回退到模拟数据。
灵活调整:解析逻辑需根据命令输出格式微调(主要是正则表达式部分)。
```
# 测试CPU命令(返回CPU使用率相关信息)
esxcli sched cpu load get
# 或
esxtop -b -n 1 | grep 'CPU '
# 测试内存命令(返回总内存和已用内存)
esxcli hardware memory get
# 测试虚拟机命令(返回虚拟机列表及状态)
esxcli vm process list
# 或
esxcli vm list