Docker Compose 快速部署 Zabbix 监控系统实战指南
2026/9/16 10:03:43 网站建设 项目流程

1. 为什么用 Docker 部署 Zabbix

1.1 Zabbix 到底解决什么问题

先聊点实在的。做运维或者自己维护服务器的人,早晚会遇到这么几个问题:服务器磁盘满了没人发现、进程挂了一夜业务全断、某个接口突然变慢却不知道从哪开始查。Zabbix 这种监控告警平台,说白了就是给你的服务器群请一个 24 小时不睡觉的哨兵,盯着 CPU、内存、磁盘、网络流量这些基础指标,还能通过自定义脚本盯业务层面的东西,一旦指标超过阈值就通过邮件、钉钉、企业微信这些渠道把你从被窝里薅起来。

Zabbix 在企业级监控里属于元老级选手。和 Prometheus 这类偏云原生的方案相比,Zabbix 的优势在于它什么都管——服务器、虚拟机、网络设备、数据库、中间件,只要能采集到数据就能监控,而且它有自带的前端界面,可视化、告警配置、权限管理都做得很完整。Prometheus 要搭一套完整的告警体系得配 Alertmanager、Grafana 一堆组件,Zabbix 开箱即用,中小型团队想快速落地一套监控体系,选 Zabbix 通常是最稳的。

但 Zabbix 也有一个让运维头疼的毛病:依赖环境太多。Server 端要 PHP、要 Apache/Nginx、要 MySQL/PostgreSQL,Agent 端每个被监控的主机都要装对应版本,版本不匹配还可能出现兼容问题。以前我在 CentOS 7 上手工装一套 Zabbix,光解决 PHP 依赖就能耗掉半天,遇到 glibc 版本不对更是想砸键盘。

这就是 Docker 部署方案的价值所在——镜像把 Zabbix Server、Web 前端、数据库这些组件全部封装好了,拉下来跑起来就完事,不用自己处理依赖,升级也方便。

1.2 单体安装与容器化部署的取舍

这里把两种方式放在一起对比,方便大家做决策。

对比项传统 YUM/源码安装Docker 部署
环境依赖要手动装 PHP、HTTP Server、数据库,版本冲突常发生镜像自带依赖,省心
升级回滚升级可能破坏现有配置,回滚麻烦换标签重新拉镜像,秒级回滚
数据持久化数据在系统目录,备份路径直观需要提前规划数据卷挂载,否则容器一删数据全没
资源占用与宿主共享运行环境,略省资源多一层容器封装,占用略多,但可接受
运维门槛熟悉 Linux 包管理的老人操作顺手需要懂 Docker 基础操作,新手友好度反而更高
适合场景已有裸机环境、网络受限、合规要求不能上容器新部署项目、需要快速交付、开发测试环境

坦率说,如果你们公司有一套非常成熟的 Puppet/Ansible 自动化运维体系,传统方式也能跑得很好。但如果是新搭一套监控系统,特别是就想先跑起来看看效果再逐步完善的场景,Docker Compose 绝对是性价比最高的选择。

还有一点容易被忽略:Docker 部署让 Zabbix 的环境和宿主隔离,出问题不会污染宿主机的运行环境。比如 Zabbix Server 需要某些特定版本的库,这些库只装进容器里,不牵扯宿主机的其他服务。我们当年在 Ubuntu 和 CentOS 混用的环境里部署,用 Compose 一次就把两边搞定了,这在传统方式下至少要折腾两天。

2. 部署前必须先搞懂的几个组件

2.1 Zabbix Server、前端、数据库、Agent 各管什么

Zabbix 全家桶有四个核心角色,刚接触的人容易搞混,先梳理一下。

Zabbix Server是大脑。它负责接收 Agent 传来的数据、执行数据采集、触发告警逻辑、保存历史数据。所有的监控规则、触发器表达式都在 Server 上运行。

