🐳 Zabbix Docker 部署教程推荐
- 操作系统环境:Ubuntu Server 24.04
- zabbix:最新版本7.4
- 使用
docker-compose
快速部署 Zabbix Server、Web、Agent、Java Gateway、MySQL 等组件 - 包含字体中文化设置、端口映射、持久化存储配置
- 适合中小型企业或测试环境快速部署
🆕 Zabbix 最新版本概览
版本号 | 类型 | 发布时间 | 特点 |
---|---|---|---|
Zabbix 7.4 | 标准版 | 2025 年中发布 | 最新功能,适合尝鲜 |
Zabbix 7.0 | LTS | 2024 年 6 月 | 长期支持,稳定性高 |
以下是基于 Zabbix 官方 GitHub 仓库的最新版本 Zabbix 7.4 的完整 docker-compose.yml
文件,适用于 Ubuntu Server 24.04 环境,使用 MySQL 数据库和 Alpine 镜像构建,轻量高效
🧾 Zabbix 7.4 完整 docker-compose.yml
#version: '3.5'
services:
mysql:
image: mysql:8.0
container_name: zabbix-mysql
restart: always
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: xxxxxxxx
MYSQL_ROOT_PASSWORD: xxxxxxxx
volumes:
- ./data/mysql:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
zabbix-server:
image: zabbix/zabbix-server-mysql:alpine-7.4-latest
container_name: zabbix-server
restart: always
depends_on:
- mysql
environment:
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: xxxxxxxx
volumes:
- ./config/server.conf:/etc/zabbix/zabbix_server.conf
- ./data/zabbix-server:/var/lib/zabbix
ports:
- "10051:10051"
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:alpine-7.4-latest
container_name: zabbix-web
restart: always
depends_on:
- zabbix-server
- mysql
environment:
DB_SERVER_HOST: mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: xxxxxxxx
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
volumes:
- ./zabbix-web:/usr/share/zabbix
ports:
- "80:8080"
zabbix-agent:
image: zabbix/zabbix-agent:alpine-7.4-latest
container_name: zabbix-agent
restart: always
depends_on:
- zabbix-server
environment:
ZBX_SERVER_HOST: zabbix-server
ZBX_HOSTNAME: docker-agent
volumes:
- ./config/agent.conf:/etc/zabbix/zabbix_agentd.conf
ports:
- "10050:10050"
📦 Zabbix 配置挂载点说明
组件 | 容器路径 | 推荐挂载本地路径 | 说明 |
---|---|---|---|
Zabbix Server | /etc/zabbix/zabbix_server.conf |
./config/server.conf |
主配置文件 |
Zabbix Agent | /etc/zabbix/zabbix_agentd.conf |
./config/agent.conf |
Agent 配置 |
Zabbix Web | /usr/share/zabbix |
./zabbix-web |
Web 前端文件(可加中文字体) |
Zabbix Server | /var/lib/zabbix |
./data/zabbix-server |
数据存储 |
MySQL | /var/lib/mysql |
./data/mysql |
数据库持久化 |
✅ 使用说明
创建目录结构:
mkdir -p config data/mysql data/zabbix-server zabbix-web
初始化配置文件(可从容器中复制默认配置):
docker cp zabbix-server:/etc/zabbix/zabbix_server.conf ./config/server.conf docker cp zabbix-agent:/etc/zabbix/zabbix_agentd.conf ./config/agent.conf
启动服务:
docker compose up -d
访问 Web 前端:
http://<你的服务器IP>
默认登录:
- 用户名:
Admin
- 密码:
zabbix
- 用户名:
🧰实际部署过程中遇到的问题
⚡问题一:
只创建容器不运行服务,如果你只想创建容器但不启动服务,可以这样做:
创建容器但不启动:
docker compose create
然后复制配置文件:
docker cp zabbix-server:/etc/zabbix/zabbix_server.conf ./config/server.conf docker cp zabbix-agent:/etc/zabbix/zabbix_agentd.conf ./config/agent.conf
可选:启动服务
docker compose start
sh\@zabbix:~$ sudo docker cp zabbix-server:/etc/zabbix/zabbix_server.conf ./config/server.conf
Error response from daemon: mount /home/sh/config/server.conf:/var/lib/docker/overlay2/3e87e7491a66c70c541d3500b3783ab57b31618b61c61224c311a24db953a398/merged/etc/zabbix/zabbix_server.conf, flags: 0x5000: not a directory
这个错误提示说明你尝试将容器内的文件复制到宿主机上的一个路径 ./config/server.conf
,但该路径被 Docker 挂载为了一个目录(volume),导致无法直接覆盖为文件。
🧩 问题分析
你在 docker-compose.yml
中挂载了:
- ./config/server.conf:/etc/zabbix/zabbix_server.conf
这意味着容器启动时 /etc/zabbix/zabbix_server.conf
被绑定到了宿主机的 ./config/server.conf
文件。如果这个文件不存在或路径有误,Docker 会尝试创建一个目录,导致你无法再用 docker cp
复制文件到这个位置。
✅解决方法:先取消挂载再复制
如果你只是为了获取原始配置,可以临时注释掉 docker-compose.yml
中的挂载行:
# - ./config/server.conf:/etc/zabbix/zabbix_server.conf
然后重新创建容器并复制配置,你可以绕过挂载冲突,直接复制到一个临时目录,比如 /tmp
,然后再移动到目标位置,再恢复挂载。
✅步骤如下:
复制到临时目录(绕过挂载冲突):
sudo docker cp zabbix-server:/etc/zabbix/zabbix_server.conf /tmp/server.conf
确认文件已复制成功:
ls -l /tmp/server.conf
移动到你的挂载目录(确保
./config
是目录):mv /tmp/server.conf ./config/server.conf
⚡问题二:
WARN[0000] /home/sh/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
这是一个非常常见的提示,不是错误,只是一个 警告信息。它来自新版 Docker Compose 工具,告诉你:
version:
字段已经被废弃(obsolete),可以安全地移除。
🧾 为什么会出现这个警告?
在旧版本的 Docker Compose(比如 v1.x)中,version: '3.5'
是必须的,用来指定 Compose 文件的语法版本。
但在新版 Docker Compose(v2.x 及以上)中,它会自动识别语法,不再需要 version
字段,因此它提示你可以删掉它。
✅ 解决方法
你只需要把 docker-compose.yml
文件开头的这一行删掉即可:
# version: '3.5' ← 删除这一行
然后你的文件就变成这样开头:
services:
mysql:
image: mysql:8.0
...
这不会影响功能,也不会影响容器运行。
🔍 检查你的 Compose 版本
你可以运行以下命令确认你使用的是新版 Docker Compose:
docker compose version
如果输出类似:
Docker Compose version v2.24.1
说明你已经在使用新版,可以放心移除 version
字段。
⚡问题三:
sh@zabbix:~$ sudo docker cp zabbix-agent:/etc/zabbix/zabbix_agentd.conf ./config/agent.conf Error response from daemon: mount /home/sh/config/agent.conf:/var/lib/docker/overlay2/db6c09bd626c67134523c793eec0a832b613c4d598e5ce6e715742d7fda3daec/merged/etc/zabbix/zabbix_agentd.conf, flags: 0x5000: not a directory
遇到的错误和之前的 server.conf
问题是一样的:由于你在 docker-compose.yml
中挂载了 ./config/agent.conf
到容器的 /etc/zabbix/zabbix_agentd.conf
,但宿主机上的 agent.conf
文件不存在或路径不正确,Docker 把它错误地当成了一个目录挂载,导致你无法复制容器内的原始配置文件。
✅ 彻底解决方法(和 server.conf 一样)
🔧 步骤一:临时取消挂载
编辑你的 docker-compose.yml
文件,把 zabbix-agent
的挂载注释掉:
# volumes:
# - ./config/agent.conf:/etc/zabbix/zabbix_agentd.conf
确保这部分不再挂载。
🔧 步骤二:重新创建容器(不挂载)
docker compose down
docker compose up -d
此时容器会使用默认配置文件,不再被挂载覆盖。
🔧 步骤三:复制配置文件
sudo docker cp zabbix-agent:/etc/zabbix/zabbix_agentd.conf /tmp/agent.conf
✅ 这一步现在应该不会报错。
🔧 步骤四:恢复挂载配置
将复制的文件移动到挂载目录:
mv /tmp/agent.conf ./config/agent.conf
然后在 docker-compose.yml
中恢复挂载:
volumes:
- ./config/agent.conf:/etc/zabbix/zabbix_agentd.conf
🔧 步骤五:重启容器使挂载生效
docker compose down
docker compose up -d
✅ 现在你就拥有了可编辑的 agent.conf
文件,并且容器可以正确挂载它。
⚡问题四:
zabbix-server | 1:20250808:074238.645 cannot use database "zabbix": its "users" table is empty (is this the Zabbix proxy database?) zabbix-server exited with code 1 zabbix-server | ** Preparing Zabbix server zabbix-server | ** Preparing database zabbix-server | ** Using MYSQL_USER variable from ENV zabbix-server | ** Using MYSQL_PASSWORD variable from ENV zabbix-server | ******************** zabbix-server | * DB_SERVER_HOST: mysql zabbix-server | * DB_SERVER_PORT: 3306 zabbix-server | * DB_SERVER_DBNAME: zabbix zabbix-server | ******************** zabbix-server | ** Database 'zabbix' already exists. Please be careful with database COLLATE! zabbix-server | ** Table 'zabbix.dbversion' already exists. zabbix-server | Skipping /var/lib/zabbix/ssl/ssl_ca/, can't write zabbix-server | Starting Zabbix Server. Zabbix 7.4.1 (revision 439ef6b). zabbix-server | Press Ctrl+C to exit. zabbix-server | zabbix-server | 1:20250808:074252.025 Starting Zabbix Server. Zabbix 7.4.1 (revision 439ef6b). zabbix-server | 1:20250808:074252.025 ****** Enabled features ****** zabbix-server | 1:20250808:074252.025 SNMP monitoring: YES zabbix-server | 1:20250808:074252.025 IPMI monitoring: YES zabbix-server | 1:20250808:074252.025 Web monitoring: YES zabbix-server | 1:20250808:074252.025 VMware monitoring: YES zabbix-server | 1:20250808:074252.025 SMTP authentication: YES zabbix-server | 1:20250808:074252.025 ODBC: YES zabbix-server | 1:20250808:074252.025 SSH support: YES zabbix-server | 1:20250808:074252.025 IPv6 support: YES zabbix-server | 1:20250808:074252.025 TLS support: YES zabbix-server | 1:20250808:074252.025 ****************************** zabbix-server | 1:20250808:074252.025 using configuration file: /etc/zabbix/zabbix_server.conf zabbix-server | 1:20250808:074252.028 cannot use database "zabbix": its "users" table is empty (is this the Zabbix proxy database?) zabbix-server exited with code 1
遇到的错误:
cannot use database "zabbix": its "users" table is empty (is this the Zabbix proxy database?)
说明 Zabbix Server 能连接到数据库,但数据库没有被正确初始化——也就是说,Zabbix 的核心表结构存在,但没有数据,比如 users
表为空。这通常发生在:
- 没有执行初始化 SQL 脚本
- 数据库是空壳,没有导入 Zabbix schema
使用了错误的数据库镜像或挂载方式
✅ 解决方案:从 Zabbix 官方源码包提取 SQL 文件
你可以从 Zabbix 官方源码中获取完整的数据库初始化脚本,包括:
schema.sql
:创建所有表结构images.sql
:插入图标和界面资源data.sql
:插入初始数据(如默认用户)我们可以将 Zabbix 源码中的三个 SQL 文件:
schema.sql
(表结构)images.sql
(图标资源)data.sql
(初始数据) 合并为一个完整的init.sql
文件,用于自动初始化数据库。
🧾 合并 SQL 文件为 init.sql
✅ 步骤一:下载并解压源码包
wget https://cdn.zabbix.com/zabbix/sources/stable/7.4/zabbix-7.4.1.tar.gz
tar -xvzf zabbix-7.4.1.tar.gz
cd zabbix-7.4.1/database/mysql
✅ 步骤二:合并 SQL 文件
cat schema.sql images.sql data.sql > ../../../init.sql
这会在源码包的上级目录生成一个完整的 init.sql
文件。
你也可以直接指定目标路径:
cat schema.sql images.sql data.sql > ~/zabbix-init/init.sql
📦 使用方式:自动初始化数据库
在你的 docker-compose.yml
中挂载这个文件:
volumes:
- ./data/mysql:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
然后清理旧容器并重新部署:
docker compose down -v
rm -rf ./data/mysql
docker compose up -d
✅ MySQL 容器会自动执行 init.sql
,完成 Zabbix 所需的数据库初始化。
⚡问题五:
zabbix-web | 2025/08/08 08:24:20 [error] 108#108: *3 directory index of "/usr/share/zabbix/zabbix/" is forbidden, client: 10.1.xx.29, server: zabbix, request: "GET /zabbix/ HTTP/1.1", host: "10.1.xx.19"
遇到的 403 Forbidden
错误是因为你访问了错误的路径,或者容器中的 Web 根目录被错误挂载或破坏
❌ 问题分析
你访问的是:
http://10.1.xx.19/zabbix/
但 Zabbix Docker 镜像的默认 Web 路径是:
http://<IP>/
并不需要 /zabbix/
前缀。
同时,日志显示:
directory index of "/usr/share/zabbix/zabbix/" is forbidden
说明 Nginx 正在尝试访问 /usr/share/zabbix/zabbix/
,这通常是因为你挂载了一个空或错误的目录到 /usr/share/zabbix
,导致它内部又出现了一个 zabbix/
子目录。
✅ 解决方案
sudo docker cp zabbix-web:/usr/share/zabbix ./zabbix-web/
在执行时,发现结果是 ./zabbix-web/zabbix/
,而不是直接把 /usr/share/zabbix
的内容放进 ./zabbix-web
。这是 Docker 的标准行为。
🧩 为什么会多出一个 zabbix
子目录?
这是因为你指定的目标路径是一个目录(./zabbix-web/
),而源路径是一个目录(/usr/share/zabbix
)。Docker 会自动在目标目录下创建一个同名子目录来存放内容。
✅ 所以你得到的是:
./zabbix-web/zabbix/ ← 对应容器中的 /usr/share/zabbix
✅ 正确的复制方式(避免嵌套)
如果你希望直接把 /usr/share/zabbix
的内容复制到 ./zabbix-web
目录中,而不是嵌套一个子目录,可以这样做:
sudo docker cp zabbix-web:/usr/share/zabbix/. ./zabbix-web/
注意末尾的 /.
,它表示复制目录中的所有内容,而不是整个目录本身。
🔧 清理并重新复制建议
清理旧的嵌套目录:
sudo rm -rf ./zabbix-web/zabbix
重新复制内容(不嵌套):
sudo docker cp zabbix-web:/usr/share/zabbix/. ./zabbix-web/
⚡问题六:
信息 主机 问题·严重性 持续时间 更新 动作 标记
Zabbix server Linux: Zabbix agent is not available (for 3m) 19s 更新 class: os component: system scope: availability
Zabbix Web 界面截图来看,虽然主机 Zabbix server
已启用并显示 Agent 可用(ZBX),但你仍然收到一个错误提示:
Received empty response from Zabbix Agent at [10.1.xx.19]. Assuming that agent dropped connection because of access permissions.
这说明 Zabbix Server 尝试连接 Agent 时,Agent 拒绝了连接请求,很可能是因为访问权限配置不正确。
🔍 关键点分析
- Agent IP:界面显示 Agent 接口为
172.18.0.4:10050
(容器内 IP) - Server 尝试连接 IP:错误提示中是
10.1.xx.19
(宿主机 IP)
这意味着 Zabbix Server 正在尝试从宿主机 IP 访问 Agent,但 Agent 只允许来自 172.18.0.3
(Server 容器 IP)的连接。
✅ 解决方案:修改 Agent 配置文件
请在 agent.conf
中将 Server
参数改为允许宿主机 IP:
Server=172.18.0.3,10.1.xx.19
或者更宽松一点:
Server=0.0.0.0/0
⚠️ 注意:使用
0.0.0.0/0
会允许所有来源连接,适合测试环境,不建议用于生产。
然后重启 Agent 容器:
docker restart zabbix-agent
🧪 验证方法
在 Zabbix Web 中点击主机 → “测试” → “获取数据”,确认是否能成功连接 Agent。
⚡问题七:
数据库中表的字符集或排序规则不受支持:acknowledges, actions, alerts, auditlog, autoreg_host, conditions, config_autoreg_tls, connector, connector_tag, corr_condition_tag, corr_condition_tagpair, corr_condition_tagvalue, correlation, dashboard, dashboard_page, dchecks, drules, dservices, event_tag, events, expressions, functions, globalmacro, globalvars, graph_theme, graphs, graphs_items, group_discovery, group_prototype, ha_node, hgset, history_log, history_str, history_text, host_discovery, host_inventory, host_proxy, host_tag, hostmacro, hostmacro_config, hosts, housekeeper, hstgrp, httpstep, httpstep_field, httptest, httptest_field, httptest_tag, icon_map, icon_mapping, ids, images, interface, interface_snmp, item_condition, item_discovery, item_parameter, item_preproc, item_rtdata, item_rtname, item_tag, items, lld_macro_export, lld_macro_path, lld_override, lld_override_condition, lld_override_operation, lld_override_ophistory, lld_override_opperiod, lld_override_optag, lld_override_optrends, maintenance_tag, maintenances, media, media_type, media_type_message, media_type_oauth, media_type_param, mfa, mfa_totp_secret, module, opconditions, operations, opmessage, optag, problem, problem_tag, profiles, proxy, proxy_autoreg_host, proxy_dhistory, proxy_group, proxy_history, regexps, report, report_param, role, role_rule, scim_group, script_param, scripts, service_problem_tag, service_tag, services, sessions, settings, sla, sla_excluded_downtime, sla_service_tag, sysmap_element_url, sysmap_link_threshold, sysmap_shape, sysmap_url, sysmaps, sysmaps_element_tag, sysmaps_elements, sysmaps_link_triggers, sysmaps_links, tag_filter, task_data, task_remote_command, task_remote_command_result, task_result, token, trigger_tag, triggers, ugset, userdirectory, userdirectory_idpgroup, userdirectory_ldap, userdirectory_media, userdirectory_saml, users, usrgrp, valuemap, valuemap_mapping, widget, widget_field。
遇到的错误提示:
数据库中表的字符集或排序规则不受支持
说明 Zabbix 检测到你的数据库中某些表使用了不兼容的字符集或排序规则。这是 Zabbix 6.0 及以上版本常见的问题,尤其是在使用 MySQL 8.x 时。
❗ 问题原因
Zabbix 要求数据库使用:
- 字符集:
utf8mb4
- 排序规则:
utf8mb4_bin
但你的数据库或部分表可能使用了:
utf8mb3
(旧的 3 字节 UTF-8)utf8_general_ci
、utf8mb4_0900_ai_ci
等不兼容的排序规则
🔧 步骤一:检查当前字符集和排序规则
SELECT @@character_set_database, @@collation_database;
如果不是 utf8mb4
和 utf8mb4_bin
,需要修复。
1️⃣ 修改数据库默认字符集和排序规则
sql
ALTER DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
2️⃣ 修复所有表的字符集和排序规则
你可以使用以下语句生成完整修复脚本:
sql
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;'
)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'zabbix'
AND TABLE_COLLATION != 'utf8mb4_bin';
3️⃣表级修复未覆盖所有字段
Zabbix 不仅要求表的排序规则为 utf8mb4_bin
,还要求**所有字段(列)**的排序规则也一致。如果你只执行了 ALTER TABLE ... CONVERT TO CHARACTER SET ...
,某些字段可能仍保留原来的 utf8mb4_0900_ai_ci
。
✅ 解决方法:执行字段级修复脚本。
字段级字符集修复脚本生成 SQL
请在 MySQL 中运行以下语句,它将生成所有字段的修复语句:
sql
SELECT CONCAT(
'ALTER TABLE `', TABLE_NAME, '` MODIFY COLUMN `', COLUMN_NAME,
'` ', COLUMN_TYPE, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;'
)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'zabbix'
AND COLLATION_NAME = 'utf8mb4_0900_ai_ci';
拷贝上面生成的529条sql修复语句,下面执行
在执行任何 ALTER TABLE
或其他 DDL 语句之前,先选择数据库:
sql
USE zabbix;
然后再执行你的修复语句:
sql
ALTER TABLE `acknowledges` MODIFY COLUMN `message` varchar(2048) CHARACTER SE
.....
.....
.....
.....
.....
最后重启 Zabbix Server即可:
docker restart zabbix-server
⚡问题八:docker容器如何安装python环境(zabbix-server每次重启都要重新配置)
先把宿主机上飞书告警python文件拷贝到zabbix-server docker容器中
sudo vim feishu.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import requests
import json
import sys
import os
import datetime
# 复制的webhook地址粘贴进url内
url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxxxxx"
def send_message(message):
payload_message = {
"msg_type": "text",
"content": {
"text": message
}
}
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=json.dumps(payload_message))
return response
if __name__ == '__main__':
text = sys.argv[1]
send_message(text)
sudo chmod +x feishu.py
sudo docker cp feishu.py zabbix-server:/usr/lib/zabbix/alertscripts
🧱在运行中的容器中安装python环境
🔹如果容器基于Alpine:
docker exec -u 0 -it zabbix-server sh
apk add --no-cache python3 py3-pip
⚠️注意:某些官方容器(如Zabbix)可能没有包管理器或网络访问权限,安装可能失败。
🔹在容器中安装requests
在Alpine系统中,直接使用:
apk add py3-requests
这会通过系统包管理器安装 requests
,不会触发 PEP 668 限制。
🔹在容器中测试飞书告警
/usr/lib/zabbix/alertscripts/feishu.py 测试告警
⚡问题九:用户-报警媒介-启用飞书告警,zabbix-server容器自动重启(目前无解,不确定是否最新版本的bug)
alloc(): unsorted double linked list corrupted zabbix_server [1]: Error waiting for process with PID 67: [10] No child processes
目前只能使用自带的邮件告警。
最终效果图:
docker部署虽然方便后期迁移,但是整体部署难度远高于直接在宿主机上安装部署,生产环境可以结合实际需求评估部署模式。