docker compose方式部署Zabbix 7.0 LTS

docker compose方式部署 Zabbix 7.0 LTS

Zabbix 由几个主要的功能组件组成
  • zabbix-server 是 Zabbix agent 向其报告可用性、系统完整性信息和统计信息的核心组件。
  • zabbix-agent 部署在被监控目标上,用于主动监控本地资源和应用程序,并将收集的数据发送给 Zabbix server。
  • zabbix-web 提供基于 web 的界面(Apache 或 Nginx)。
  • Zabbix-Web-Service 在Zabbix5.4版中首次出现,基于Go编写。主要作用是定期发送巡检报告到指定邮件账户。
  • zabbix-java-gateway
  • zabbix-snmptraps
  • zabbix-proxy

可以根据不同组合,搭配不同的docker镜像,如下

Zabbix server 收集数据存储(可选MySQL、PostgreSQL等)

Zabbix web-interface

安装环境版本

单机安装以下服务。不使用docker安装zabbix agent,安装在容器中的agent监控的是容器的状态,而不是宿主机的状态。

OS: Rocky Linux 9.2 x86_64

docker compose组合: zabbix 7.0 LTS + MySQL 8.0 + Nginx

docker宿主机IP: 10.10.88.2 (这里选择宿主机安装zabbix agent2)

1、前期准备工作

省略docker安装步骤。

2、zabbix docker compose 配置文件

从 Zabbix github官网 获取7.0 LTS 版本 docker compose.yaml

Zabbix 为 Docker 提供了定义和运行复杂 Zabbix 组件的 compose 文件。这些 compose 文件可以在 Zabbix docker 官方镜像仓库 中找到。

官方提供的 docker compose 文件很多,都是根据组件搭配命名

  • v3 为 docker compose 版本,具体对应关系在这里查看https://docs.docker.com/compose/compose-file/compose-versioning/
  • 基础镜像类型,有 alpine/ubuntu/Oracle linux 可选。
  • MySQL 为 zabbix server 所使用的数据库类型,目前有 MySQL/PostgreSQL 二种。
  • latest 表示为使用官方的最新镜像,local 是下载本地进行 build 镜像。

这里使用基于 docker-compose_v3_alpine_mysql_latest.yaml 模板,调整适合公司使用。

基于alpine Linux镜像,Zabbix server 后端使用MySQL数据库, Zabbix web使用Nginx展示

也可以通过git方式获取基于 zabbix7.0 LTS配置(可选,非必须)

shell 复制代码
git clone https://github.com/zabbix/zabbix-docker.git

如果之前已经clone过了,重现拉取服务器最新配置,如:
git pull

git切换分支为7.0,也就是长期支持版本(LTS)
git checkout 7.0

[root@VM8802 zabbix-docker]# ll -tha
已省略部分......
-rw-r--r--  1 root root 2.8K Jun  6 11:20 .env
drwxr-xr-x  3 root root 4.0K Jun  6 11:20 env_vars
-rw-r--r--  1 root root  44K Jun  6 11:20 kubernetes.yaml
-rw-r--r--  1 root root  338 Jun  6 11:20 compose_additional_components.yaml
-rw-r--r--  1 root root 2.6K Jun  6 11:20 compose_databases.yaml
lrwxrwxrwx  1 root root   42 Jun  6 11:20 compose.yaml -> docker-compose_v3_alpine_mysql_latest.yaml
-rw-r--r--  1 root root  14K Jun  6 11:20 compose_zabbix_components.yaml
-rw-r--r--  1 root root 4.1K Jun  6 11:20 docker-compose_v3_ubuntu_mysql_latest.yaml
-rw-r--r--  1 root root 7.4K Jun  6 11:20 docker-compose_v3_ubuntu_mysql_local.yaml
-rw-r--r--  1 root root 4.1K Jun  6 11:20 docker-compose_v3_ubuntu_pgsql_latest.yaml
-rw-r--r--  1 root root 7.7K Jun  6 11:20 docker-compose_v3_ubuntu_pgsql_local.yaml
-rw-r--r--  1 root root 4.4K Jun  6 11:20 docker-compose_v3_alpine_mysql_latest.yaml
-rw-r--r--  1 root root 7.6K Jun  6 11:20 docker-compose_v3_alpine_mysql_local.yaml
-rw-r--r--  1 root root 4.4K Jun  6 11:20 docker-compose_v3_alpine_pgsql_latest.yaml
-rw-r--r--  1 root root 8.0K Jun  6 11:20 docker-compose_v3_alpine_pgsql_local.yaml
-rw-r--r--  1 root root 4.3K Jun  6 11:20 docker-compose_v3_ol_mysql_latest.yaml
-rw-r--r--  1 root root 7.4K Jun  6 11:20 docker-compose_v3_ol_mysql_local.yaml
-rw-r--r--  1 root root 4.3K Jun  6 11:20 docker-compose_v3_ol_pgsql_latest.yaml
-rw-r--r--  1 root root 7.7K Jun  6 11:20 docker-compose_v3_ol_pgsql_local.yaml

