基于 Docker 安装 Zabbix 详细教程
一、环境准备
1. 系统要求
- Linux 系统(Ubuntu 20.04+/CentOS 7+)
- Docker 和 Docker Compose 已安装
- 至少 4GB RAM(生产环境建议 8GB+)
- 至少 20GB 磁盘空间
2. 安装 Docker 和 Docker Compose
Ubuntu/Debian:
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加 Docker GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
docker compose version
CentOS/RHEL:
# 卸载旧版本
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
docker compose version
二、Docker Compose 安装方式
1. 创建项目目录
mkdir -p ~/zabbix-docker
cd ~/zabbix-docker
2. 创建 docker-compose.yml 文件
version: '3.5'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:latest
container_name: zabbix-server
restart: unless-stopped
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
MYSQL_ROOT_PASSWORD: root_password
ZBX_CACHESIZE: 128M
ZBX_HISTORYCACHESIZE: 256M
ZBX_HISTORYINDEXCACHESIZE: 128M
ZBX_TRENDCACHESIZE: 128M
ZBX_VALUECACHESIZE: 128M
volumes:
- ./zbx_env/var/lib/zabbix/snmptraps:/var/lib/zabbix/snmptraps:rw
- ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
ports:
- "10051:10051"
networks:
- zabbix-net
depends_on:
- zabbix-mysql
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:latest
container_name: zabbix-web
restart: unless-stopped
environment:
DB_SERVER_HOST: zabbix-mysql
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
MYSQL_ROOT_PASSWORD: root_password
ZBX_SERVER_HOST: zabbix-server
PHP_TZ: Asia/Shanghai
ZBX_SERVER_PORT: 10051
ZBX_SERVER_NAME: Zabbix-Server
ports:
- "80:8080"
- "443:8443"
volumes:
- ./zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules:ro
networks:
- zabbix-net
depends_on:
- zabbix-mysql
- zabbix-server
zabbix-mysql:
image: mysql:8.0
container_name: zabbix-mysql
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_DATABASE: zabbix
MYSQL_USER: zabbix
MYSQL_PASSWORD: zabbix_password
MYSQL_ROOT_PASSWORD: root_password
volumes:
- ./zbx_env/var/lib/mysql:/var/lib/mysql:rw
- ./zbx_env/initdb.d:/docker-entrypoint-initdb.d:ro
networks:
- zabbix-net
ports:
- "3306:3306"
zabbix-agent:
image: zabbix/zabbix-agent:latest
container_name: zabbix-agent
restart: unless-stopped
environment:
ZBX_HOSTNAME: Zabbix-server
ZBX_SERVER_HOST: zabbix-server
ZBX_SERVER_PORT: 10051
ports:
- "10050:10050"
networks:
- zabbix-net
privileged: true
pid: "host"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /proc:/proc:ro
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
container_name: zabbix-java-gateway
restart: unless-stopped
networks:
- zabbix-net
networks:
zabbix-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
3. 创建初始化脚本(可选)
mkdir -p zbx_env/initdb.d
cat > zbx_env/initdb.d/create_zabbix_db.sql << EOF
-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER IF NOT EXISTS 'zabbix'@'%' IDENTIFIED BY 'zabbix_password';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';
FLUSH PRIVILEGES;
EOF
4. 启动 Zabbix
# 启动所有服务
docker compose up -d
# 查看容器状态
docker compose ps
# 查看日志
docker compose logs -f zabbix-server
docker compose logs -f zabbix-web
# 停止服务
docker compose down
# 停止并删除数据(谨慎操作)
docker compose down -v
三、Docker 命令直接安装方式
1. 创建网络
docker network create --subnet=172.20.0.0/16 zabbix-net
2. 启动 MySQL 数据库
docker run -d \
--name zabbix-mysql \
--network zabbix-net \
--restart unless-stopped \
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix_password \
-e MYSQL_ROOT_PASSWORD=root_password \
-v zabbix-mysql-data:/var/lib/mysql \
-p 3306:3306 \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_bin \
--default-authentication-plugin=mysql_native_password
3. 导入 Zabbix 数据库结构
# 等待 MySQL 完全启动(约30秒)
sleep 30
# 下载并导入数据库结构
docker run -d \
--name zabbix-server-mysql \
--network zabbix-net \
--restart unless-stopped \
-e DB_SERVER_HOST="zabbix-mysql" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_password" \
-e MYSQL_ROOT_PASSWORD="root_password" \
zabbix/zabbix-server-mysql:latest
4. 启动 Zabbix Server
# 先停止并删除临时容器
docker stop zabbix-server-mysql && docker rm zabbix-server-mysql
# 启动正式的 Zabbix Server
docker run -d \
--name zabbix-server \
--network zabbix-net \
--restart unless-stopped \
-e DB_SERVER_HOST="zabbix-mysql" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_password" \
-e MYSQL_ROOT_PASSWORD="root_password" \
-e ZBX_CACHESIZE=128M \
-e ZBX_HISTORYCACHESIZE=256M \
-e ZBX_HISTORYINDEXCACHESIZE=128M \
-e ZBX_TRENDCACHESIZE=128M \
-e ZBX_VALUECACHESIZE=128M \
-p 10051:10051 \
zabbix/zabbix-server-mysql:latest
5. 启动 Zabbix Web 界面
docker run -d \
--name zabbix-web \
--network zabbix-net \
--restart unless-stopped \
-e DB_SERVER_HOST="zabbix-mysql" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_password" \
-e MYSQL_ROOT_PASSWORD="root_password" \
-e ZBX_SERVER_HOST="zabbix-server" \
-e PHP_TZ="Asia/Shanghai" \
-p 80:8080 \
-p 443:8443 \
zabbix/zabbix-web-nginx-mysql:latest
6. 启动 Zabbix Agent(监控服务器自身)
docker run -d \
--name zabbix-agent \
--network zabbix-net \
--restart unless-stopped \
-e ZBX_HOSTNAME="Zabbix-server" \
-e ZBX_SERVER_HOST="zabbix-server" \
-e ZBX_SERVER_PORT=10051 \
-p 10050:10050 \
--privileged \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /proc:/proc:ro \
zabbix/zabbix-agent:latest
7. 启动 Zabbix Java Gateway(可选)
docker run -d \
--name zabbix-java-gateway \
--network zabbix-net \
--restart unless-stopped \
zabbix/zabbix-java-gateway:latest
四、Zabbix 初始配置
1. 访问 Web 界面
- 浏览器访问:
http://your-server-ip
- 或:
http://localhost
2. 首次安装向导
欢迎页面 → 点击 "Next step"
检查前提条件 → 确保所有项都是 "OK" → 点击 "Next step"
数据库配置:
- Database type: MySQL
- Database host: zabbix-mysql
- Database port: 3306
- Database name: zabbix
- User: zabbix
- Password: zabbix_password
- 点击 "Next step"
Zabbix服务器详情:
- Host: zabbix-server
- Port: 10051
- Name: Zabbix-Server
- 点击 "Next step"
预安装摘要 → 点击 "Next step"
安装完成 → 点击 "Finish"
3. 登录 Zabbix
4. 修改默认密码(重要)
登录后点击右上角用户图标 → Profile
点击 "Change password"
输入当前密码和新密码
点击 "Update"
五、添加被监控主机
1. 在客户端安装 Zabbix Agent
Linux 客户端:
# Ubuntu/Debian
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
sudo apt update
sudo apt install zabbix-agent2
# CentOS/RHEL
rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/7/x86_64/zabbix-release-6.4-1.el7.noarch.rpm
yum clean all
yum install zabbix-agent2
2. 配置 Zabbix Agent
编辑配置文件 /etc/zabbix/zabbix_agent2.conf:
Server=zabbix_server_ip # Zabbix 服务器 IP
ServerActive=zabbix_server_ip
Hostname=Client-Hostname # 客户端主机名(唯一标识)
3. 启动 Agent
sudo systemctl start zabbix-agent2
sudo systemctl enable zabbix-agent2
sudo systemctl status zabbix-agent2
4. 在 Zabbix Web 界面添加主机
登录 Zabbix Web
左侧菜单:Configuration → Hosts
点击 "Create host"
填写信息:
- Host name: 客户端主机名(与 agent 配置一致)
- Visible name: 显示名称
- Templates: 选择模板(如:Linux by Zabbix agent)
- Groups: 选择主机组(如:Linux servers)
- Interfaces: 添加 agent 接口(IP 地址和端口 10050)
点击 "Add"
六、常用监控模板
1. 内置模板
- Linux 服务器:Linux by Zabbix agent
- Windows 服务器:Windows by Zabbix agent
- 网络设备:Template SNMP Device
- MySQL 数据库:MySQL by Zabbix agent
- Apache/Nginx:Apache/Nginx by Zabbix agent
2. 应用模板
左侧菜单:Configuration → Templates
点击 "Import"
上传模板 XML 文件(可从 Zabbix Share 下载)
点击 "Import"
七、日常管理命令
1. Docker 管理命令
# 查看所有容器状态
docker ps -a
# 查看容器日志
docker logs zabbix-server
docker logs -f zabbix-web # 实时查看
# 进入容器
docker exec -it zabbix-server bash
docker exec -it zabbix-mysql mysql -uzabbix -p
# 停止容器
docker stop zabbix-server
docker stop zabbix-web
docker stop zabbix-mysql
# 启动容器
docker start zabbix-server
docker start zabbix-web
docker start zabbix-mysql
# 重启容器
docker restart zabbix-server
# 删除容器
docker rm zabbix-server
# 查看资源使用
docker stats
2. 数据备份与恢复
# 备份 MySQL 数据
docker exec zabbix-mysql mysqldump -u zabbix -pzabbix_password zabbix > zabbix_backup_$(date +%Y%m%d).sql
# 备份配置文件
docker cp zabbix-server:/etc/zabbix/zabbix_server.conf ./zabbix_server.conf.backup
# 恢复数据
cat zabbix_backup.sql | docker exec -i zabbix-mysql mysql -u zabbix -pzabbix_password zabbix
3. 更新 Zabbix
# 停止容器
docker compose down
# 拉取最新镜像
docker compose pull
# 重新启动
docker compose up -d
# 或逐个更新
docker pull zabbix/zabbix-server-mysql:latest
docker pull zabbix/zabbix-web-nginx-mysql:latest
docker pull zabbix/zabbix-agent:latest
八、故障排除
1. 常见问题
问题1:Web 界面无法访问
# 检查容器状态
docker ps | grep zabbix-web
# 检查端口
netstat -tlnp | grep 80
# 查看日志
docker logs zabbix-web
问题2:Zabbix Server 无法连接数据库
# 检查 MySQL 容器
docker exec zabbix-mysql mysql -uzabbix -pzabbix_password -e "SELECT 1;"
# 检查网络
docker network inspect zabbix-net
# 从 Server 容器测试连接
docker exec zabbix-server ping zabbix-mysql
问题3:Agent 无法连接 Server
# 检查端口
telnet zabbix_server_ip 10051
# 检查防火墙
sudo ufw status
sudo firewall-cmd --list-all
# 查看 Server 日志
docker logs zabbix-server | grep "agent"
2. 性能优化建议
调整数据库参数:
- 增加 InnoDB buffer pool
- 优化查询缓存
调整 Zabbix 缓存:
- 根据内存大小调整缓存参数
- 参考:ZBX_CACHESIZE, ZBX_HISTORYCACHESIZE
定时清理历史数据:
- 设置数据保留策略
- 定期清理 housekeeper
使用分区表:
3. 安全建议
修改默认密码:
启用 HTTPS:
限制访问:
定期更新:
九、高级配置
1. 使用外部数据库
修改 docker-compose.yml 中的数据库配置:
zabbix-server:
environment:
DB_SERVER_HOST: "external-db-host"
MYSQL_DATABASE: "zabbix"
MYSQL_USER: "zabbix"
MYSQL_PASSWORD: "your_password"
MYSQL_ROOT_PASSWORD: "root_password"
2. 使用外部 NFS 存储
# 创建 NFS 共享目录
mkdir -p /nfs/zabbix
chmod 777 /nfs/zabbix
# 修改 docker-compose.yml
volumes:
- /nfs/zabbix/mysql:/var/lib/mysql:rw
- /nfs/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:rw
3. 配置邮件告警
在 Zabbix Web 界面:Administration → Media types
创建新的媒体类型(Email)
配置 SMTP 服务器
为用户分配媒体类型
4. 配置微信/钉钉告警
编写告警脚本
放置在 externalscripts 目录
创建新的媒体类型
配置告警动作
十、监控 Docker 容器
安装 Docker 监控模板:
# 下载 Docker 监控模板
wget https://raw.githubusercontent.com/monitoringartist/Zabbix-Docker-Monitoring/master/template/Zabbix-Template-App-Docker.xml
# 导入模板到 Zabbix
# 在 Web 界面:Configuration → Templates → Import
配置 Zabbix Agent 监控 Docker:
# 在 agent 配置中添加
UserParameter=docker.containers.discovery,/usr/bin/docker ps -a --format "{{.Names}}" | jq -R . | jq -s . | jq '{"data":[.[]|{"{#CONTAINERNAME}":.}]}'
UserParameter=docker.containers.stats[*],/usr/bin/docker stats --no-stream --format "{{.$1}}" $2
这样您就完成了一个完整的 Zabbix 监控系统的 Docker 部署。