
之前每次帮人搭监控我基本都是同一个套路先问清楚规模再确认要监控什么然后直接上一套Zabbix。原因很简单二三十台服务器加数据库、中间件的企业内网Zabbix 是最省心的选择模板齐全、文档多、告警策略成熟。而现在有了 Docker把这套平台跑起来的成本又低了一大截——一条 docker compose 命令把 Server、数据库、Web 全部拉起剩下的精力几乎都花在配置监控项和告警上而不是耗在编译安装和依赖地狱里。这篇文章就把我从环境准备到告警落地的完整过程拆开讲重点围绕 Docker 部署 Zabbix 监控告警平台这件事compose 文件怎么写、每个参数为什么这样配、装完 Agent 之后怎么接第一台主机、告警怎么真正推到人以及半年来踩过的各种坑。适合两类人看一是运维或 DevOps 工程师想在半天内给公司搭一套能用的监控告警体系二是自己服务器上喜欢折腾的老手想快速体验 Zabbix 7.0 LTS 的新特性。看完照着操作一台干净服务器就能变成一个可用的企业级监控平台。1. 为什么是 Docker Zabbix这套组合解决什么问题1.1 Zabbix 凭什么还是监控主力Zabbix 从最早发布到现在二十多年了中间各种监控系统起起伏伏Prometheus 的生态越来越大但 Zabbix 在传统企业内网里依然有大量部署。一个重要原因是它“全”Linux、Windows 系统指标不在话下网络设备的 SNMP 监控、服务器硬件的 IPMI 带外管理、数据库和中间件的自定义采集全都有现成模板或成熟方案。比起 Prometheus 更适合做云原生指标Zabbix 对传统 IT 基础设施的覆盖是它的老本行尤其上了规模之后自动发现和模板批量关联这两件事能省下大量重复劳动。国产开源监控里夜莺监控这几年口碑也不错界面现代、上手快但坦白讲如果你没有团队做二次开发Zabbix 的社区资料丰富程度和各类“玄学问题”的解决方案沉淀还是更足一些。尤其是在中小团队里出了问题能搜到答案比什么都重要。这次我用 Docker 部署 Zabbix目的就是把它的部署成本压到最低让团队不用花一整周去搭环境而是把时间花在真正有用的告警策略上。1.2 用 Docker 部署的收益和边界不少人一听到 Docker 部署监控平台第一反应是“生产环境能行吗”我的回答是完全能行但要把边界想清楚。Docker 化部署的好处很直接一是环境隔离宿主系统是 Ubuntu 还是 openEuler 都不重要只要 Docker 引擎能跑镜像起来就是一致的环境团队里任何一个人都能复制部署过程二是升级回滚方便官方镜像发布新版本后改一下 tag 重新 compose up 即可出问题也能切回旧版本三是资源占用可控一个跑二三十台机器监控的小型 Zabbix 平台2 核 4G 的机器绰绰有余容器本身的开销几乎可以忽略。边界也很明显。第一不要用 latest 标签镜像版本必须锁定比如7.0-ubuntu否则哪天镜像更新了容器一重建就是跨版本升级很容易出兼容性问题。第二数据卷规划要提前想好Zabbix 的核心资产是数据库里的历史数据和配置容器可以随便重建数据卷丢了就全完了。第三时区、字符集这类基础设置要在部署时一次配好后面再改虽然能改但中间踩坑的成本不值当。最后如果以后规模大到几千台设备单机部署就不够了需要引入 Zabbix Proxy 做分布式采集这东西同样可以容器化架构上留好扩展空间就行。2. 部署前的整体设计组件拆解与版本选型2.1 Zabbix 容器化后有哪些组件Zabbix 本身的架构不算复杂由几个各司其职的部分组成。核心是 Zabbix Server它负责接收数据、执行触发器判断、发送告警是整个平台的“大脑”。数据要存下来所以要有数据库Zabbix 官方同时支持 PostgreSQL 和 MySQL。人要看数据、做配置于是有了 Zabbix Web它是一套 PHP 和 Nginx或者 Apache组成的前端界面。最后是 Agent装在每台被监控的机器上负责采集指标并上报给 Server。用生活类比的话Server 是公司的运营中枢数据库是它的笔记本Web 是前台接待窗口Agent 则是派驻到各个业务部门的信息员。而 Zabbix Proxy 相当于片区经理当辖区太大、分公司太多时由它先在本地收集信息再统一汇总到总部减轻 Server 的压力。Docker 化之后这些组件各自跑在一个容器里通过 compose 创建的内部网络互相通信。最小可用部署就是三件套Server、数据库、WebAgent 单独装在被监控机器上不需要容器化。2.2 版本选型直接上 Zabbix 7.0 LTS版本选择这里我建议新部署直接上 7.0 LTS不要再用 5.0、6.0 了。Zabbix 版本有 LTS 和普通版本之分LTS 长期支持版本会提供数年的维护更新适合生产环境。7.0 是 2024 年发布的 LTS 版本新前端界面明显现代了不少而且 Agent 2 内置插件更丰富对 Windows GPU、Oracle 等监控场景的支持比旧版好很多历史数据存储和查询也有针对性的优化。版本是否 LTS建议5.0 LTS是已接近维护末期新项目不推荐6.0 LTS是存量升级可选但没必要新用7.0 LTS是新部署直接用维护周期长镜像 tag 有一定规律。以 PostgreSQL 版为例官方镜像名是zabbix/zabbix-server-pgsql配合7.0-ubuntu这样的版本 tag 使用。有的教程喜欢用alpine-7.0-latest也问题不大但我个人更偏好 ubuntu 版本排障时能用 apt 装一些排查工具比如 vim、curl省事不少。需要留意的是Agent 老版本连 Server 7.0 是兼容的但为了用上 Agent 2 的新插件被监控机器上最好也统一升到 7.x。2.3 网络与数据卷规划部署前先把这两件事定下来部署前花五分钟想清楚网络和数据卷能避免后续大量返工。网络方面compose 会自动创建一个 bridge 网络三个容器之间用服务名互相访问就行不需要写成 IP。对外只需暴露两个端口Web 界面端口一般用宿主机的 8080 映射容器的 8080Server 的 10051 端口这是给 Agent 主动上报和 Zabbix Proxy 上报数据用的。很多新手第一次配端口时会搞混Agent 被动模式的检查是 Server 主动连接 Agent 的 10050 端口数据方向是从 Server 指向 Agent而 Agent 主动模式是 Agent 连 Server 的 10051方向反过来。如果是公司内网环境10051 端口需要在防火墙上放行否则装了 Agent 开了主动模式也上报不了数据。关于 10050一般只需要在被监控机器的本机防火墙放行即可不用暴露到外网。数据卷方面最重要的就是数据库。PostgreSQL 的数据必须挂到命名卷或宿主机目录否则docker compose down再up之后历史数据全部丢失。Zabbix Server 容器如果要跑自定义脚本、外部检查也需要挂载对应目录比如/usr/lib/zabbix/alertscripts放告警脚本/usr/lib/zabbix/externalscripts放外部采集脚本。Web 容器如果遇到中文乱码需要补字体同样要挂载字体文件或者把字体复制进去。时区问题也要在 compose 里一次配好。容器默认是 UTC 时间如果不设置图表时间线会比北京时间差 8 小时告警时间看起来也会很别扭。Server 容器设置TZAsia/ShanghaiWeb 容器设置PHP_TZAsia/Shanghai数据库容器也建议把 TZ 带上这是经验之谈。3. 手把手部署Compose 文件编写与启动3.1 Docker 环境准备Ubuntu 22.04 为例我这次部署用的是一台 Ubuntu 22.04 的服务器系统本身是干净的。安装 Docker 的部分就不啰嗦了直接给操作步骤。Ubuntu 上最简单的办法是直接用官方源安装 docker-ce 和 compose 插件sudo apt update sudo apt install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release echo $VERSION_CODENAME) stable | \ sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装完后验证一下sudo docker compose version然后是镜像加速配置。国内拉 Docker 官方镜像确实慢这是很多人部署时卡住的第一道坎。做法是编辑/etc/docker/daemon.json把云厂商提供的镜像加速地址填进去{ registry-mirrors: [ https://你的加速地址.mirror.aliyuncs.com ] }加速地址需要在云厂商的控制台申请这里不展开具体操作。如果公司内网有自建的镜像仓库直接填内网地址更合适。改完后重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker顺便把当前用户加入 docker 组避免后面每条命令都加 sudosudo usermod -aG docker $USER退出重新登录后生效。3.2 docker-compose.yml 完整示例和参数解析Zabbix 官方提供了一套基于 postgres 的 docker compose 参考但默认配置有几个小地方需要改时区要设置、密码要换、数据库卷要显式声明。我整理了一份适合企业内网最小化部署的 compose 文件直接保存成docker-compose.ymlservices: postgres: image: postgres:16-alpine container_name: zabbix-postgres restart: always environment: POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix_pass_2024 POSTGRES_DB: zabbix TZ: Asia/Shanghai volumes: - pgdata:/var/lib/postgresql/data networks: - zbx-net zabbix-server: image: zabbix/zabbix-server-pgsql:7.0-ubuntu container_name: zabbix-server restart: always environment: DB_SERVER_HOST: postgres POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix_pass_2024 POSTGRES_DB: zabbix TZ: Asia/Shanghai ports: - 10051:10051 volumes: - /etc/localtime:/etc/localtime:ro depends_on: - postgres networks: - zbx-net zabbix-web: image: zabbix/zabbix-web-nginx-pgsql:7.0-ubuntu container_name: zabbix-web restart: always environment: DB_SERVER_HOST: postgres POSTGRES_USER: zabbix POSTGRES_PASSWORD: zabbix_pass_2024 POSTGRES_DB: zabbix ZBX_SERVER_HOST: zabbix-server PHP_TZ: Asia/Shanghai ports: - 8080:8080 depends_on: - zabbix-server - postgres networks: - zbx-net volumes: pgdata: networks: zbx-net: driver: bridge逐个拆解关键参数。POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_DB是 PostgreSQL 容器初始化时创建用户和数据库的依据注意这里如果数据库卷已经存在旧数据改了密码是不会生效的因为初始化脚本只会在数据目录为空时执行。DB_SERVER_HOST对 Zabbix Server 和 Web 容器来说填的是 PostgreSQL 容器在 compose 网络里的服务名postgres这个非常关键不要填127.0.0.1因为容器之间通信不是通过 localhost。ZBX_SERVER_HOST是告诉 Web 容器 Zabbix Server 在哪里填服务名zabbix-server即可。端口映射方面8080:8080是把 Web 容器里的 8080 暴露到宿主机 8080如果你本机 8080 被占了可以改成别的比如18080:8080。10051:10051是 Server 接收主动上报数据的端口。数据卷pgdata是命名的 volume由 docker 管理数据存在宿主机/var/lib/docker/volumes下这样就算容器重建数据也不丢。另外再补充一个实用挂载。Zabbix 官方镜像默认没有中文字体Web 界面切到中文后图表里中文会是方块。我习惯在 compose 里再挂一个目录或者在容器起来后把字体文件复制进去。更干净的做法是用一个小 DockerfileFROM zabbix/zabbix-web-nginx-pgsql:7.0-ubuntu RUN apt-get update apt-get install -y fonts-wqy-zenhei这样 build 出来的 web 镜像自带中文字体。如果不想维护自定义镜像也可以docker cp把本机字体复制到容器/usr/share/fonts下然后重启容器实测有效。3.3 启动、初始化和 Web 界面配置前面工作准备好后执行启动命令docker compose up -d第一次启动时Zabbix Server 容器会自动等待 PostgreSQL 就绪然后初始化表结构。这个过程一般需要两到三分钟期间可以用日志确认进度docker compose logs -f zabbix-server看到类似server started的日志就说明 Server 已经起来了。这时候再打开浏览器访问http://你的服务器IP:8080应该能进入 Zabbix Web 界面。首次进入会要你选择语言这里直接选 Chinese (zh_CN) 会有一部分系统界面变中文但数据库连接信息一般会因为环境变量正确而自动填好不用手动改。用默认账号Admin和密码zabbix登录登录后会强制要求修改默认密码这个一定要改掉默认密码在公网环境相当于裸奔。改完密码后到用户菜单里把语言设为中文。如果图表里的中文变成方块就是第 3.2 节说的字体问题按字体方案处理即可。到这里核心平台已经跑起来了接下来是接入被监控主机。4. 接入第一台被监控主机Agent 安装、添加主机与告警打通4.1 安装 Zabbix Agent 2Linux 和 Windows 都给你示范Agent 是部署在每台被监控机器上的采集器。7.0 时代推荐直接装 Agent 2也就是zabbix-agent2它对插件的支持更好。以 Ubuntu/Debian 系为例安装过程是先在机器上配置 Zabbix 官方源再安装 agent 2。这里特意提示一下如果服务器是 Rocky、CentOS 这类 RHEL 系需要去 Zabbix 官网下载对应 RPM 包如果是 openEuler、龙蜥这类国产系统也可以按照 RHEL 系的套路安装本质一致。Ubuntu 上安装的典型命令wget https://repo.zabbix.com/zabbix/7.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_7.0-1ubuntu22.04_all.deb sudo dpkg -i zabbix-release_7.0-1ubuntu22.04_all.deb sudo apt update sudo apt install -y zabbix-agent2装完后需要修改/etc/zabbix/zabbix_agent2.conf改三个地方Server监控服务器IP ServerActive监控服务器IP Hostname这台机器唯一标识Server是允许主动连过来做被动检查的服务器 IP如果有多个 Server 或 Zabbix Proxy用逗号分隔。ServerActive是 Agent 主动上报时连接的服务端地址可以填域名或 IP。Hostname这一项在主动模式下尤其重要必须和 Web 界面里添加主机时填的主机名完全一致否则数据会上报失败。改完后启动sudo systemctl enable --now zabbix-agent2Windows 上的安装相对简单去 Zabbix 官网下载 Windows 版本的 MSI 安装包安装过程中会有界面让你填写 Zabbix Server 地址和 Hostname。如果要做静默安装也可以命令行指定参数但图形化装一次就够用了。装完后需要注意 Windows 防火墙默认会拦 10050 端口要放行入站规则否则 Server 被动检查连不上。顺带说一个热词里很多人搜的事情Zabbix 监控 Windows GPU。Agent 2 在 Windows 上支持通过性能计数器采集数据常见的 GPU 使用率计数器是\GPU Engine(*engtype_3D)\Utilization Percentage但不同显卡、不同驱动版本性能计数器的实例名不完全一样需要先在 Windows 的性能监视器里确认再配置监控项。Zabbix 社区的 Windows 模板里也有 GPU 相关监控项可以直接搜模板导入省得自己一个个建。4.2 在 Web 控制台添加主机主动检查 vs 被动检查Agent 装好了下一步到 Web 界面把它加进来。路径是采集→主机→创建主机。填写主机名时要注意这个名字必须是全局唯一的而且如果 Agent 用了主动模式它必须和 agent 配置文件里的Hostname完全一致。IP 地址那一栏填 Agent 机器的实际 IP接口选Agent。然后是关键的一步点击模板选择框输入关键词搜索然后选择Linux by Zabbix agent或者Windows by Zabbix agent。模板是一整套预先定义好的监控项、触发器、图形集合选好之后点添加系统会自动创建几十上百个监控项。这就是 Zabbix 模板生态的威力你不需要从零开始定义 CPU、内存、磁盘那些指标。这里要理解主动检查和被动检查的区别。被动检查是 Zabbix Server 主动连接 Agent 的 10050 端口去取数据适合 Server 和 Agent 网络互通良好的场景。主动检查是 Agent 定期去找 Server 领取任务列表再主动把数据推送到 Server 的 10051 端口适合 Agent 在 NAT 后面、或者 Server 无法直接访问 Agent 的场景。实际操作中很多模板同时带了两套监控项比如Linux by Zabbix agent和Linux by Zabbix agent active前者走被动后者走主动。如果你方向没理清最常见的症状是主机显示绿色心跳但最新数据里什么都没有。我的建议是新接入的主机如果网络允许优先用被动模式排查问题更直观确实有防火墙隔离或跨网段需求的再改用主动模式。4.3 配置告警媒介邮件通知先从 SMTP 开始告警是监控平台的灵魂。Zabbix 的告警链路是三段式触发器判断异常、动作匹配条件、媒介把消息发出去。默认安装后邮件媒介类型是已经存在的但需要你配置 SMTP 服务器信息。路径是管理→报警媒介类型→Email。填 SMTP 服务器地址、端口、SSL/TLS 方式、认证的用户名密码以及发件人地址。用 465 端口一般是 SSL用 587 端口一般是 STARTTLS用 25 端口通常没有加密但容易被运营商拦截。配置完可以先点测试看看能不能成功发送邮件。然后要给用户分配收件地址。路径是用户→用户→ 选择 Admin →报警媒介→添加媒介类型选 Email收件人填自己的邮箱然后启用它。这里容易漏的一步是即使你配好了 SMTP 和用户媒介没有创建动作告警照样不会发。必须到告警→动作→创建动作设置名称配置触发条件比如主机组等于 Linux servers或者模板等于 Linux by Zabbix agent然后在操作里选择发送消息给某个用户组或用户。动作配置里有消息内容模板默认会带上主机、监控项、当前值但建议自己调优一下。我常用的消息正文模板大概是这样的主机: {HOST.NAME} IP: {HOST.IP} 监控项: {ITEM.NAME} 当前值: {ITEM.LASTVALUE} 告警时间: {EVENT.DATE} {EVENT.TIME}这样告警邮件一眼就能看清是哪台机器、哪个指标、当前是多少。配置完动作之后别急着收工手动停止一台机器的 agent 服务等两三分钟邮箱应该就会收到告警邮件。收到邮件后才算把告警链路真正打通这一步不验证后面全是隐患。5. 告警平台进阶让报警更准确不再半夜被轰炸5.1 触发器表达式看懂和写几个常用例子很多团队把监控搭起来后最头疼的不是收不到告警而是告警轰炸——白天黑夜响个不停全是无用告警最后大家直接把通知关了。想要告警真正有价值必须学会写触发器表达式。触发器是判断“什么时候算异常”的逻辑语法格式通常是{主机:监控项.函数(参数)} 操作符 阈值先看几个非常常用的写法。CPU 负载过高比如 5 分钟内平均负载持续超过 4last(/Linux by Zabbix agent/system.cpu.load[percpu,avg1])4这里用last()取最新值配合比较符判断。如果担心瞬时抖动导致误报可以改成min(/主机/监控项,5m)4意思是 5 分钟内的最小值都大于 4 才触发灵敏度低一些但更稳定。磁盘可用空间不足比如根分区可用百分比低于 10%last(/Linux by Zabbix agent/vfs.fs.size[/,pfree])10要注意这里监控项键值里的pfree表示“可用空间百分比”对应的监控项在模板里叫Free disk space on / (percentage)。进程消失或 Agent 断连用nodata()函数比如 5 分钟没有 agent 心跳数据nodata(/Linux by Zabbix agent/agent.ping,5m)1nodata()在“没有数据”时为 1非常适合监控探活。写表达式时最实用的技巧是在消息内容里带上宏比如{ITEM.NAME}显示监控项名称{ITEM.LASTVALUE}显示当前值。这样告警通知会直观很多。新手上路建议从模板自带触发器开始看它们是怎么写的然后照葫芦画瓢改成自己的阈值不要一上来就自己发明新的表达式。5.2 告警收敛与升级维护期、依赖、多步骤通知告警轰炸的另一个解决手段是利用 Zabbix 的维护期和动作升级机制。维护期相当于给监控“放假”在业务发布窗口、停机维护前到告警→维护→创建维护窗口把要维护的主机或主机组加进去设置开始时间和时长。这段时间内即使指标异常也不会触发通知避免大半夜发布脚本稍微慢一点就一堆告警。依赖关系是另一个很好用的收敛手段。比如你监控了一个核心交换机下面挂了二十台业务服务器。交换机一挂这二十台服务器的agent.ping全都会 nodata如果每个都发告警值班同学要被刷屏。解决办法是给监控项或触发器设置依赖业务服务器的“主机不可达”触发器依赖交换机的“接口 down”触发器上游已经触发时下游就不重复发。在触发器级别配置依赖关系即可这个功能很多老手都没用过其实是 Zabbix 最强悍的告警收敛能力之一。动作升级则是解决“告警发出去了没人处理”的问题。在动作配置里点击操作里的步骤可以设置多步骤步骤 1-2 发送给第一梯队值班人员每 10 分钟重复一次步骤 3-5 发送给小组负责人超过 30 分钟还没恢复自动通知部门经理。配好之后一套告警能形成处理流程而不是发了就不管。这些功能在 Zabbix Web 界面里都是可视化配置关键是很多人装完根本没点进去看过。5.3 用 Grafana 做展现面一个插件让图表拉满Zabbix 自带的图形功能这几年进步不少但整体颜值和交互还是不如 Grafana。很多公司领导汇报、出周报都习惯用 Grafana 来展示监控数据。Grafana 接 Zabbix 很简单先部署一个 Grafana 容器然后在 Grafana 里安装 Zabbix 插件插件名是alexanderzobnin-zabbix-datasource官方插件市场一键安装即可。数据源配置时填 Zabbix 的 API 地址格式是http://监控服务器IP:8080/api_jsonrpc.php认证方式选 Basic auth 或 Token用户名密码用你 Zabbix 的账号。连上之后添加 Dashboard选择 Zabbix 数据源就能通过可视化查询界面把监控项拖到面板上。Zabbix 的指标体系在 Grafana 里会被结构化成主机组、主机、应用集、监控项层级熟悉之后配置面板很快。如果老板要求提供 PDF 监控报告Grafana 可以通过内置报告插件或异步渲染服务导出 PDF现在新版 Grafana 对报告导出支持得也越来越好。不过要提醒一点Grafana 里如果开了匿名访问整个监控数据相当于在内网裸奔一定要设置好权限最好用 OAuth 或账号密码登录再限制访问者只能看指定的 Dashboard。6. 常见问题与排查实录6.1 看日志第一排查手段监控平台本身出问题时最怕到处乱猜。Zabbix 的排查核心是日志。容器环境下日志统一走 docker 的标准输出和容器内文件两条路径。先看 compose 服务状态docker compose ps docker compose logs --tail100 zabbix-server如果容器起不来错误信息大概率会出现在这里。数据库初始化失败、密码不匹配、端口被占用都能在日志里找到直接线索。Zabbix Server 容器的详细日志在容器内/var/log/zabbix/zabbix_server.logAgent 的问题则要看被监控机器上的/var/log/zabbix/zabbix_agent2.log。这个日志文件非常重要Agent 连接不上、Hostname 不匹配、主动上报失败都会在这里留下记录。6.2 中文乱码和时区显示不对中文乱码属于“高发但好解决”的问题。现象是 Web 界面切到中文后图形标题、图例里的中文全部变成方块。根因是容器里没有中文字体系统找不到能渲染中文字形的字体文件。解决思路有两条一条是按第 3.2 节说的用 Dockerfile 安装fonts-wqy-zenhei重新构建 Web 镜像另一条是运行时把字体文件复制进容器然后重启容器。路径是到 Web 容器/usr/share/fonts下放一个中文字体ttf 或 otf 都行接着更新字体缓存再重启容器。时区显示不对多半是部署时没设置TZ和PHP_TZ。Zabbix Server 和 Web 容器的时间来源分别来自这两个环境变量有一点要记住数据库容器的时间也最好设置成 Asia/Shanghai否则有些写入数据库的时间戳会和前端展示差 8 小时排查起来相当迷惑。6.3 Agent 连接不上的典型症状和处理方向这里直接整理一份问题速查表都是我在实际部署中遇到过的情况症状可能原因处理方向主机心跳是绿色但最新数据为空主动模式下 Hostname 不一致模板没关联主动版本检查 agent 配置Hostname确认和 Web 界面一致报错Get value from agent failed: cannot connect to [IP]:10050Server 连不上 Agent 的 10050防火墙拦截Agent 未启动在被监控机器上执行 ss -lntp报错Received empty response from daemonAgent 版本过旧或配置了加密但 Server 没启用加密统一升级 Agent 到 7.x检查 PSK 配置是否匹配主动模式下unsupported item keyAgent 2 没启用对应插件或模板用了新键值在 agent2 配置里加载插件或换用兼容的模板邮件一直发不出去SMTP 端口不通Zabbix 容器无法访问外网在 Server 容器里用curl测试 SMTP 端口连通性还有一条很容易被忽略的经验Ubuntu 上安装 agent 后默认配置文件/etc/zabbix/zabbix_agent2.conf里的Server127.0.0.1如果不改成 Zabbix Server 的实际 IPWeb 界面填了 IP 也连不上因为 agent 根本不允许来自其他地址的被动检查。很多新手栽在这上面从头到尾检查了一遍防火墙、端口、模板最后发现是这一个配置项没改。6.4 镜像拉取慢和数据持久化备份镜像拉取慢的问题在第 3.1 节已经讲了通过配置 registry-mirrors 解决。但企业内网环境还有一种更常见的情况生产服务器不能直接访问外网。这时候建议在能访问外网的机器上先把镜像 pull 下来然后导成 tar 包传进内网后再用docker load导入。docker pull zabbix/zabbix-server-pgsql:7.0-ubuntu docker save zabbix/zabbix-server-pgsql:7.0-ubuntu -o zabbix-server.tar # 内网机器执行 docker load -i zabbix-server.tar数据备份这件事很多团队到最后都忘了。Zabbix 的配置数据、历史数据全在 PostgreSQL 里最稳妥的备份方式是用pg_dump定时导出数据库docker exec zabbix-postgres pg_dump -U zabbix zabbix | gzip zbx_backup_$(date %F).sql.gz恢复时用gunzip解压后psql导入。历史数据量很大时也可以只备份配置库但生产环境建议全量备份。数据卷pgdata本身也可以直接停止数据库容器后打包目录但这种方式在数据库运行中做容易造成数据不一致所以还是推荐pg_dump。备份频率看告警历史的重要程度一般公司每天备份一次就够了保留最近 30 天。6.5 升级版本前先把这件事做掉Zabbix 官方在大版本升级上有严格要求尤其是跨 LTS 大版本比如从 6.0 升 7.0需要先确认数据库版本兼容、配置备份完整。容器化部署让升级过程变简单了但不要因此掉以轻心。我的建议升级流程是先docker compose down手动备份数据库确认备份文件存在且能解析然后修改 compose 文件里的镜像 tag再docker compose up -d。如果新版本启动后有任何异常马上用备份恢复旧版本。千万别在生产环境用docker compose pull docker compose up -d这种“一键升级”方式你根本不知道 new tag 拉下来的是什么版本万一拉到一个大版本变更数据迁移逻辑会把你折腾到怀疑人生。凡是涉及数据库结构的应用升级前备份永远是第一位。最后再分享一条个人经验Zabbix 这类监控平台最忌讳一次性把模板、触发器、告警全铺开结果没人维护、告警一堆没人看最后运维团队对监控彻底失去信任。我建议新部署完先接三到五台核心机器配置 CPU、内存、磁盘、网络这四类基础告警跑两周把误报率调低再逐步扩大覆盖面。告警不是越多越好而是每条告警都必须对应一个明确的处理动作。把这条路走顺了Docker 部署 Zabbix 这套东西才算真正在你公司落地而不是又多了一套没人看的系统。