一、使用docker-compose.yml文件启动Zabbix server、Zabbix web及Mysql

1、目录结构

zabbix-docker/
├── docker-compose.yml
├── .env
├── mysql-init/
│   └── 00-alter_charset.sql
└── server/
    ├── Dockerfile
    └── sources.list
    └── python-scripts/
        └── alert_sms.py


mysql-init/00-alter_charset.sql:在 MySQL 容器首次启动时执行的脚本,用于将 zabbix 数据库设为 utf8mb4_bin
zabbix.com
。

server/Dockerfile:在官方 zabbix-server-mysql 镜像基础上安装 Python 3,以支持自定义脚本。

.env:存放数据库密码、时区、Web 端口等环境变量。

2、编写mysql-init/00-alter_charset.sql

ALTER DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

 此脚本会在 MySQL 容器初始化时执行,保证之后由 Zabbix Server 导入的表全部继承 utf8mb4_bin

3、编写server/Dockerfile

# 使用官方 Zabbix Server 镜像作为基础镜像,基于 Ubuntu 系统,版本为 6.0
FROM zabbix/zabbix-server-mysql:ubuntu-6.0-latest

# 切换为 root 用户以便安装系统软件包
USER root

# 替换 apt 源为阿里云镜像,加快国内构建速度并避免网络超时问题
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse\n\
deb http://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse" > /etc/apt/sources.list && \
    apt-get clean && \                          # 清理旧缓存
    apt-get update && \                         # 更新 apt 索引
    DEBIAN_FRONTEND=noninteractive \            # 避免安装过程中出现交互提示
    apt-get install -y \                        # 安装必要的软件包
        python3-pip \                           # Python 的包管理器
        python3-requests \                      # requests HTTP 库
        vim && \                                # 安装 vim 编辑器
    rm -rf /var/lib/apt/lists/*                 # 安装完后清理 apt 缓存,减少镜像大小

# 将本地 python 脚本复制到容器内指定目录
COPY python-scripts/ /usr/local/bin/python-scripts/

# 赋予这些脚本可执行权限
RUN chmod -R +x /usr/local/bin/python-scripts/

# 切换回 zabbix 用户,确保容器内服务以非 root 用户运行,更安全
USER zabbix
  • python3-pippython3-requests 都由 APT 提供,符合 Debian 包管理流程,不触发 PEP 668 Ask UbuntuPi My Life Up

  • 安装 vim 也是同理,通过 APT 安装,不需额外配置虚拟环境 Baeldung

4、编写docker-compose.yml

services:
  # MySQL 数据库服务
  mysql-server:
    image: mysql:8.0  # 使用官方 MySQL 8.0 镜像
    container_name: zabbix-mysql  # 容器名称
    env_file: .env  # 从 .env 文件加载环境变量
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}  # 数据库 root 密码
      - MYSQL_DATABASE=${MYSQL_DATABASE}  # 初始化的数据库名
      - MYSQL_USER=${MYSQL_USER}  # 普通用户
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}  # 普通用户密码
      - LANG=C.UTF-8  # 设置语言
      - TZ=Asia/Shanghai  # 设置时区为上海
    command:
      - --character-set-server=utf8mb4  # 设置默认字符集为 utf8mb4
      - --collation-server=utf8mb4_bin  # 设置字符序为 utf8mb4_bin(区分大小写)
      - --skip-character-set-client-handshake  # 忽略客户端字符集设置,强制使用服务器端字符集
    volumes:
      - zbx_mysql_data:/var/lib/mysql  # 数据持久化存储路径
      - ./mysql-init/00-alter_charset.sql:/docker-entrypoint-initdb.d/00-alter_charset.sql:ro  # 初始化 SQL 脚本,设置数据库字符集
    ports:
      - "3306:3306"  # 暴露 MySQL 端口
    restart: unless-stopped  # 容器异常退出时自动重启
    networks:
      - zbx-net  # 加入名为 zbx-net 的自定义网络

  # Zabbix 服务器服务
  zabbix-server:
    build:
      context: ./server  # Dockerfile 构建上下文目录
      dockerfile: Dockerfile  # 使用自定义 Dockerfile
    container_name: zabbix-server  # 容器名称
    depends_on:
      - mysql-server  # 启动顺序依赖 MySQL
    env_file: .env  # 从 .env 文件加载环境变量
    environment:
      - DB_SERVER_HOST=mysql-server  # 指定数据库主机地址
      - MYSQL_DATABASE=${MYSQL_DATABASE}  # 数据库名
      - MYSQL_USER=${MYSQL_USER}  # 用户名
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}  # 密码
      - ZBX_JAVAGATEWAY=  # 不启用 Java 网关(留空)
      - TZ=Asia/Shanghai  # 设置时区
    ports:
      - "10051:10051"  # Zabbix 服务监听端口
    volumes:
      - zbx_server_data:/var/lib/zabbix  # 数据持久化路径
    restart: unless-stopped  # 自动重启策略
    networks:
      - zbx-net  # 加入自定义网络

  # Zabbix Web 前端服务
  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.0-latest  # 官方 Web 前端镜像(基于 nginx 和 MySQL)
    container_name: zabbix-web  # 容器名称
    depends_on:
      - zabbix-server  # 启动依赖 Zabbix Server
      - mysql-server  # 启动依赖 MySQL
    env_file: .env  # 加载环境变量
    environment:
      - DB_SERVER_HOST=mysql-server  # 数据库地址
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - ZBX_SERVER_HOST=zabbix-server  # Zabbix Server 地址
      - PHP_TZ=Asia/Shanghai  # 设置 PHP 时区
    ports:
      - "${ZABBIX_FRONTEND_PORT}:8080"  # 暴露 Web 前端端口,支持自定义
    volumes:
      - zbx_web_data:/var/lib/zabbix-web  # 前端持久化数据存储
      - /etc/localtime:/etc/localtime:ro  # 保证容器时间与宿主机一致
      - /etc/timezone:/etc/timezone:ro
    restart: unless-stopped
    networks:
      - zbx-net  # 加入统一网络

# 定义数据卷(用于持久化存储)
volumes:
  zbx_mysql_data:
  zbx_server_data:
  zbx_web_data:

# 定义自定义网络
networks:
  zbx-net:
    driver: bridge  # 使用 bridge 网络驱动
  • MySQL command 选项确保新建表直接使用 utf8mb4_bin 校对,避免 Web 端再次报错 Built InDiscussions on Python.org

  • /docker-entrypoint-initdb.d/00-alter_charset.sql 会在初始化时执行,对现有数据库做一次性转换 Stack Overflow

  • Zabbix Server 服务构建时已带上 Python 3、pip、requests 和 vim,满足脚本编写与调试需求。

5、编写.env

# .env
MYSQL_ROOT_PASSWORD=Zabbixroot
MYSQL_DATABASE=zabbix
MYSQL_USER=zabbix
MYSQL_PASSWORD=zabbix
PHP_TZ=Asia/Shanghai
ZABBIX_FRONTEND_PORT=8080

6、#启动容器

构建 zabbix-server:
docker-compose build zabbix-server

启动全部服务:
docker compose up -d

# 查看容器状态
docker ps


# 在浏览器访问 Web
open http://<服务器IP>:${ZABBIX_FRONTEND_PORT}/


7、访问Zabbix Web

  • 打开浏览器访问 http://<Ubuntu服务器IP>
  • 默认登录账号:Admin,密码:zabbix

8、报错

等十几分钟自然就好了

9、修改中文

二、设置钉钉告警

1、在三个人以上的钉钉群聊加入机器人,复制webhook地址

 2、使用root进入容器

docker exec -it -u root 5f556bfe5f3d  /bin/bash

4、编写钉钉机器人脚本

vim /usr/lib/zabbix/alertscripts/dingalert.py
#!/usr/bin/env python3
 
import json
import requests
import sys
 
def send_msg(url, remiders, msg):
    headers = {'Content-Type': 'application/json; charset=utf-8'}
    data = {
        "msgtype": "text",
        "at": {
            "atMobiles": remiders,
            "isAtAll": False,
        },
        "text": {
            "content": msg,
        }
    }
    r = requests.post(url, data=json.dumps(data), headers=headers)
    return r.text
 
if __name__ == '__main__':
    msg = sys.argv[1]
    remiders = []
    url = '钉钉机器人Webhook地址'  # 注意此处需输入机器人的webhook地址
    print(send_msg(url, remiders, msg))

5、加可执行权限

chmod +x /usr/lib/zabbix/alertscripts/dingding.py

 6、测试

sudo /usr/lib/zabbix/alertscripts/dingding.py '告警: 测试消息'


答复下文及钉钉机器人发信息为正常:
{"errcode":0,"errmsg":"ok"}

7、Zabbix web内设置

点开第一个媒介

 

三、设置邮件告警 

三、启动防火墙

sudo ufw enable

8、允许基础服务端口

# 允许SSH远程连接(避免被防火墙锁在外面)
sudo ufw allow 22/tcp

# 允许HTTP/HTTPS访问(如果Zabbix Web部署在宿主机)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

9、允许核心端口

# 允许Docker容器间通信(需确保Docker网络已配置)
sudo ufw allow in on docker0  # 放行Docker内部流量
sudo ufw allow out on docker0 # 放行Docker外部流量

# 如果需要从宿主机直接访问Zabbix Server容器端口
sudo ufw allow 10051/tcp

10、验证防火墙规则

sudo ufw status numbered

输入应包含类似一下规则
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 10051/tcp                  ALLOW IN    Anywhere
[ 5] 3306/tcp                   ALLOW IN    Anywhere
[ 6] Anywhere on docker0        ALLOW IN    Anywhere
[ 7] Anywhere                   ALLOW OUT   Anywhere on docker0        (out)
[ 8] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 9] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[10] 443/tcp (v6)               ALLOW IN    Anywhere (v6)
[11] 10051/tcp (v6)             ALLOW IN    Anywhere (v6)
[12] 3306/tcp (v6)              ALLOW IN    Anywhere (v6)
[13] Anywhere (v6) on docker0   ALLOW IN    Anywhere (v6)
[14] Anywhere (v6)              ALLOW OUT   Anywhere (v6) on docker0   (out)

致谢

zabbix添加钉钉机器人报警_zabbix对接钉钉-CSDN博客

ChatGPT

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