Zabbix Web 前端是脸面。我们用浏览器访问的那个管理界面,它本身不参与监控逻辑,只是提供一个操作面板,配置主机、看图表、管理告警媒介都在这层做。前端通过 PHP-FPM 与 Server 通信,本质上就是一个 Web 应用。

数据库是记忆。Zabbix 把配置信息、历史监控数据、告警事件全部存进数据库,默认支持 MySQL、PostgreSQL,新版对 TimescaleDB 也有不错的支持。数据库的容量规划直接关系到监控历史的留存时间。

Zabbix Agent是手脚。它安装在每一台被监控的主机上,采集本地指标数据,然后推给 Server(或者 Server 主动拉取)。除了 Agent,Zabbix 还支持 SNMP、JMX、IPMI 等多种被动采集协议。

理解了这四个角色的分工,再看 Docker Compose 的编排文件就非常清晰了——本质上就是把四个角色分别做成容器,按需组合起来。

2.2 Compose 编排的核心逻辑

用 Docker Compose 部署 Zabbix,核心就一句话:把一个完整系统拆成多个容器,容器之间用网络连通、用数据卷共享数据

网络层面,Zabbix Server、Web 前端、数据库三个容器必须在同一个 Docker 网络里,才能互相通过服务名访问。Compose 默认会创建网络,只要在服务配置里不加特殊指定,它们就能互相 ping 通。

数据层面,数据库的数据目录、Zabbix Server 的配置文件、Web 前端的配置文件都必须挂载到宿主机,不然容器重建一次就全部归零。这一点新手特别容易踩坑,后面细说。

有个细节要特别提一下:Zabbix 官方镜像分两种。一种是zabbix-zabbix-server-pgsql(或 mysql),镜像里内置了数据库连接工具,但这个镜像本身不包含数据库 Server,需要用外置数据库容器;另一种是zabbix/zabbix-appliance,它把 Zabbix Server、Web 前端和数据库打包在一起,适合快速体验,但不适合生产环境,因为所有组件耦合在一个容器里,维护和扩容都不方便。我建议生产环境还是用分开的容器部署,灵活性强。

时区问题也要提前规划。Zabbix 默认时区是 UTC,如果不加环境变量把时区指到Asia/Shanghai,你看到的告警时间和图表时间会比实际晚 8 小时,排查问题时非常容易误判。

3. 实战:docker compose 搭建 Zabbix 全套

3.1 准备目录结构和环境变量

正式开始之前,先把宿主机目录规划好。我的习惯是所有监控相关的容器文件放在/data/zabbix目录下,统一管理。

注意,部署前先确认宿主机装了 Docker 和 Docker Compose。Docker 版本建议 20.10 以上,Compose 用 V2(即docker compose命令,注意中间有空格)。还在用docker-compose的老版本也兼容,但能用新版就别用旧的。

mkdir -p /data/zabbix/{mysql-data,server-conf,web-conf,scripts} cd /data/zabbix

目录说明:

  • mysql-data:数据库持久化目录
  • server-conf:Zabbix Server 配置文件挂载目录
  • web-conf:Zabbix Web 前端配置文件挂载目录
  • scripts:放自定义告警脚本(后面配置告警时用)

3.2 编写 docker-compose.yml

这里我提供一个可以直接抄作业的完整 Compose 文件。数据库我用 MySQL 8.0,如果你对 PostgreSQL 更熟悉,替换成对应镜像即可,Zabbix 对两种数据库的支持都很成熟。