可以看到当前 compose.yaml 是链接指向 docker-compose_v3_alpine_mysql_latest.yaml
# docker compose -f ./docker-compose_v3_alpine_mysql_latest.yaml up -d
2.1 docker compose配置

官网提供的docker compose文件把所有组件都写上了。可根据自己需求,删除一些不需要的组件配置部分。

当前配置如下组件

zabbix-server

zabbix-server-mysql

zabbix-web-nginx-mysql

zabbix-java-gateway

zabbix-snmptraps

配置文件列表
# tree -a /data/zabbix/
/data/zabbix/
├── compose.yaml
└── zbx_env
    ├── .env_db_mysql
    ├── .env_java
    ├── .env_srv
    └── .env_web

官网默认配置了两个网段,其中zabbix-server和zabbix-java-gateway在不同的网段,导致互通有些干扰,这里就仅保留一个网段配置。

compose.yaml 完整配置(基于 docker-compose_v3_alpine_mysql_latest.yaml 修改)

yaml 复制代码
services:
  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-7.0-latest
    ports:
      - 10051:10051
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/zabbix/zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro
      - /data/zabbix/zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro
      - /data/zabbix/zbx_env/var/lib/zabbix/dbscripts:/var/lib/zabbix/dbscripts:ro
      - /data/zabbix/zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw
      - /data/zabbix/zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
      - /data/zabbix/zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
      - /data/zabbix/zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
      - /data/zabbix/zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro
      - snmptraps:/var/lib/zabbix/snmptraps:rw
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
    deploy:
      resources:
        limits:
          cpus: '0.70'
          memory: 2G
        reservations:
          memory: 512M
    env_file:
      - /data/zabbix/zbx_env/.env_db_mysql
      - /data/zabbix/zbx_env/.env_srv
    depends_on:
      - mysql-server
    networks:
      zbx_net:
        aliases:
          - zabbix-server
          - zabbix-server-mysql
    stop_grace_period: 30s
    sysctls:
      - net.ipv4.ip_local_port_range=1024 64999
      - net.ipv4.conf.all.accept_redirects=0
      - net.ipv4.conf.all.secure_redirects=0
      - net.ipv4.conf.all.send_redirects=0
    labels:
      com.zabbix.description: Zabbix server with MySQL database support
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: zabbix-server
      com.zabbix.dbtype: mysql
      com.zabbix.os: "Alpine"
  zabbix-web-nginx-mysql:
    image: zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest
    ports:
      - 80:8080
      - 443:8443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - /data/zabbix/zbx_env/etc/ssl/nginx:/etc/ssl/nginx:ro
      - /data/zabbix/zbx_env/usr/share/zabbix/modules/:/usr/share/zabbix/modules/:ro
    deploy:
      resources:
        limits:
          cpus: '0.70'
          memory: 1024M
        reservations:
          memory: 256M
    env_file:
      - /data/zabbix/zbx_env/.env_db_mysql
      - /data/zabbix/zbx_env/.env_web
    depends_on:
      - mysql-server
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/ping"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s
    networks:
      zbx_net:
        aliases:
          - zabbix-web-nginx-mysql
    stop_grace_period: 10s
    sysctls:
      - net.core.somaxconn=65535
    labels:
      com.zabbix.description: "Zabbix frontend on Nginx web-server with MySQL database support"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: zabbix-frontend
      com.zabbix.webserver: nginx
      com.zabbix.dbtype: mysql
      com.zabbix.os: "Alpine"
  zabbix-java-gateway:
    image: zabbix/zabbix-java-gateway:alpine-7.0-latest
    ports:
      - 10052:10052
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          memory: 256M
    env_file:
      - /data/zabbix/zbx_env/.env_java
    networks:
      zbx_net:
        aliases:
          - zabbix-java-gateway
    stop_grace_period: 5s
    labels:
      com.zabbix.description: "Zabbix Java Gateway"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: "java-gateway"
      com.zabbix.os: "Alpine"
  zabbix-snmptraps:
    image: zabbix/zabbix-snmptraps:alpine-7.0-latest
    profiles:
      - full
      - all
    ports:
      - 162:1162/udp
    volumes:
      - snmptraps:/var/lib/zabbix/snmptraps:rw
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 256M
        reservations:
          memory: 128M
    networks:
      zbx_net:
        aliases:
          - zabbix-snmptraps
    stop_grace_period: 5s
    labels:
      com.zabbix.description: "Zabbix snmptraps"
      com.zabbix.company: "Zabbix LLC"
      com.zabbix.component: snmptraps
      com.zabbix.os: "Alpine"
  mysql-server:
    image: mysql:8.0-oracle
    security_opt:
      - seccomp:unconfined
    command:
      - mysqld
      - --skip-mysqlx
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      # Only during upgrade from versions prior 6.4 and new installations (schema deployment)
      #- --log_bin_trust_function_creators=1
      - --log_timestamps=SYSTEM
      - --binlog_expire_logs_seconds=3600
      - --innodb_buffer_pool_size=2G
      - --max_connections=500
      - --wait_timeout=1200
      - --interactive_timeout=1200
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/zabbix/zbx_env/var/lib/mysql:/var/lib/mysql:rw
      - /data/backup/mysql:/data/backup/mysql:rw
    env_file:
      - /data/zabbix/zbx_env/.env_db_mysql
    stop_grace_period: 1m
    networks:
      zbx_net:
        aliases:
          - mysql-server
          - zabbix-database
          - mysql-database
  db_data_mysql:
    image: busybox
    volumes:
      - /data/zabbix/zbx_env/var/lib/mysql:/var/lib/mysql:rw
