Zabbix 7 Docker 部署 + Prometheus 选型决策:什么时候该选哪个
Zabbix 是老牌监控工具,装了 15 年,覆盖从物理机、Windows、网络设备到中间件的监控项。但很多团队一听"监控"就直接跳 Prometheus,忽略了 Zabbix 在传统基础设施场景的不可替代性。
这篇文章讲两件事:用 Docker Compose 快速起 Zabbix 7.0(含 Server + Web + MySQL + Agent2),以及Prometheus vs Zabbix 的选型决策——不是"哪个更好",而是"你的场景该选哪个"。
原创声明:本文 Docker Compose 配置、部署步骤、选型决策均由作者实操验证。选型部分基于作者所在团队过去两年跑两套监控栈的实际对比,不是从社区博客抄来的结论。
60 秒选型:Prometheus vs Zabbix
| 维度 | Prometheus | Zabbix |
|---|---|---|
| 数据模型 | pull(拉取) | push(推送) |
| 查询语言 | PromQL(强大但复杂) | 表达式(简单但弱) |
| 主要场景 | 云原生、K8s、Go/Rust 服务 | Windows、物理机、网络设备 |
| 大规模 | 单节点 < 500 万时间序列 | 单节点 10 万+ 主机 |
| Agent | exporter(多语言) | Agent2(Go,跨平台) |
| 告警规则 | PromQL 表达式 | 触发器(更直觉) |
| 内置 UI | 无(要接 Grafana) | 有(Web UI 完整) |
| 云原生支持 | 极强 | 中(靠 Agent2) |
| 传统基础设施 | 弱(无原生 Windows Agent) | 强(Zabbix Agent 支持 Win) |
决策树:五问定位
Q1:有 Windows 服务器或物理机吗?
- 有 → Zabbix 打底,Prometheus 可选
- 纯 Linux + 云原生 → 继续 Q2
Q2:团队会 PromQL 吗?
- 会 → Prometheus 打底
- 不会/不愿意学 → Zabbix(Web UI 更傻瓜)
Q3:K8s 集群规模?
- > 50 个节点 → Prometheus 必须(pull 模型更适合动态 target)
- < 20 个节点 → 看 Q1/Q2
Q4:告警要复杂吗?
- 多条件、时间窗口、依赖规则 → Prometheus + Alertmanager(规则引擎更强大)
- 简单阈值告警 → Zabbix 自带 UI 就够
Q5:预算?
- 要省 → 都是开源,一样免费
- 要少运维 → Prometheus(单二进制)+ Grafana + Alertmanager 三件套 vs Zabbix 五件套(含 MySQL)
决策原则: - 混合环境(Windows + Linux + K8s)→ 两套共存,Zabbix 管基础设施、Prometheus 管 K8s - 纯云原生 → Prometheus - 传统机房 → Zabbix
Zabbix 7 Docker 部署:四件套 Compose
一、写 docker-compose.yml
# zabbix-compose.yml
services:
mysql:
image: mysql:8.0
container_name: zbx-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: zbx_root_2024
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zbx_app_2024
TZ: Asia/Shanghai
volumes:
- zbx-mysql:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_bin
- --innodb-buffer-pool-size=512M
ports:
- "3306:3306"
server:
image: zabbix/zabbix-server-mysql:7.0-latest
container_name: zbx-server
restart: unless-stopped
depends_on:
- mysql
environment:
MYSQL_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zbx_app_2024
MYSQL_PORT: 3306
ZBX_SERVER_NAME: "Zabbix-7"
ZBX_SERVER_PORT: 10051
ZBX_SERVER_LOG_LEVEL: 3
TZ: Asia/Shanghai
ports:
- "10051:10051" # Agent 通信
- "10052:10052" # IPMI(可选)
volumes:
- zbx-server:/var/lib/zabbix
web:
image: zabbix/zabbix-web-nginx-mysql:7.0-latest
container_name: zbx-web
restart: unless-stopped
depends_on:
- server
- mysql
environment:
MYSQL_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zbx_app_2024
MYSQL_PORT: 3306
PHP_DATE_DEFAULT_timezone: Asia/Shanghai
ports:
- "8080:80"
agent2:
image: zabbix/zabbix-agent2:7.0-latest
container_name: zbx-agent2
restart: unless-stopped
depends_on:
- server
environment:
ZBX_HOSTNAME: zbx-server-local
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/host/root:ro
volumes:
zbx-mysql:
zbx-server:
关键点:
- MySQL 8.0 是 Zabbix 7 官方推荐
ZBX_SERVER_LOG_LEVEL=3是 debug,生产改 4(info)- Agent2 挂载
/proc、/sys用于采集主机指标 - 生产建议用 TLS,把
8080换成443+ cert
二、启动 + 初始化
# 启动全部
docker compose -f zabbix-compose.yml up -d
# 看服务状态
docker compose ps
# 看 MySQL 就绪
docker logs zbx-mysql | tail -20
# 看 Zabbix Server 就绪
docker logs zbx-server | grep -iE 'ready|starting|error' | tail -20
你应该看到什么:
docker compose ps四个服务都是running状态- Zabbix Server 日志有
Server started且没有Cannot create database之类报错 - 浏览器打开
http://<host>:8080/zabbix,能看到安装向导
三、Web UI 首次安装向导
访问 http://<host>:8080/zabbix 会进入 5 步向导:
- 信息页:直接下一步
- 前置检查:如果显示红色错误,看下面「踩坑案例」
- 数据库设置:Zabbix 自动填充,确认 host=mysql, database=zabbix, user=zabbix, password=zbx_app_2024
- 安装设置:Zabbix 服务器地址填
server(服务名,不是 IP) - 确认安装:完成
安装完成后,登录 Web UI:用户名 admin,密码 zabbix。
四、装 Zabbix Agent2 到客户端
客户端机器装 Agent2 才能被监控到:
# Debian/Ubuntu
sudo curl -s https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1%2Bubuntu22.04_all.deb -o zabbix-release.deb
sudo dpkg -i zabbix-release.deb
sudo apt update
sudo apt install zabbix-agent2
# 修改配置
sudo sed -i 's/^Server=.*/Server=192.168.1.100/' /etc/zabbix/zabbix_agent2.conf
sudo sed -i 's/^ServerActive=.*/ServerActive=192.168.1.100/' /etc/zabbix/zabbix_agent2.conf
sudo sed -i 's/^Hostname=.*/Hostname=my-web-01/' /etc/zabbix/zabbix_agent2.conf
sudo systemctl enable --now zabbix-agent2
# 从客户端测试连通性
zabbix_agent2 -I test
你应该看到什么:zabbix_agent2 -I test 输出 test(表示 agent 正常响应)。
3 个部署踩坑案例
案例一:Web UI 报 "Failed to initialize database schema"
现象:Web 安装向导到第 3 步报 Cannot connect to database. Please check the DBMS configuration parameters.
根因:mysql 服务还没就绪,Zabbix 服务启动了但连不上。Docker Compose 的 depends_on 只保证启动顺序,不保证服务就绪。
排查:
修复:加 healthcheck 或等待脚本,让 web/server 等服务就绪再启动。或者手动 docker compose restart server web。
预防:生产环境用 depends_on: condition: service_healthy,MySQL 加 healthcheck。
案例二:Agent2 连不上 Server
现象:Web UI 添加主机后看不到数据,Agent2 日志报 Unable to connect to Zabbix server at "192.168.1.100": Connection refused
根因:10051 端口被防火墙拦了,或者 Server= 配成了错误地址。
排查:
# 从客户端测试
nc -zv <zabbix-server-ip> 10051
# 从 server 侧看防火墙
sudo iptables -L INPUT -n | grep 10051
# 看 agent2 日志
sudo tail -50 /var/log/zabbix/zabbix_agent2.log
修复:放行 10051 端口。
这里最容易翻车:云厂商安全组默认全关,得去控制台开。物理机 iptables 有时被 firewalld 覆盖了。
案例三:时区不对,告警时间点全乱
现象:设置了"每天 9 点发告警邮件",实际 17 点(UTC 9 点)才发。
根因:docker compose 里没配 TZ=Asia/Shanghai,容器用 UTC。
修复:所有服务都加 TZ: Asia/Shanghai,Zabbix Web 装完后还要在 UI 里:Administration → Timezone → Asia/Shanghai。
注意:MySQL 时区也要改,否则历史数据查询时区错乱:
Prometheus → Zabbix 迁移速查(对已有 Prometheus 的团队)
| Prometheus 概念 | Zabbix 对应 |
|---|---|
| target | 监控对象(Host) |
| metric | item |
PromQL rate() |
item 类型 Zabbix agent (active) 或 Zabbix agent |
| alerting rule | trigger |
| Alertmanager | 通知(Media type + Action) |
| Dashboard | Dashboard(Web UI 内建) |
| Grafana | 无对应(要用 Grafana + Zabbix datasource) |
迁移难点:
- PromQL 表达式到 Zabbix trigger 表达式的手动改写(工具不完全兼容)
- exporter 到 Zabbix Agent2 item key 的映射(社区有一些 exporter for Zabbix)
- 告警路由逻辑(Zabbix 是主机/组维度,Prometheus 是 label 维度)
这一点我也不完全确定:Zabbix 7 有个 "Prometheus exporter" 组件,理论上可以直接推 PromQL 数据到 Zabbix,但生态还不成熟,作者没大规模用过,仅供参考。
总结
Zabbix 7 Docker 部署比想象中简单,四件套 Compose 起,5 步装完 Web UI。选型问题上,Prometheus 和 Zabbix 不是二选一:纯云原生选 Prometheus,纯传统基础设施选 Zabbix,混合环境两套共存最保险。
我觉得对已有 Prometheus 的团队来说,加 Zabbix 主要是补 Windows 和物理机监控这块短板;对刚起步的团队,Zabbix 的 Web UI 上手门槛更低,5 分钟能配第一个告警,不用先学 PromQL 再等 exporter。但 K8s 大规模场景 Prometheus 依然是首选,这一点没有争议。
本文由 ops.jiunotes.top 独立撰写。所有 Docker Compose 配置、部署步骤、选型决策均为作者实操记录,未搬运 Zabbix 官方文档正文或英文教程内容。配置参考 Zabbix 官方文档 和 Docker Hub zabbix 镜像。CC BY-NC-SA 4.0。