version: "3.8" networks: zbx-net: driver: bridge volumes: zabbix-db: services: mysql: image: mysql:8.0 container_name: zabbix-mysql restart: always environment: MYSQL_DATABASE: zabbix MYSQL_USER: zabbix MYSQL_PASSWORD: zabbix_pwd MYSQL_ROOT_PASSWORD: root_pwd TZ: "Asia/Shanghai" command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_bin - --default-authentication-plugin=mysql_native_password volumes: - /data/zabbix/mysql-data:/var/lib/mysql networks: - zbx-net zabbix-server: image: zabbix/zabbix-server-mysql:alpine-6.4-latest container_name: zabbix-server restart: always environment: DB_SERVER_HOST: mysql MYSQL_DATABASE: zabbix MYSQL_USER: zabbix MYSQL_PASSWORD: zabbix_pwd TZ: "Asia/Shanghai" ports: - "10051:10051" volumes: - /data/zabbix/server-conf/alertscripts:/usr/lib/zabbix/alertscripts depends_on: - mysql networks: - zbx-net zabbix-web: image: zabbix/zabbix-web-nginx-mysql:alpine-6.4-latest container_name: zabbix-web restart: always environment: ZBX_SERVER_HOST: zabbix-server DB_SERVER_HOST: mysql MYSQL_DATABASE: zabbix MYSQL_USER: zabbix MYSQL_PASSWORD: zabbix_pwd PHP_TZ: "Asia/Shanghai" ports: - "8080:8080" - "8443:8443" depends_on: - mysql - zabbix-server networks: - zbx-net

这段配置里几个关键参数再解释一下。

restart: always保证容器异常退出后自动拉起。监控系统本身就是用来盯着别人有没有挂的,自己绝不能先挂。

depends_on控制启动顺序,MySQL 先启动,然后 Server,最后 Web。注意 depends_on 只保证启动顺序,不保证 MySQL 已经就绪可用,所以有可能出现 Zabbix Server 启动时连不上数据库的情况。这种问题多发生在前几次启动阶段,Zabbix Server 容器一般会自动重试连接,稍等片刻即可恢复。

ZBX_SERVER_HOST是 Web 容器用来连 Server 容器的服务名,因为在一个 Docker 网络内,用服务名zabbix-server即可,不需要 IP。

数据库字符集我特意指定为utf8mb4,这是兼容中文和特殊字符的最小配置。如果是 MySQL 5.7,不需要加mysql_native_password那行,但 MySQL 8.0 必须加,否则 Zabbix Server 连不上数据库——这个坑我踩过,后面在常见问题里细说。

3.3 初始化数据库与访问前端

配置文件写好之后,启动就一句话的事。

docker compose up -d

首次启动时,Docker 会从镜像仓库拉取依赖镜像。如果你在国内服务器上执行,这一步很可能会非常慢,甚至直接超时。建议先配置 Docker 镜像加速器,编辑/etc/docker/daemon.json

{ "registry-mirrors": ["https://docker.m.daocloud.io"] }

重启 Docker 后重新拉取镜像。

镜像拉取完成后,等待容器全部进入运行状态,然后用docker ps确认。

启动完成后第一次访问 Web 界面,需要等一下让 Server 完成数据库初始化,浏览器打开http://你的服务器IP:8080,能看到 Zabbix 的欢迎页和前端初始化向导。向导会让你确认数据库连接参数,这里直接沿用 Compose 文件里的配置信息填写即可。

这里有个经验分享:不要跳过初始化向导直接改配置文件。向导会在数据库里创建初始 schema 和默认模板,这是 Zabbix 能正常运行的基础。等向导跑完,就能看到 Zabbix 的登录页面,默认用户名Admin,密码zabbix

登录后第一件事是改密码,这个不用我提醒了吧。

3.4 验证监控链路是否正常

部署完成后,最好验证一下整体链路是不是真的通了,别等出问题再排查。

切到 Zabbix Web 界面的 Reports -> System information 页面,如果部署正常,会看到 Zabbix Server is running 状态为 Yes。

然后用一个最简单的方法验证采集链路:在命令行为 Zabbix Server 容器内的zabbix_get工具做一次主动采集验证。

docker exec -it zabbix-server zabbix_get -s 127.0.0.1 -k agent.ping

