在传统部署方式中,搭建Zabbix监控平台需要手动安装配置MySQL、Java Gateway、Server和Web等多个组件,光是处理依赖关系和网络配置就让人头疼。我去年在客户现场就遇到过因为环境差异导致Zabbix Server连不上MySQL的问题,花了整整两天排查。而使用Docker Compose,这些问题都能迎刃而解。
Docker Compose的三大优势特别适合Zabbix部署:
docker-compose down && docker-compose up -d就能完成全套重建注意:生产环境建议使用Docker Swarm或Kubernetes,但Compose仍然是开发测试环境的最佳选择
首先确保你的系统已经安装Docker Engine和Docker Compose插件。在Ubuntu 22.04上可以这样安装:
bash复制# 安装Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 安装Compose插件
sudo apt-get install docker-compose-plugin
# 验证安装
docker compose version
如果看到版本号输出(比如Docker Compose version v2.17.2),说明环境准备就绪。我在CentOS和Ubuntu多个版本测试过这个流程,唯一要注意的是内核版本不能太旧。
创建docker-compose.yml文件,这是整个部署的核心。下面是我优化过的配置模板:
yaml复制version: '3.7'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:6.0-latest
ports:
- "10051:10051"
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix123
depends_on:
- zabbix-mysql
- zabbix-java-gateway
networks:
- zabbix-net
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:6.0-latest
ports:
- "8080:8080"
environment:
ZBX_SERVER_HOST: zabbix-server
DB_SERVER_HOST: zabbix-mysql
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix123
depends_on:
- zabbix-server
networks:
- zabbix-net
zabbix-mysql:
image: mysql:8.0
command: --character-set-server=utf8 --collation-server=utf8_bin
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix123
MYSQL_ROOT_PASSWORD: root123
volumes:
- mysql-data:/var/lib/mysql
networks:
- zabbix-net
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:6.0-latest
networks:
- zabbix-net
networks:
zabbix-net:
driver: bridge
volumes:
mysql-data:
这个配置有几个关键点:
zabbix-net实现容器间通信mysql-data的卷执行部署命令:
bash复制docker compose up -d
第一次运行会下载所有镜像,耐心等待完成后,用以下命令检查状态:
bash复制docker compose ps
正常情况应该看到4个容器的状态都是running。访问http://服务器IP:8080就能看到Zabbix登录页面,默认账号Admin/zabbix。
默认配置适合测试环境,生产环境需要调整这些参数:
yaml复制zabbix-server:
environment:
# 调整Java Gateway连接数
ZBX_JAVAGATEWAY_ENABLE: "true"
ZBX_JAVAGATEWAY: "zabbix-java-gateway"
ZBX_JAVAGATEWAYPORT: "10052"
ZBX_STARTPOLLERS: "20"
# 调整历史数据缓存
ZBX_HISTORYCACHESIZE: "256M"
ZBX_TRENDCACHESIZE: "128M"
# 启用SNMP traps
ZBX_STARTTRAPPERS: "5"
我在一个监控500+节点的环境中,这些参数将CPU使用率降低了40%。具体数值需要根据监控对象数量调整,建议参考Zabbix官方容量规划指南。
原始配置只持久化了MySQL数据,实际还需要持久化这些目录:
yaml复制zabbix-server:
volumes:
- zabbix-export:/var/lib/zabbix/export
- zabbix-snmptraps:/var/lib/zabbix/snmptraps
- zabbix-ssh_keys:/var/lib/zabbix/ssh_keys
zabbix-web:
volumes:
- zabbix-php:/usr/share/zabbix/conf
然后在volumes部分添加对应的声明。这样即使容器重建,告警配置和历史数据也不会丢失。
生产环境必须考虑安全性:
yaml复制networks:
zabbix-net:
driver: bridge
internal: true
yaml复制zabbix-web:
ports:
- "443:8443"
volumes:
- ./ssl.crt:/etc/ssl/nginx/ssl.crt:ro
- ./ssl.key:/etc/ssl/nginx/ssl.key:ro
如果docker compose ps显示异常状态,按这个流程排查:
bash复制docker compose logs zabbix-server
bash复制netstat -tulnp | grep -E '8080|10051'
bash复制docker compose exec zabbix-server ping zabbix-mysql
我遇到最多的问题是MySQL初始化未完成时Zabbix Server就尝试连接,解决方法是在Compose中添加健康检查:
yaml复制zabbix-mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 10
当监控数据缺失时,检查这些方面:
bash复制docker compose exec zabbix-server zabbix_get -s 127.0.0.1 -k agent.ping
sql复制SELECT * FROM items WHERE type=7;
bash复制telnet zabbix-java-gateway 10052
使用这些Docker命令识别性能问题:
bash复制# 查看容器资源使用
docker stats
# 分析Java进程
docker compose exec zabbix-server top -H -p $(pgrep java)
# 检查MySQL慢查询
docker compose exec zabbix-mysql mysqldumpslow -s t /var/log/mysql/mysql-slow.log
将Compose文件纳入Git管理时要注意:
yaml复制environment:
MYSQL_PASSWORD: ${DB_PASSWORD}
.env文件并加入.gitignore:bash复制echo "DB_PASSWORD=complex@pass123" >> .env
bash复制docker compose -f docker-compose.yml -f docker-compose.prod.yml up
在Jenkins或GitLab CI中集成部署:
yaml复制# .gitlab-ci.yml示例
deploy_zabbix:
stage: deploy
script:
- docker compose down
- docker compose pull
- docker compose up -d
only:
- master
用Zabbix监控Docker引擎:
bash复制docker run --name zabbix-agent2 \
-e ZBX_HOSTNAME="docker-host" \
-v /var/run/docker.sock:/var/run/docker.sock \
--net=host \
-d zabbix/zabbix-agent2:latest
这套方案在我负责的金融项目中稳定运行了两年,每天处理超过100万条监控数据。关键是要根据业务特点调整数据保留策略和告警阈值,比如交易系统需要更短的采集间隔,而报表系统可以适当降低频率。