networks:
  zbx_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
volumes:
  snmptraps: 
2.2 环境变量文件

在 compose 文件中找到每个组件的默认环境变量文件,这些环境变量文件名类似 .env_<type of component>

  1. 配置mysql:.env_db_mysql
bash 复制代码
# DB_SERVER_HOST=mysql-server
# DB_SERVER_PORT=3306
# DB_SERVER_SOCKET=/var/run/mysqld/mysqld.sock
# MYSQL_USER_FILE=/run/secrets/MYSQL_USER
# MYSQL_PASSWORD_FILE=/run/secrets/MYSQL_PASSWORD
MYSQL_USER=zabbix
MYSQL_PASSWORD=yourzabbix
MYSQL_ROOT_PASSWORD=yourmysql
# MYSQL_ROOT_PASSWORD_FILE=/run/secrets/MYSQL_ROOT_PASSWORD
# MYSQL_ALLOW_EMPTY_PASSWORD=false
# MYSQL_DATABASE=zabbix
MYSQL_DATABASE=zabbix
  1. 配置zabbix-java-gateway:.env_java

    ZBX_START_POLLERS=5
    ZBX_TIMEOUT=3

  2. 配置Zabbix server:.env_srv

    ZBX_STARTPOLLERS=7
    ZBX_STARTPOLLERSUNREACHABLE=7
    ZBX_STARTTRAPPERS=20
    ZBX_STARTPINGERS=7
    ZBX_STARTDISCOVERERS=7
    ZBX_JAVAGATEWAY_ENABLE=true
    ZBX_JAVAGATEWAY=zabbix-java-gateway
    ZBX_JAVAGATEWAYPORT=10052
    ZBX_STARTJAVAPOLLERS=5
    ZBX_ENABLE_SNMP_TRAPS=true
    ZBX_CACHESIZE=1024M
    ZBX_HISTORYCACHESIZE=128M
    ZBX_TIMEOUT=15

  3. 配置Nginx:.env_web

    ZBX_SERVER_HOST=zabbix-server
    ZBX_SERVER_NAME=Your Corp. IT
    PHP_TZ=Asia/Shanghai