返回1说明 Zabbix Server 能正常请求 Agent,链路是通的。这一步能排除很多因为网络隔离导致的采集故障。

4. 核心配置:告警通知与Agent接入

4.1 配置邮件、钉钉、企业微信告警的思路

监控搭好了,不配告警等于白干。告警媒介(Media Type)是 Zabbix 把告警消息推送到外部渠道的通道,内置支持邮件、短信、脚本等多种类型。

邮件告警是最传统也最通用的方式。Zabbix 6.4 自带的邮件告警脚本走 SMTP 协议,只需要在 Administration -> Media types -> Email 里配置 SMTP 服务器、账号、密码即可。注意很多企业邮箱需要单独申请 SMTP 授权码,不带授权码直接填登录密码通常发不出去。

钉钉/企业微信告警思路类似,本质都是通过一个 Webhook 地址把消息 POST 出去。Zabbix 6.4 官方没有内置钉钉的 Media Type,需要用自定义脚本实现,这也是我前面在 Compose 文件里挂载alertscripts目录的原因。脚本思路大同小异:接收 Zabbix 传入的告警标题和内容,拼装成 JSON 格式,然后通过 curl 发给钉钉机器人的 Webhook 地址。

这里附一个简易的钉钉告警脚本,大家可以根据自己的机器人加签方式调整:

#!/bin/bash # 钉钉机器人 Webhook WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的TOKEN" # Zabbix 传进来的参数:第一个参数是消息标题,第二个是消息内容 TITLE=$1 MESSAGE=$2 curl -s -H "Content-Type: application/json" -d "{ \"msgtype\": \"text\", \"text\": { \"content\": \"[Zabbix告警] ${TITLE}\n${MESSAGE}\" } }" "$WEBHOOK_URL"

脚本放到宿主机的/data/zabbix/scripts目录后,给执行权限:

chmod +x /data/zabbix/scripts/dingtalk.sh

然后到 Zabbix Web 界面添加一个 Media Type,类型选 Script,脚本名填dingtalk.sh,给某个用户配置这个告警媒介,触发器触发后就会调用脚本推送。

关键是要测试一遍告警链路。在配置好的 Media Type 里点击 Message templates 旁边的测试按钮,输入标题和内容试发一下,确认能收到消息再把告警动作真正关联到主机上。否则大半夜磁盘满了,结果告警发不出来,那不是监控,那是事故前奏。

4.2 添加被监控主机的标准流程

Agent 接入是监控的核心操作,流程顺着做一遍其实不复杂,但有个优先级问题:先在被监控主机上装 Agent,再到 Zabbix Web 里添加主机,顺序反了会出现主机状态显示但没数据的怪问题。

Debian/Ubuntu 系统安装 Agent 的命令:

wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb apt update apt install -y zabbix-agent

CentOS/RHEL 系统安装 Agent:

rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8.noarch.rpm dnf install -y zabbix-agent

安装完成后改配置文件/etc/zabbix/zabbix_agentd.conf,最核心的是三个参数:

Server=你的Zabbix Server IP ServerActive=你的Zabbix Server IP Hostname=被监控主机的名称

Server是允许哪些 Server 来主动采集数据,ServerActive是 Agent 主动向哪个 Server 上报数据。如果只是被动模式,只配 Server 就行;如果想用主动监控(Zabbix 6.4 推荐的主agent模式),两个都要配。Hostname 必须与 Web 前端添加主机时的名称完全一致,否则 Server 会拒绝接收数据。

重启 Agent 服务:

systemctl restart zabbix-agent systemctl enable zabbix-agent

然后在 Web 前端 Data collection -> Hosts -> Create host,填主机名和 IP,关联一个 Linux by Zabbix agent 模板,稍等一两分钟就能在 Monitoring -> Latest data 里看到采集到的数据了。

5. 踩坑实录:高频问题排查

5.1 zabbix server is not running 的三种可能

