1. 为什么选择Docker部署Zabbix
监控系统是运维工程师的第三只眼睛。传统部署Zabbix需要经历源码编译、依赖安装、数据库配置等繁琐步骤,整个过程至少需要半天时间。而使用Docker容器化部署,只需要几条命令就能完成全套环境搭建,部署时间可以缩短到10分钟以内。
我管理过多个不同规模的监控系统,从单机版到分布式集群都实践过。在容器化普及之前,每次部署新环境都要重复解决依赖冲突、权限配置等问题。现在用Docker部署Zabbix,不仅避免了"环境洁癖"问题,还能实现版本快速切换和环境快速复制。
2. 部署前的准备工作
2.1 硬件资源规划
根据监控规模的不同,Zabbix对资源的需求差异很大。以下是我的经验值参考表:
| 监控主机数量 | CPU核心 | 内存(GB) | 存储(GB) |
|---|---|---|---|
| <100 | 2 | 4 | 20 |
| 100-500 | 4 | 8 | 50 |
| 500-1000 | 8 | 16 | 100 |
| >1000 | 16+ | 32+ | 200+ |
注意:生产环境建议预留20%的资源余量,历史数据存储周期建议根据实际需求调整
2.2 软件环境准备
确保宿主机已安装Docker和Docker Compose。推荐使用以下版本:
- Docker CE 20.10+
- Docker Compose 1.29+
验证环境:
bash复制docker --version
docker-compose --version
如果尚未安装,可以使用以下命令快速安装:
bash复制# Ubuntu示例
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 使用Docker Compose部署Zabbix
3.1 编写docker-compose.yml
这是我优化过的多容器部署方案,包含Zabbix Server、Web界面、MySQL数据库和Zabbix Agent:
yaml复制version: '3.5'
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: your_secure_password
MYSQL_DATABASE: zabbix
volumes:
- zabbix_export:/var/lib/zabbix/export
- zabbix_snmptraps:/var/lib/zabbix/snmptraps
depends_on:
- zabbix-mysql
restart: unless-stopped
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:6.0-latest
ports:
- "8080:8080"
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_USER: zabbix
MYSQL_PASSWORD: your_secure_password
MYSQL_DATABASE: zabbix
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
depends_on:
- zabbix-server
- zabbix-mysql
restart: unless-stopped
zabbix-mysql:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: your_secure_password
MYSQL_ROOT_PASSWORD: your_secure_root_password
volumes:
- zabbix_mysql:/var/lib/mysql
restart: unless-stopped
zabbix-agent:
image: zabbix/zabbix-agent:6.0-latest
ports:
- "10050:10050"
environment:
ZBX_HOSTNAME: Zabbix server
ZBX_SERVER_HOST: zabbix-server
depends_on:
- zabbix-server
restart: unless-stopped
volumes:
zabbix_mysql:
zabbix_export:
zabbix_snmptraps:
3.2 关键配置说明
-
网络配置:
- Zabbix Server监听10051端口
- Web界面映射到宿主机的8080端口
- Agent使用10050端口
-
环境变量:
PHP_TZ设置时区(根据实际位置修改)- MySQL密码建议使用强密码替换
your_secure_password - 生产环境建议使用
.env文件管理敏感信息
-
数据持久化:
- MySQL数据存储在
zabbix_mysql卷 - 导出数据和SNMP陷阱分别使用独立卷
- MySQL数据存储在
3.3 启动与初始化
执行部署命令:
bash复制docker-compose up -d
首次启动需要等待MySQL初始化完成(约2-5分钟),可以通过日志观察进度:
bash复制docker-compose logs -f zabbix-mysql
当看到"MySQL init process done. Ready for start up."日志时,表示初始化完成。
4. 系统配置与优化
4.1 访问Web界面
浏览器访问http://服务器IP:8080,初始登录凭证:
- 用户名:Admin
- 密码:zabbix
首次登录后请立即修改密码!
4.2 基础配置建议
-
时区设置:
在"Administration → General → GUI"中调整时区,确保与docker-compose.yml中的PHP_TZ一致 -
邮件报警配置:
text复制
Administration → Media types → Email 配置SMTP服务器信息 -
用户权限:
建议创建普通用户并分配适当权限,避免长期使用Admin账户
4.3 性能调优参数
在"Administration → General → Housekeeping"中调整:
- 历史数据保留周期(默认30天)
- 趋势数据保留周期(默认365天)
- 事件和告警保留周期
对于大型部署,建议修改Zabbix Server的配置文件:
bash复制docker exec -it zabbix-server /bin/bash
vi /etc/zabbix/zabbix_server.conf
关键参数:
ini复制StartPollers=20
StartPollersUnreachable=5
StartTrappers=15
StartPingers=10
CacheSize=256M
HistoryCacheSize=128M
修改后重启服务:
bash复制docker-compose restart zabbix-server
5. 常见问题排查
5.1 容器启动失败
现象:MySQL容器不断重启
排查步骤:
- 检查日志:
docker-compose logs zabbix-mysql - 常见原因:
- 宿主机内存不足
- 端口冲突
- 卷权限问题
解决方案:
bash复制# 清理旧数据卷重新启动
docker-compose down -v
docker-compose up -d
5.2 Web界面无法访问
检查清单:
- 确认所有容器正常运行:
docker-compose ps - 检查防火墙设置:
bash复制sudo ufw allow 8080/tcp sudo ufw reload - 查看Web容器日志:
docker-compose logs zabbix-web
5.3 监控数据不更新
诊断方法:
- 检查Agent状态:
bash复制docker exec -it zabbix-agent zabbix_agentd -t agent.ping - 查看Server日志:
bash复制docker-compose logs zabbix-server | grep "failed"
典型解决方案:
- 确认Agent配置中的Server地址正确
- 检查网络连通性
- 增加Server的Pollers数量
6. 生产环境建议
6.1 高可用方案
对于关键业务监控,建议采用以下架构:
-
数据库层:
- 使用MySQL集群或云数据库服务
- 定期备份数据库
-
Zabbix Server层:
- 部署多个Server实例
- 使用负载均衡
-
前端层:
- 多个Web实例
- 配置会话共享
6.2 备份策略
-
数据库备份:
bash复制docker exec zabbix-mysql mysqldump -u zabbix -p zabbix > zabbix_backup.sql -
配置文件备份:
bash复制docker cp zabbix-server:/etc/zabbix/zabbix_server.conf . docker cp zabbix-web:/etc/zabbix/web/zabbix.conf.php . -
定期备份:
建议使用cron定时任务,每周全量备份,每日增量备份
6.3 安全加固
-
网络隔离:
- 将Zabbix组件部署在内部网络
- 只暴露必要端口
-
访问控制:
- 限制Web界面的访问IP
- 启用HTTPS
-
账户安全:
- 启用双因素认证
- 定期轮换密码
7. 扩展监控能力
7.1 监控Docker容器
在docker-compose.yml中添加:
yaml复制zabbix-agent2:
image: zabbix/zabbix-agent2:6.0-latest
environment:
ZBX_HOSTNAME: Docker Host
ZBX_SERVER_HOST: zabbix-server
ZBX_ACTIVE_ALLOW=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "10050:10050"
depends_on:
- zabbix-server
restart: unless-stopped
7.2 自定义监控项
通过Agent2监控自定义指标:
-
在Agent容器中创建自定义脚本:
bash复制docker exec -it zabbix-agent2 /bin/bash mkdir -p /etc/zabbix/zabbix_agent2.d/scripts -
添加监控项配置:
ini复制UserParameter=custom.metric[*],/etc/zabbix/zabbix_agent2.d/scripts/$1 -
在Web界面创建对应的监控项
7.3 集成Grafana
- 添加docker-compose服务:
yaml复制grafana:
image: grafana/grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
-
配置Zabbix数据源:
- URL: http://zabbix-web/api_jsonrpc.php
- 认证使用Zabbix API用户
-
导入Zabbix官方仪表板模板
8. 版本升级策略
8.1 小版本升级
- 修改docker-compose.yml中的镜像标签
- 执行滚动更新:
bash复制
docker-compose pull docker-compose up -d
8.2 大版本升级
-
备份所有数据
-
测试环境验证升级过程
-
分阶段升级:
- 先升级数据库
- 再升级Server
- 最后升级前端
-
检查所有监控项和触发器是否正常
8.3 回滚方案
- 修改docker-compose.yml回退到旧版本
- 恢复数据库备份
- 重启服务
建议在升级前创建数据库快照:
bash复制docker-compose exec zabbix-mysql mysqldump -u root -p zabbix > zabbix_pre_upgrade.sql