docker compose 配置说明

  1. 修改时区(web页面显示中文)
    修改 .env_web 配置相关项 PHP_TZ=Asia/Shanghai
  2. 解决zebbix web图片中文显示乱码(zabbix7.0下不指定也可以正常显示中文)
3、部署服务
cd /data/zabbix/
docker compose up -d

浏览 zabbix web界面

启动之后即可使用 <http://ip> 直接访问 zabbix web界面

默认用户名:Admin ,密码:zabbix (注意区分大小写)

配置已经设置了持久化数据目录映射到本地。

4、独立安装Zabbix agent2

安装Zabbix仓库(这里选择国内的腾讯源),然后安装Zabbix agent2

shell 复制代码
# rpm -Uvh https://mirrors.tencent.com/zabbix/zabbix/7.0/rhel/9/x86_64/zabbix-release-latest.el9.noarch.rpm
# dnf clean all

# dnf install zabbix-agent2

如果是 Rocky Linux 9.x 版本,则需要注意:

EL9 的 EPEL 存储库也提供了 Zabbix 包。 如果同时安装了官方 Zabbix 存储库和 EPEL 存储库,那么 EPEL 中的 Zabbix 包必须通过在 /etc/yum.repos.d/ 下的 EPEL 存储库配置文件中添加以下子句来排除,更详细说明可访问官网安装文档

txt 复制代码
[epel]
...
excludepkgs=zabbix*

然后安装即可
rpm -ivh https://mirrors.tencent.com/zabbix/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-2.el9.noarch.rpm
yum install zabbix-agent2

修改 /etc/zabbix/zabbix_agent2.conf ,指定 zabbix server 地址,如:

bash 复制代码
Server=127.0.0.1,172.16.238.4       # 172.16.238.4 为zabbix server容器IP
ServerActive=127.0.0.1,172.16.238.4
Hostname=10.10.88.2   # 这里为Linux主机IP

查看zabbix server 容器(容器名为 zabbix-zabbix-server-1 )IP方法

shell 复制代码
# docker inspect zabbix-zabbix-server-1 |grep IPAddress |tail -1 |awk '{print $2}' |tr '"' " " |tr ',' ' ' 
 172.16.238.4   

进入zabbix server容器
# docker exec -it zabbix-zabbix-server-1 bash