"Zabbix server is not running: the information displayed may not be current." 这句话大概是所有 Zabbix 用户都见过的一句报错。看到它别慌,先按下面三个方向排查。

一是 Server 容器真的挂了。docker ps看容器状态,如果显示 Exited,看日志定位问题:

docker logs zabbix-server --tail 100

常见原因是数据库连接失败——密码不对、数据库还没初始化完成、数据库字符集不兼容。

二是 Server 进程活着,但数据库连接池异常。这种情况容器状态正常,但 Server 内部反复报连接数据库失败。多半是数据库账号权限问题,或者长时间运行后连接数被耗尽。重启容器通常能临时解决,根治要优化数据库连接池配置。

三是 Web 前端和 Server 之间有缓存。有时候 Server 明明运行正常,但前端一直显示 not running。清一下浏览器缓存,或者检查一下 ZBX_SERVER_HOST 是否配置正确。还有个小细节:Zabbix 前端的check now按钮能强制前端立即刷新一次状态,有必要时就手动点一下。

根据我实际排查经验,80% 的情况下都是数据库连接问题,所以优先看日志,别一上来就怀疑代码坏了。

5.2 Access denied for user 的处理

"Access denied for user 'zabbix'@'localhost' (using password: YES)" 这类报错常见于两种场景:

场景一:Zabbix Server 容器启动时报的。说明 Zabbix Server 试图连接 MySQL,但认证被拒。可能有三种原因:密码不一致;MySQL 用户使用了不兼容的认证插件;Zabbix Server 连的 host 不是 MySQL 容器。

排查方式:

docker exec -it zabbix-mysql mysql -uzabbix -pzabbix_pwd -e "select 1;"

如果能执行成功,说明账号密码没问题,问题大概率出在 Zabbix Server 连接 DB 时用的 host 不对。确认 Compose 里DB_SERVER_HOSTMYSQL_USER/MYSQL_PASSWORD三者的匹配关系。

场景二:Web 前端登录时或者前端配置 DB 时报的。这个大概率是 Web 容器连接 MySQL 时用了错误的认证方式。前面 Compose 里我特意加了--default-authentication-plugin=mysql_native_password,就是为了兼容 Zabbix Web 容器内的 PHP 老版本认证逻辑。如果是 MySQL 8.0 默认的 caching_sha2_password,老版本 PHP 驱动认不了这个加密方式,就会报 Access denied。

解决方式就是在 MySQL 容器的启动参数里指定mysql_native_password,或者手动创建用户时指明认证插件:

CREATE USER 'zabbix'@'%' IDENTIFIED WITH mysql_native_password BY 'zabbix_pwd'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%'; FLUSH PRIVILEGES;

5.3 镜像拉取慢与容器时区问题

镜像拉取慢是国内用户最常见的痛。除了配置 registry mirror 外,还有一个技巧:有些 Docker 镜像在多个仓库都有副本,比如 Zabbix 官方镜像同时在 Docker Hub 和 quay.io 有发布,如果 Docker Hub 拉不动,就换 quay.io 试试。修改镜像地址为quay.io/zabbix/zabbix-server-mysql:alpine-6.4-latest即可。

时区问题则更隐蔽。我就被坑过一次:配置的告警在下午 3 点触发,结果邮件里显示时间 7 点,当时差点以为是 Zabbix 时间计算出了 bug。排查下来发现是 PHP 的时区设置不对,Zabbix Web 容器里PHP_TZ虽然指向了 Asia/Shanghai,但数据库连接时用了 UTC 的时间戳,导致前端展示的时间和实际告警时间对不上。

解决办法是保证三层时区都一致:宿主机时区、容器环境变量的TZ、PHP 的PHP_TZ。宿主机时区在部署前就检查好:

timedatectl set-timezone Asia/Shanghai

5.4 数据持久化与容器重建

