跳转至

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 步向导:

  1. 信息页:直接下一步
  2. 前置检查:如果显示红色错误,看下面「踩坑案例」
  3. 数据库设置:Zabbix 自动填充,确认 host=mysql, database=zabbix, user=zabbix, password=zbx_app_2024
  4. 安装设置:Zabbix 服务器地址填 server(服务名,不是 IP)
  5. 确认安装:完成

安装完成后,登录 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 只保证启动顺序,不保证服务就绪。

排查:

docker exec -it zbx-mysql mysqladmin status -uzabbix -pzbx_app_2024
# 应该输出 Uptime: xxx seconds

修复:加 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 时区也要改,否则历史数据查询时区错乱:

-- 在 MySQL 里
SET GLOBAL time_zone = '+08:00';

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。