测试访问 zabbix agent2 的端口是否可以正常连通(端口不通,提示:wget: can't connect to remote host (10.10.88.2): Connection refused)
78d0d09dfa31:/var/lib/zabbix$ wget 10.10.88.2:10050
Connecting to 10.10.88.2:10050 (10.10.88.2:10050)
wget: error getting response

如果zabbix-server 服务器ip地址有更改,这里配置也需要修改,然后重启agent2服务
systemctl restart zabbix-agent2.service

5、设置允许docker容器访问宿主机

默认情况下宿主机内docker容器是禁止访问宿主机IP

防火墙firewalld开放zabbix server容器IP段(172.16.238.0/24)访问zabbix agent端口(tcp 10050)

# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=172.16.238.0/24 port port=10050 protocol=tcp accept' --permanent
# firewall-cmd --reload

上面的命令等同于修改配置 /etc/firewalld/zones/public.xml ,在 <zone> 区域内添加如下:

xml 复制代码
  <rule family="ipv4">
    <source address="172.16.238.0/24"/>
    <port protocol="tcp" port="10050"/>
    <accept/>
  </rule>

然后重启防火墙服务 systemctl restart firewalld.service 即可。

zabbix web页面里配置 zabbix server 主机接口 Agent(类型)地址由默认的 127.0.0.1:10050 改为 your-zabbix-server-ip:10050

日常维护

bash 复制代码
先切换到 compose.yaml 目录
cd /data/zabbix

停止 zabbix 所有服务   
docker compose down

启动 zabbix 所有服务   
docker compose up -d

停止mysql服务  
docker compose stop mysql-server

查看指定容器IP
docker inspect zabbix-zabbix-server-1 |grep IPAddress |tail -1 |awk '{print $2}' |tr '"' " " |tr ',' ' '

更新配置缓存
/usr/local/sbin/zabbix_server -R config_cache_reload

zabbix server日志默认位置(容器内): /var/log/zabbix/zabbix_server.log

MySQL持久化目录 /data/zabbix/zbx_env/var/lib/mysql

MySQL备份目录 /data/backup/mysql

zabbix官方监控模板

由于使用的zabbix是从低版本升级上来的,需要使用新版本只能手动从 Zabbix Git 存储库下载,然后zabbix web页面的 ConfigurationTemplates(配置 → 模板)手动导入。

升级

Only during upgrade from versions prior 6.4 and new installations (schema deployment)
mysql> set global log_bin_trust_function_creators = 1;

从 zabbix6.0.x 升级为 zabbix7.0.0

停止服务,修改配置 docker.yaml 把指定镜像alpine-6.0所有替换为alpine-7.0即可,

如:image: zabbix/zabbix-server-mysql:alpine-6.0-latest 替换为 image: zabbix/zabbix-server-mysql:alpine-7.0-latest

然后启动服务就可以看到日志里有升级信息提示。

zabbix6.0 迁移至新机器并升级为zabbix7.0 步骤

升级前 zabbix6.0.23 LTS (MySQL 8.0.35)

升级后 zabbix7.0.0 LTS (MySQL 8.0.37)

zabbix server初次启动时,会自动升级MySQL数据库结构。

shell 复制代码
启动服务
docker compose up -d

除了msyql服务,其它服务都停止
docker compose stop zabbix-web-nginx-mysql
docker compose stop zabbix-java-gateway 
docker compose stop zabbix-server

进入msyql容器,删除原zabbix数据库。
docker exec -it zabbix-mysql-server-1 bash
mysqlsh -p

因为mysql账号zabbix都在,所以重建库后,就可以开始导入库了
mysql> drop database zabbix;
mysql> create database zabbix character set utf8mb4 collate utf8mb4_bin;

导入前临时更改,导入后改回默认值 0
mysql> set global log_bin_trust_function_creators = 1;

导入备份(视情况选择)
方式1(sql备份文件):
mysql> use zabbix;
mysql> source /var/lib/mysql/zabbix_backup.sql;

方式2(mysql shell备份文件):
MySQL JS > \sql SET GLOBAL local_infile = 'ON';
MySQL JS > \sql show global variables like 'local_infile';
MySQL JS > \sql ALTER INSTANCE DISABLE INNODB REDO_LOG;
MySQL JS > \sql SHOW GLOBAL STATUS LIKE 'Innodb_redo_log_enabled';
MySQL JS > util.loadDump("/data/backup/mysql/zabbix_20240605", {"threads": 4,"ignoreVersion": true})

Disable log_bin_trust_function_creators option after importing database schema.
mysql> set global log_bin_trust_function_creators = 0;

导入完成后,再次停止服务
docker compose down

然后启动(这是启动zabbix server会自动进行升级数据库)
docker compose up -d
参考文档
  1. https://www.zabbix.com/documentation/7.0/en/manual/installation/containers
相关推荐
Bright16684 小时前
centos9安装k8s集群
云原生·容器·kubernetes
!!!5255 小时前
华为云镜像加速器
docker·容器·华为云
xidianjiapei0016 小时前
Kubernetes的Ingress 资源是什么?
云原生·容器·kubernetes
sszdzq7 小时前
Docker
运维·docker·容器
dmy8 小时前
docker 快速构建开发环境
后端·docker·容器
土豆沒加9 小时前
K8S的Dashboard登录及验证
云原生·容器·kubernetes
终端行者11 小时前
kubernetes1.28部署mysql5.7主从同步,使用Nfs制作持久卷存储,适用于centos7/9操作系统,
数据库·容器·kubernetes
2401_8979300611 小时前
linux系统如何配置host.docker.internal
linux·docker·eureka
亲持红叶15 小时前
open-webui安装
docker·open-webui
伪装成塔的小兵16 小时前
Windows使用docker部署fastgpt出现的一些问题
windows·docker·容器·oneapi·fastgpt