很多人一开始图省事,部署时没有挂载数据卷,等到要升级镜像或者改配置需要重建容器时,才意识到数据全没了。

经验之谈:凡是涉及数据库、配置文件、日志文件的目录,一定要挂载到宿主机。

docker cp zabbix-server:/etc/zabbix/zabbix_server.conf /data/zabbix/server-conf/zabbix_server.conf

如果早期部署没挂载,用docker cp先把容器里的数据备份到宿主机,然后重新用带 volume 的 Compose 文件重建容器。注意数据库的备份恢复要更谨慎,MySQL 数据目录直接拷走的兼容性有限,最稳的是用mysqldump导出再导入。

6. 进阶玩法:GPU监控、交换机SNMP、大屏展示与MySQL专项

6.1 监控 Windows GPU 的方案

热搜词里出现了很具体的需求:zabbix监控windowsgpu。这个需求通常在 AI 训练、图形渲染类的 Windows 工作站上比较常见。GPU 温度、显存占用、核心利用率这些指标,Zabbix 自带的 Windows 模板里没有内置,需要组合方案来实现。

思路有两种。一种是用 Windows 性能计数器(Performance Counter)采集。Zabbix Agent 支持通过perf_counter键值直接读取 Windows 的性能计数器,比如 GPU 引擎利用率对应的计数器路径通常是\GPU Engine(*)\Utilization Percentage。但 GPU 性能计数器在不同驱动版本下名称差异很大,配置起来比较繁琐。

另一种思路更优雅——用第三方工具把 GPU 指标转成 Zabbix Agent 能识别的方式。常见做法是安装 GPU-Z 的日志记录功能,把 GPU 状态指标写入文件,再让 Zabbix 用vfs.file系列键读取。这种方法对硬件要求低,而且不依赖厂商 SDK。

我实际测试后觉得,Windows 下相对靠谱的是nvidia-smi配合脚本。用脚本周期性执行nvidia-smi --query-gpu=temperature.gpu,utilization.gpu,memory.used --format=csv,noheader,把输出写入一个文本文件,然后在 Zabbix 里用zabbix_get -s windows主机 -k vfs.file.contents[文件路径]读取,再用前置处理截取对应字段。虽然不完美,但胜在稳定,兼容各代 N 卡。如果非要实时性特别高,就得走 SNMP 或者自定义 Agent 采集器这条路,但复杂度也上去了。

6.2 用 SNMP 监控交换机和网络设备

服务器监控是 Zabbix 的基本功,网络设备监控才是它的拿手好戏。企业里华为、H3C、思科的交换机,普遍支持 SNMP 协议。Zabbix 通过 SNMP 采集交换机的接口流量、CPU 利用率、内存状态、光功率等指标。

开启交换机 SNMP 的配置因厂商而异,以常见的 H3C 交换机为例:

snmp-agent snmp-agent sys-info version v2c snmp-agent community read cipher public_monitor

然后在 Zabbix Web 前端 Configuration -> Hosts -> Create host,主机类型选 SNMP,填入交换机管理 IP、SNMP community(默认 public,如果有修改要填对应的),关联模板时选Template Network Generic Device SNMPv2或针对具体厂商的模板。

这里容易踩坑的是端口索引问题。SNMP 采集的接口流量如果发现和交换机上实际端口对应不上,多半是 ifIndex 偏移问题,因为不同厂商的 ifIndex 对应关系不一致。解决办法是在模板的宏里调整{$SNMP_COMMUNITY}{$IFNAME_MAPPING}相关参数。说实话这个调起来有点磨人,我当年负责几十台交换机接入时,前几台确实费了时间,但出了标准流程后,后面都很快。

6.3 Zabbix + Grafana 监控大屏

Zabbix 自带的前端图表有一定的可视化能力,但论展示效果,Grafana 才是真正的颜值担当。用 Grafana 接 Zabbix 数据源的方案在企业里非常流行,特别是zabbix监控大屏这种场景,客户要的就是那种一个大屏上实时滚动各类指标的效果。

