欢迎光临中国护送网
详情描述
基于 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

  • 默认用户名:Admin
  • 默认密码: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. 安全建议

修改默认密码

  • 修改 Admin 用户密码
  • 修改数据库密码

启用 HTTPS

  • 配置 SSL 证书
  • 强制 HTTPS 访问

限制访问

  • 配置防火墙规则
  • 使用 VPN 访问

定期更新

  • 及时更新 Zabbix 版本
  • 更新基础镜像

九、高级配置

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 部署。