以下是根据您的要求修改后的完整 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

主要修改内容:

  1. 镜像标签更新

    • 将所有 Zabbix 相关镜像的标签从 alpine-latest 修改为 latest

    • PostgreSQL 镜像已使用 latest 标签,无需修改。

  2. Zabbix Web 接口的端口和环境变量

    • 增加了端口映射 -p 8443:8443 \-p 8080:8080 \

    • 设置了环境变量 -e ZBX_SERVER_HOST="zabbix-web-nginx-pgsql" \

注意事项:

  1. 使用 latest 标签的风险

    • 虽然使用 latest 标签可以确保获取到最新的镜像版本,但这可能会导致未来的更新引入不兼容的更改,特别是在生产环境中。建议定期检查并测试新版本,确保其与现有系统兼容后再进行更新。

    • 如果需要更高的稳定性,可以考虑使用具体的版本标签,例如 zabbix/zabbix-server-pgsql:6.0-latest,具体版本号请参考 Zabbix 官方 Docker Hub 页面。

  2. 端口配置

    • 确保主机的 84438080 端口未被其他服务占用,以避免端口冲突。如果需要,可以根据实际情况调整端口号。

  3. 网络配置

    • 所有容器均连接到自定义网络 zabbix-net,确保它们之间的通信。如果网络尚未创建,使用 docker network create zabbix-net 创建。

  4. 环境变量的正确设置

    • 确保 ZBX_SERVER_HOST 环境变量指向正确的 Zabbix Server 主机名或 IP 地址。在本例中,zabbix-web-nginx-pgsql 被设为 Zabbix Server 的主机名。

  5. 持久化存储

    • 确保相关的数据卷路径(如 /zbx_instance/snmptraps/var/lib/zabbix/mibs)在主机上正确挂载,并具有适当的权限。

进一步排查 Zabbix Agent 问题:

针对您之前提到的 "Received empty response from Zabbix Agent" 错误,以下是一些排查步骤:

  1. 检查 Zabbix Agent 配置

    • 确认 zabbix_agentd.conf 文件中的 ServerServerActive 参数是否正确指向 Zabbix Server 的 IP 地址或主机名。

    • 确保 ListenPort 设置为 10050,且未被其他服务占用。

  2. 防火墙设置

    • 确保主机的 10050 端口已开放,允许来自 Zabbix Server 的连接。

    • 使用以下命令检查端口是否开放:

      sudo ufw allow 10050/tcp

      或者使用 firewalld

      bash

      sudo firewall-cmd --permanent --add-port=10050/tcp
      sudo firewall-cmd --reload
  3. 网络连通性

    • 从 Zabbix Server 主机测试与 Agent 主机的连通性:

      telnet 172.20.240.5 10050

      或者使用 nc

      nc -zv 172.20.240.5 10050

      如果连接失败,请检查网络配置和防火墙设置。

  4. 查看 Zabbix Agent 日志

    • 检查 Agent 日志文件,查看是否有错误信息:

      bash

      sudo tail -f /var/log/zabbix/zabbix_agentd.log

      查找与连接相关的错误或警告信息。

  5. 确保容器内部配置正确

    • 进入 Zabbix Agent 容器,检查配置文件是否正确:

      bash

      docker exec -it zabbix-agent /bin/sh
      cat /etc/zabbix/zabbix_agentd.conf

      确认 ServerServerActive 设置正确。

  6. 重启相关服务

    • 重启 Zabbix Server 和 Agent 服务,确保配置生效:

      bash

      docker restart zabbix-server-pgsql
      docker restart zabbix-agent

如果按照上述步骤仍未解决问题,建议参考 Zabbix 官方文档 或寻求社区支持以获得进一步帮助。