Grafana 接入 Zabbix 需要装第三方的alexanderzobnin-zabbix插件:

grafana-cli plugins install alexanderzobnin-zabbix-app

重启 Grafana 后在插件里启用 Zabbix 数据源,填入 Zabbix Server 的 API 地址(通常是http://zabbix-web:8080/api_jsonrpc.php)、用户名、密码,就能在 Grafana 里直接选用 Zabbix 的监控项做面板了。

大屏展示还有个刚需:生成 PDF 报告。Grafana 自带的Report功能可以定时生成 PDF 并邮件发送,但需要配置 grafana-image-renderer 插件。如果你要的是把 Zabbix 历史数据导出做周报月报,也可以用 Zabbix API 拉取历史数据配合脚本生成表格报告,灵活度更高。

6.4 专项深度:Docker 部署 MySQL 8.0 并在 Zabbix 中监控

热词里有个docker安装mysql8.0并使用,这个场景和 Zabbix 的结合点在于:很多内部业务系统的数据库就是跑在 Docker 里的 MySQL 8.0,这些库也需要纳管监控。

先在宿主机部署一个独立于 Zabbix 数据库之外的业务 MySQL 8.0:

docker run -d \ --name mysql-business \ -e MYSQL_ROOT_PASSWORD=root_pwd \ -p 3307:3306 \ -v /data/mysql-business:/var/lib/mysql \ mysql:8.0

然后到目标 MySQL 上创建一个 Zabbix 专用的只读监控账号:

CREATE USER 'zbx_monitor'@'%' IDENTIFIED BY 'monitor_pwd'; GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'zbx_monitor'@'%'; FLUSH PRIVILEGES;

Zabbix 6.4 自带 MySQL by Zabbix agent 2 模板。需要在被监控主机上安装zabbix-agent2,并启用 MySQL 插件:

apt install -y zabbix-agent2 zabbix-agent2-plugin-mysql

然后在 agent2 的配置里提供 MySQL 连接信息,或者在 Zabbix Web 端主机 macros 里配置宏变量。

验证时重点看一下mysql.status[Uptime]mysql.status[Threads_connected]mysql.status[Bytes_received]这些指标是否能取到值,能取到说明 MySQL 监控链路已通。

7. 从零到生产:我的一点经验总结

如果这篇文章你只记一段话,那就记住这句:Docker 部署 Zabbix 最大的价值不是省去安装步骤,而是让整套监控系统具备可复制性和可维护性。一次写好 Compose 文件和监控规范,后续加一台被监控主机、加一个监控模板、换一条告警通道,都是在既定框架上操作,不会每次改环境都手忙脚乱。

再分享一个细节经验。生产环境的 Zabbix Server 通常会收到大量数据,默认配置下 SQLite 或者小型 MySQL 顶不住,建议在 Compose 里给 MySQL 容器加上资源限制参数:

deploy: resources: limits: cpus: "2" memory: 4G

避免 Zabbix 和数据互相争抢宿主资源,监控系统把自己的宿主搞挂了,那真的是黑色幽默。

另外,给数据库加个自动备份任务。Zabbix 的配置和数据都在数据库里,数据库一旦损坏,你的监控体系就得从头搭建。我的做法是每天凌晨用 cron 执行:

docker exec zabbix-mysql sh -c 'exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD zabbix' > /data/backup/zabbix_$(date +\%F).sql

保留最近 7 天的备份文件即可,占不了太多磁盘空间,关键时刻能救命。

从部署到跑起来,再到慢慢调优模板、完善告警策略、接入更多设备,这套体系会越来越顺手。监控系统这种东西,最怕的不是功能少,而是部署太复杂到最后没人愿意维护。Docker 给了我们一个低成本起步、渐进式完善的最佳路径,用好它,省下的时间足够你多睡几个好觉。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询