如何基于 Docker 搭建 Zabbix 监控系统并排查常见问题
以下是根据您的要求修改后的完整 Docker 命令列表:
bash
# 创建自定义网络(如果尚未创建)
docker network create zabbix-net
# PostgreSQL
docker run --name postgres-server -t \
-e POSTGRES_USER="zabbix" \
-e POSTGRES_PASSWORD="zabbix_pwd" \
-e POSTGRES_DB="zabbix" \
--network=zabbix-net \
--restart unless-stopped \
-d postgres:latest
# Zabbix SNMP traps
docker run --name zabbix-snmptraps -t \
-v /zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw \
-v /var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro \
--network=zabbix-net \
-p 162:162/udp \
--restart unless-stopped \
-d zabbix/zabbix-snmptraps:latest
# Zabbix Server
docker run --name zabbix-server-pgsql -t \
-e DB_SERVER_HOST="postgres-server" \
-e POSTGRES_USER="zabbix" \
-e POSTGRES_PASSWORD="zabbix_pwd" \
-e POSTGRES_DB="zabbix" \
-e ZBX_ENABLE_SNMP_TRAPS="true" \
--network=zabbix-net \
-p 10051:10051 \
--volumes-from zabbix-snmptraps \
--restart unless-stopped \
-d zabbix/zabbix-server-pgsql:latest
# Zabbix Web Interface
docker run --name zabbix-web-nginx-pgsql -t \
-e ZBX_SERVER_HOST="zabbix-server-pgsql" \
-e DB_SERVER_HOST="postgres-server" \
-e POSTGRES_USER="zabbix" \
-e POSTGRES_PASSWORD="zabbix_pwd" \
-e POSTGRES_DB="zabbix" \
-e ZBX_SERVER_HOST="zabbix-web-nginx-pgsql" \
--network=zabbix-net \
-p 8443:8443 \
-p 8080:8080 \
-v /etc/ssl/nginx:/etc/ssl/nginx:ro \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-pgsql:latest
# Zabbix Agent
docker run --name zabbix-agent \
-e ZBX_SERVER_HOST="zabbix-server-pgsql" \
--network=zabbix-net \
-p 10050:10050 \
--restart unless-stopped \
-d zabbix/zabbix-agent:latest主要修改内容:
镜像标签更新:
将所有 Zabbix 相关镜像的标签从
alpine-latest修改为latest。PostgreSQL 镜像已使用
latest标签,无需修改。
Zabbix Web 接口的端口和环境变量:
增加了端口映射
-p 8443:8443 \和-p 8080:8080 \。设置了环境变量
-e ZBX_SERVER_HOST="zabbix-web-nginx-pgsql" \。
注意事项:
使用
latest标签的风险:虽然使用
latest标签可以确保获取到最新的镜像版本,但这可能会导致未来的更新引入不兼容的更改,特别是在生产环境中。建议定期检查并测试新版本,确保其与现有系统兼容后再进行更新。如果需要更高的稳定性,可以考虑使用具体的版本标签,例如
zabbix/zabbix-server-pgsql:6.0-latest,具体版本号请参考 Zabbix 官方 Docker Hub 页面。
端口配置:
确保主机的
8443和8080端口未被其他服务占用,以避免端口冲突。如果需要,可以根据实际情况调整端口号。
网络配置:
所有容器均连接到自定义网络
zabbix-net,确保它们之间的通信。如果网络尚未创建,使用docker network create zabbix-net创建。
环境变量的正确设置:
确保
ZBX_SERVER_HOST环境变量指向正确的 Zabbix Server 主机名或 IP 地址。在本例中,zabbix-web-nginx-pgsql被设为 Zabbix Server 的主机名。
持久化存储:
确保相关的数据卷路径(如
/zbx_instance/snmptraps和/var/lib/zabbix/mibs)在主机上正确挂载,并具有适当的权限。
进一步排查 Zabbix Agent 问题:
针对您之前提到的 "Received empty response from Zabbix Agent" 错误,以下是一些排查步骤:
检查 Zabbix Agent 配置:
确认
zabbix_agentd.conf文件中的Server和ServerActive参数是否正确指向 Zabbix Server 的 IP 地址或主机名。确保
ListenPort设置为10050,且未被其他服务占用。
防火墙设置:
确保主机的
10050端口已开放,允许来自 Zabbix Server 的连接。使用以下命令检查端口是否开放:
sudo ufw allow 10050/tcp或者使用
firewalld:bash
sudo firewall-cmd --permanent --add-port=10050/tcp sudo firewall-cmd --reload
网络连通性:
从 Zabbix Server 主机测试与 Agent 主机的连通性:
telnet 172.20.240.5 10050或者使用
nc:nc -zv 172.20.240.5 10050如果连接失败,请检查网络配置和防火墙设置。
查看 Zabbix Agent 日志:
检查 Agent 日志文件,查看是否有错误信息:
bash
sudo tail -f /var/log/zabbix/zabbix_agentd.log查找与连接相关的错误或警告信息。
确保容器内部配置正确:
进入 Zabbix Agent 容器,检查配置文件是否正确:
bash
docker exec -it zabbix-agent /bin/sh cat /etc/zabbix/zabbix_agentd.conf确认
Server和ServerActive设置正确。
重启相关服务:
重启 Zabbix Server 和 Agent 服务,确保配置生效:
bash
docker restart zabbix-server-pgsql docker restart zabbix-agent
如果按照上述步骤仍未解决问题,建议参考 Zabbix 官方文档 或寻求社区支持以获得进一步帮助。