Zabbix Docker 部署教程

1. 最新版本对比

版本号

类型

发布时间

特点

Zabbix 7.0

LTS

2024 年 6 月

长期支持,稳定性高

Zabbix 7.4

标准版

2025 年中发布

最新功能,适合尝鲜

这里选用7.0,具体如下:

  • 操作系统环境:Liunx

  • Zabbix:7.0.17

  • MySQL:8.0.39

  • Zabbix-agent2:7.0.5

2. 安装

2.1 创建目录结构

在当前目录创建docker-compose.yml、.env和Dockerfile.zabbix-server文件,并将2.3.3到2.3.5的相关内容复制进去

创建目录,用来持久化存储一些重要数据

mkdir -p config data/mysql data/zabbix-server data/alertscripts zabbix-web

2.2 初始化zabbix数据库

从 Zabbix 官方源码中获取完整的数据库初始化脚本,包括:

  • schema.sql(表结构)

  • images.sql(图标资源)

  • data.sql(初始数据)

下载并解压源码包

wget https://cdn.zabbix.com/zabbix/sources/stable/7.0/zabbix-7.0.17.tar.gz
tar -xvzf zabbix-7.0.17.tar.gz
cd zabbix-7.0.17/database/mysql

合并SQL 文件为 init.sql,导出位置可自选

cat schema.sql images.sql data.sql > ../../../init.sql

2.3 拷贝初始数据

因为docker的持久化是单向覆盖(宿主机→docker容器),所以需先启动相关容器并拷贝初始数据

2.3.1 创建容器但不启动

docker compose create --build

2.3.2 从容器中拷贝默认配置

docker cp zabbix-server:/etc/zabbix/zabbix_server.conf ./config/zabbix_server.conf
docker cp zabbix-agent:/etc/zabbix/zabbix_agentd2.conf ./config/zabbix_agentd2.conf
docker cp zabbix-web:/usr/share/zabbix/. ./zabbix-web/

2.3.3 docker-compose.yml

拷贝默认配置的时候,需注释掉所有的挂载卷,再创建容器但不启动

Zabbix探针,agent容器已被注释,因docker方式部署探针会有很多弊端,建议宿主机通过二进制文件直接部署,官方链接:Download Zabbix agents

#version: '3.5'

services:
  mysql:
    image: mysql:8.0.39
    container_name: zabbix-mysql
    restart: always
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    volumes:
      - ${MYSQL_DATA_PATH}:/var/lib/mysql
      - ${MYSQL_INIT_SQL}:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "${MYSQL_PORT}:3306"
    networks:
      zbx_net:
        ipv4_address: ${MYSQL_IP}

  zabbix-server:
    build:
      context: .
      dockerfile: Dockerfile.zabbix-server
    container_name: zabbix-server
    restart: always
    depends_on:
      - mysql
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes:
      - ${ZBX_SERVER_CONF}:/etc/zabbix/zabbix_server.conf
      - ${ZBX_SERVER_DATA}:/var/lib/zabbix 
      - ${ZBX_SERVER_ALERTS}:/usr/lib/zabbix/alertscripts
    ports:
      - "${ZBX_SERVER_PORT}:10051"
    networks:
      zbx_net:
        ipv4_address: ${ZBX_SERVER_IP}

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-7.0.17
    container_name: zabbix-web
    restart: always
    depends_on:
      - zabbix-server
      - mysql
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: ${PHP_TZ}
      WEB_LISTEN_IP: 0.0.0.0
    volumes:
      - ${ZBX_WEB_DATA}:/usr/share/zabbix
    ports:
      - "${ZBX_WEB_PORT}:8080"
    networks:
      zbx_net:
        ipv4_address: ${ZBX_WEB_IP}

#  zabbix-agent:
#    image: zabbix/zabbix-agent2:alpine-7.0.5
#    container_name: zabbix-agent
#    restart: always
#    depends_on:
#      - zabbix-server
#    environment:
#      ZBX_SERVER_HOST: zabbix-server
#      ZBX_HOSTNAME: docker-agent
#    volumes:
#       - ${ZBX_AGENT_CONF}:/etc/zabbix/zabbix_agentd2.conf
##    network_mode: host
#    ports:
#      - "${ZBX_AGENT_PORT}:10050"
#    networks:
#      zbx_net:
#        ipv4_address: ${ZBX_AGENT_IP}


networks:
  zbx_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.225.0.0/16

2.3.4 .env

# 数据库配置
MYSQL_DATABASE=zabbix
MYSQL_USER=zabbix
MYSQL_PASSWORD=
MYSQL_ROOT_PASSWORD=

# MySQL 数据存初始化 SQL挂载路径
MYSQL_DATA_PATH=./data/mysql
MYSQL_INIT_SQL=./init.sql

# 时区
PHP_TZ=Asia/Shanghai

# Zabbix Server 配置挂载路径
ZBX_SERVER_CONF=./config/zabbix_server.conf
ZBX_SERVER_DATA=./data/zabbix-server
ZBX_SERVER_ALERTS=./data/alertscripts


# Zabbix Web 配置挂载路径
ZBX_WEB_DATA=./zabbix-web

# Zabbix Agent 配置挂载路径
#ZBX_AGENT_CONF=./config/zabbix_agentd2.conf




# 容器静态 IP
MYSQL_IP=172.225.0.2
ZBX_SERVER_IP=172.225.0.3
ZBX_WEB_IP=172.225.0.4
#ZBX_AGENT_IP=172.225.0.5
LOG_EXPORTER_IP=172.225.0.6

#容器对外端口

# 数据库端口
MYSQL_PORT=3306

# Zabbix server端口
ZBX_SERVER_PORT=10051

# Zabbix web端口
ZBX_WEB_PORT=8080

# Zabbix agent端口
#ZBX_AGENT_PORT=10050

2.3.5 Dockerfile.zabbix-server

Zabbix执行一些脚本时候,需要一些环境,例如Python,所以初次需要编译zabbix-server容器

FROM zabbix/zabbix-server-mysql:alpine-7.0.17

# 切换到 root 安装
USER root

# 安装 python3 和 pip
# 替换 apk 源为国内镜像(清华为例)
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
    && apk update && apk add --no-cache \
        python3 \
        py3-pip \
        py3-requests \
    && rm -rf /var/cache/apk/* \
    && mkdir -p /usr/lib/zabbix/alertscripts \
    && chown -R zabbix:zabbix /usr/lib/zabbix/alertscripts
    
USER zabbix

2.3.6 取消服务,重新创建再启动服务

暂停并删除当前的容器,取消docker-compose.yml文件中挂载卷的注释,然后重新编译并启动容器

docker compose down
docker compose create --build
docker compose start

等待一段时间,zabbix-web和mysql初始化完成

安装完成后,初次登录

账号:Admin

密码:zabbix

3. 基本配置

待续...