以前写的 Zabbix 安装教程,使用编译的方式安装实在太麻烦了,而且不方便更新,正好最近重装了服务器系统,所以采用 Docker 的方式部署 Zabbix + Grafana。我用的是宝塔面板,数据库服务是启在宿主机上的,再起一个 MySQL 容器实在太浪费资源,于是我将基于宿主机的数据库安装 Zabbix。

服务器环境

CentOS 7,宝塔面板

前期准备

  1. 安装好宝塔服务器面板后,需要安装 Docker 运行环境,具体安装方法参考:菜鸟教程

  2. 设置 Docker 开机自启

systemctl start docker
# 设置开机自动启动
systemctl enable docker
  1. 配置 Docker 国内镜像加速
# 编辑 docker 配置文件,没有就新建
vi /etc/docker/daemon.json

# 内容如下
{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

# 重启docker加载配置
systemctl restart docker

安装 Zabbix

这里安装的都是 Zabbix 5.0 LTS 版,我使用的是 centos 容器,根据个人习惯选择即可

  1. 创建 java-gateway 容器,默认 Zabbix 不支持对 java 程序的监控,需要安装 java-gateway 来支持,如果没有需求的话可以不安装
docker run --name zabbix-java-gateway -d -t \
zabbix/zabbix-java-gateway:centos-5.0-latest
  1. 使用 host 模式创建 Zabbix 服务端容器,与宿主机共用一个网络,Zabbix 服务端会自动创建数据库,无需手动创建,因为手动创建大概率会出问题
docker run --name zabbix-server -d -it \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/zabbix/alertscripts:/usr/lib/zabbix/alertscripts \
-v /opt/zabbix/externalscripts:/usr/lib/zabbix/externalscripts \
-e DB_SERVER_HOST="127.0.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="passwd" \
-e MYSQL_ROOT_PASSWORD="rootpasswd" \
zabbix/zabbix-server-mysql:centos-5.0-latest

参数说明:
MYSQL_DATABASE:数据库名称,不存在会自动创建
MYSQL_USER:数据库用户名
MYSQL_PASSWORD:数据库密码
MYSQL_ROOT_PASSWORD:数据库 root 用户密码,这个很重要不要写错

  1. 使用 host 模式创建 Zabbix 前端容器
docker run --name zabbix-web -d -it \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-e DB_SERVER_HOST="127.0.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="passwd" \
-e MYSQL_ROOT_PASSWORD="rootpasswd" \
-e PHP_TZ="Asia/Shanghai" \
zabbix/zabbix-web-nginx-mysql:centos-5.0-latest
  1. 添加 Host 规则,否则会提示 Zabbix Server 未运行
vi /etc/hosts
# 内容如下
127.0.0.1 zabbix-server
  1. 安装 zabbix-agnet,这里我直接在宿主机上安装的
    参考:https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=nginx
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
yum install zabbix-agent -y

# 修改配置文件信息,如果监控本机可以不用修改
vi /etc/zabbix/zabbix_agentd.conf

# 启动并设置开机自启
systemctl enable zabbix-agent
systemctl start zabbix-agent
  1. 浏览器访问 http://ip:8080 即可,默认用户名和密码是:Admin/zabbix,也可以使用 Nginx 反向代理绑定一个域名

优化 Zabbix

  1. 安装 python 环境,很多报警媒介都是用 python 写的,如果你要运行 python 的自定义脚本则需安装 python 环境
# 使用 root用户进入zabbix server 容器
docker exec -it --user root zabbix-server /bin/bash
# 下载依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc* make -y
# 下载 python3 的安装包
yum install wget -y
wget https://www.python.org/ftp/python/3.7.8/Python-3.7.8.tar.xz
tar -Jxvf Python-3.7.8.tar.xz
# 配置安装环境
cd Python-3.7.8
./configure prefix=/usr/local/python3
# 编译安装
make && make install
# 配置软链接(如果已有软链接可以省略)
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
# 添加默认软链接
ln -s /usr/bin/python3 /usr/bin/python
ln -s /usr/bin/pip3 /usr/bin/pip
  1. 绘制图形中文字符乱码,安装中文字体即可解决
# 复制 Windows 中的微软雅黑字体,在 C:\Windows\Fonts 目录,其他字体也可以
# 将字体文件 ttf 复制到容器中
docker cp ~/msyh.ttf zabbix-web:/usr/share/zabbix/assets/fonts/msyh.ttf
# 进入容器,备份原字体文件并替换新字体
docker exec --user root -it zabbix-web /bin/bash
cd /usr/share/zabbix/assets/fonts/
cp DejaVuSans.ttf DejaVuSans.ttf.bak
mv msyh.ttf DejaVuSans.ttf

安装 Grafana

最后怎么能少了酷酷的 Grafana 监控面板呢,这里同样使用 Docker 方式安装,更新时只需要保留容器中的 /var/lib/grafana/ 目录中的内容即可,简单又方便

  1. 使用 host 模式创建 Grafana 容器,默认监听 3000 端口,可以使用 Nginx 反向代理的绑定域名
docker run -d --net=host --restart=always --name=grafana grafana/grafana
  1. 其他配置方法见我以前写的文章:Zabbix + Grafana打造炫酷的服务器监控界面

Docker Compose

以上所有操作可以使用 Docoker Compose 实现

version: '3'
services:

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:alpine-5.0-latest
    container_name: zabbix-web
    hostname: zabbix-web
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - DB_SERVER_HOST=127.0.0.1
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=你的数据库密码
      - MYSQL_ROOT_PASSWORD=你的数据库root密码
    depends_on: 
      - zabbix-server
    network_mode: host

  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-5.0-latest
    container_name: zabbix-server
    hostname: zabbix-server
    restart: always
    environment:
      - TZ=Asia/Shanghai
      - DB_SERVER_HOST=127.0.0.1
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=你的数据库密码
      - MYSQL_ROOT_PASSWORD=你的数据库root密码
    volumes:
      - ./zabbix/alertscripts:/usr/lib/zabbix/alertscripts
      - ./zabbix/externalscripts:/usr/lib/zabbix/externalscripts
    network_mode: host

  grafana:
    image: grafana/grafana
    container_name: grafana
    hostname: grafana
    restart: always
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - zabbix-web
      - zabbix-server
    network_mode: host

# 容器自动更新服务
  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    hostname: watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: -c -s "0 3 * * *"

networks:
  default:
    driver: bridge


Never give up your dreams.