一、容器化部署架构
============
1.1 Zabbix监控系统组件
Zabbix监控系统在Docker环境中通常由以下组件构成:
- Zabbix Server:核心组件,负责数据收集、处理和告警
- Zabbix Web前端:提供Web界面,基于Nginx或Apache+PHP
- 数据库:存储监控数据,支持MySQL或PostgreSQL
- Zabbix Agent:部署在被监控主机上,负责数据采集
- Zabbix Java Gateway:可选组件,用于监控Java应用
1.2 容器化部署优势
- 简化部署:通过Docker Compose一键部署多个关联服务
- 环境隔离:各组件运行在独立容器中,避免依赖冲突
- 易于扩展:支持动态调整容器数量和资源分配
- 版本控制:通过镜像标签精确控制各组件版本
二、容器互联方式
2.1 Docker网络模式选择
2.1.1 自定义桥接网络(Single Host)
适用于单主机多容器部署,创建自定义桥接网络实现容器互联:
bash
lua
# 创建自定义桥接网络
docker network create --subnet 172.20.0.0/16 zabbix-net
2.1.2 Overlay网络(Multi Host)
适用于跨主机容器通信,需在Docker Swarm模式下使用:
bash
sql
# 创建overlay网络
docker network create -d overlay zabbix-overlay-net
2.2 容器名称解析
Docker自定义网络中支持通过容器名称进行通信,无需依赖IP地址:
yaml
yaml
# docker-compose.yml示例
services:
zabbix-server:
environment:
- DB_SERVER_HOST=zabbix-mysql # 使用数据库容器名称
zabbix-mysql:
container_name: zabbix-mysql # 指定容器名称
2.3 端口映射
需要对外暴露的服务需配置端口映射:
yaml
yaml
services:
zabbix-web:
ports:
- "80:8080" # 宿主机端口:容器端口
zabbix-server:
ports:
- "10051:10051" # Zabbix Server端口
三、Docker Compose示例
3.1 单主机部署(桥接网络)
yaml
yaml
version: '3.8'
services:
mysql-server:
image: mysql:8.0
container_name: zabbix-mysql
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: "zabbix_pwd"
networks:
- zabbix-net
command: ["--character-set-server=utf8", "--collation-server=utf8_bin"]
volumes:
- mysql-data:/var/lib/mysql
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:alpine-7.0-latest
container_name: zabbix-java-gateway
networks:
- zabbix-net
zabbix-server:
image: zabbix/zabbix-server-mysql:alpine-7.0-latest
container_name: zabbix-server-mysql
depends_on:
- mysql-server
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: "zabbix_pwd"
ZBX_JAVAGATEWAY: zabbix-java-gateway
networks:
- zabbix-net
ports:
- "10051:10051"
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest
container_name: zabbix-web-nginx-mysql
depends_on:
- mysql-server
- zabbix-server
environment:
DB_SERVER_HOST: mysql-server
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: "zabbix_pwd"
PHP_TZ: "Asia/Shanghai"
networks:
- zabbix-net
ports:
- "80:8080"
networks:
zabbix-net:
driver: bridge
volumes:
mysql-data:
3.2 Swarm模式部署(Overlay网络)
yaml
yaml
version: '3.8'
services:
zabbix-server:
deploy:
placement:
constraints: [node.role == manager]
networks:
- zabbix-overlay-net
networks:
zabbix-overlay-net:
driver: overlay
四、监控配置方法
4.1 Zabbix Agent部署
4.1.1 容器内Agent
适用于监控容器化应用:
yaml
ini
services:
zabbix-agent:
image: zabbix/zabbix-agent:alpine-7.0-latest
environment:
- ZBX_SERVER_HOST=zabbix-server
- ZBX_HOSTNAME=docker-host
4.1.2 主机Agent
适用于监控宿主机及非容器化服务,需挂载Docker套接字:
yaml
javascript
services:
zabbix-agent:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
4.2 使用官方模板
Zabbix提供Docker监控官方模板:
- 导入模板:Configuration → Templates → Import → "Docker by Zabbix agent 2"
- 关联主机:Hosts → 选择主机 → Templates → Add
- 配置宏变量:{$DOCKER.ENDPOINT}=unix:///var/run/docker.sock
4.3 自定义监控项
通过UserParameter配置自定义监控项:
ini
ini
# zabbix_agentd.conf
UserParameter=docker.container.status[*],docker inspect -f '{{.State.Status}}' $1
五、常见问题及解决方案
5.1 网络通信问题
症状:Zabbix Server无法连接数据库容器
解决:
- 确认容器在同一网络:
docker network inspect zabbix-net
- 检查防火墙规则:开放容器间通信端口
- 使用容器IP测试连接:
docker exec -it zabbix-server ping zabbix-mysql
5.2 数据持久化
使用Docker卷挂载确保数据不丢失:
yaml
yaml
services:
mysql-server:
volumes:
- mysql-data:/var/lib/mysql # 卷挂载
5.3 权限问题
Zabbix Agent需要访问Docker套接字的权限:
bash
bash
# 将zabbix用户添加到docker组
usermod -aG docker zabbix
5.4 时区配置
确保所有容器时区一致:
yaml
ruby
services:
zabbix-server:
environment:
- TZ=Asia/Shanghai
volumes:
- /etc/localtime:/etc/localtime:ro
六、最佳实践总结
-
网络设计:
- 单主机使用自定义桥接网络
- 跨主机使用Overlay网络(Docker Swarm)
- 避免使用host网络模式
-
资源限制:
为各容器设置资源限制,避免资源竞争:
yaml
yamldeploy: resources: limits: cpus: '2' memory: 2G
-
监控自身:
使用Zabbix监控Docker服务及容器状态,包括:
- 容器CPU/内存使用率
- 容器状态(运行/停止)
- 镜像大小及数量
-
安全加固:
- 使用非root用户运行容器
- 限制容器权限(cap_drop)
- 定期更新镜像版本