使用 Docker 部署 Zabbix 3.2 记录

Zabbix 搭建文档

概述

计划使用 docker 搭建 Zabbix 监控系统。

安装 Docker

参考 Ubuntu、Debian 系列安装 Docker

部署 Mariadb-Server

一、建立数据库本地目录

1
2
mkdir -p ~/zabbix/database/mysql
mkdir ~/zabbix/database/conf.d

二、运行 Mariadb-Server Docker

1
2
3
4
5
6
7
8
9
docker run --name zabbix-db \
--restart=always \
-e MYSQL_ROOT_PASSWORD='mysql_root_password' \
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
-v /home/nero/zabbix/database/mysql:/var/lib/mysql \
-v /home/nero/zabbix/database/conf.d:/etc/mysql/conf.d \
-d mariadb

这里会产生一个问题,由于默认的 mariadb 是使用latin1字符集来创建数据库,这时候我们在 Zabbix 录入中文字符的时候会导致出错,故此需要进入 mariadb-docker 内删除新建好的zabbix数据库,再使用utf8新建数据库。

1
2
3
$ docker exec -it zabbix-db mysql -uroot -p'mysql_root_password'
MariaDB [(none)]> drop database zabbix;
MariaDB [(none)]> create database zabbix default charset utf8;

此时,数据库已经以 utf8 新建好了。

1
2
3
4
5
6
7
8
9
MariaDB [(none)]> show create database zabbix;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| zabbix | CREATE DATABASE `zabbix` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.01 sec)
MariaDB [(none)]>quit

2017年07月15日更新
怪自己看文档不仔细,今天扒 zabbix 的部署文档发现,我应该运行 mariadb 容器的时候就要定义数据库字符编码。
Zabbix Documentation 3.2-5 Installation from containers

注意,这里我是使用 mariadb,和 zabbix 官方文档使用是 mysql 的 docker,参数会有所不同。

1
2
3
4
5
6
7
8
9
docker run --name zabbix-db \
--restart=always \
-e MYSQL_ROOT_PASSWORD='mysql_root_password' \
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
-v /home/nero/zabbix/database/mysql:/var/lib/mysql \
-v /home/nero/zabbix/database/conf.d:/etc/mysql/conf.d \
-d mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

部署 Zabbix-Server-MySQL Docker

1
2
3
4
5
6
7
docker run --name zabbix-server \
--link zabbix-db:mysql-server \
--restart=always \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql

部署 Zabbix-WEB-nginx-MySQL Docerk

由于 Zabbix 图形字体中文显示会产生乱码,故此需要将中文字体放入 Zabbix 的 WEB 目录中,并修改一个 php 文件才可以修正中文乱码问题。

一、下载官方 zabbix-web-nginx-mysql 镜像

docker pull zabbix-web-nginx-mysql

二、上传中文字体 simhei.ttf(本例使用黑体字体)

1
2
mkdir ~/zabbix-web-docker-cn
rz #使用 rz 命令传输文件,如何传输本文档不体现

三、编写 Dockerfile 文件

1
2
3
4
5
6
7
8
9
cat <<EOF | tee ~/zabbix-web-docker-cn/Dockerfile
FROM zabbix/zabbix-web-nginx-mysql
COPY simhei.ttf /usr/share/zabbix/fonts
EXPOSE 80/TCP 443/TCP
WORKDIR /usr/share/zabbix
RUN sed -i 's/graphfont/simhei/g' ./include/defines.inc.php
VOLUME ["/etc/ssl/nginx"]
CMD ["/run_zabbix_component.sh", "frontend", "mysql", "nginx"]
EOF

四、构建镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker build -t nero/zabbix-web-nginx-mysql .
Sending build context to Docker daemon 9.755MB
Step 1/7 : FROM zabbix/zabbix-web-nginx-mysql
---- 256dc87663d0
Step 2/7 : COPY simhei.ttf /usr/share/zabbix/fonts
---- 5743f1ab270b
Removing intermediate container 78381e68fbbe
Step 3/7 : EXPOSE 80/TCP 443/TCP
---- Running in 0c6786e828fc
---- d24d892858a6
Removing intermediate container 0c6786e828fc
Step 4/7 : WORKDIR /usr/share/zabbix
---- dc7c79f00b1c
Removing intermediate container e6975c59dbc8
Step 5/7 : RUN sed -i 's/graphfont/simhei/g' ./include/defines.inc.php
---- Running in 27e5405d3ca7
---- 6ca4c53d4b51
Removing intermediate container 27e5405d3ca7
Step 6/7 : VOLUME /etc/ssl/nginx
---- Running in 8f28060ed68e
---- 2b4307bc9c9a
Removing intermediate container 8f28060ed68e
Step 7/7 : CMD /run_zabbix_component.sh frontend mysql nginx
---- Running in 184feb09f237
---- b6da55ae29b6
Removing intermediate container 184feb09f237
Successfully built b6da55ae29b6
Successfully tagged nero/zabbix-web-nginx-mysql:latest

五、运行镜像

1
2
3
4
5
6
7
8
9
10
docker run --name zabbix-web \
--link zabbix-db:mysql-server \
--link zabbix-server:zabbix-server \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=zabbix \
-e PHP_TZ='Asia/Hong_Kong' \
-e ZBX_SERVER_NAME='Rslnc monit Server' \
-p 80:80 \
--restart=always \
-d nero/zabbix-web-nginx-mysql

遇到的坑

数据库编码格式导致中文输入字符无法保存

由于之前使用的 docker 创建的 zabbix 数据库默认是以latin1字符编码创建的,故此在问题输入『消息』的时候会报字符编码错误。

那么数据库里面已经有原始数据存在,所以我需要将数据导出,再将数据转换成utf8编码。

参考:# MySQL数据库从GBK转换到UTF-8最简单解决方案(也适用于其它编码转换)

1
2
3
4
5
6
7
8
9
10
11
12
$ docker exec -it zabbix-db bash
# mysqldump -d -u root -p'mysql_root_password' zabbix > /etc/mysql/conf.d/zabbix.sql
# mysqldump --default-character-set=utf8 -t -u root -p'mysql_root_password' zabbix > /etc/mysql/conf.d/zabbix-data.sql
# sed -i 's/latin1/utf8/g' /etc/mysql/conf.d/zabbix.sql
# mysql -uroot -p'mysql_root_password'
MariaDB [(none)]> drop database zabbix;
MariaDB [(none)]> create database zabbix default charset utf8;
MariaDB [(none)]> use zabbix;
MariaDB [zabbix]> source /etc/mysql/conf.d/zabbix.sql
MariaDB [zabbix]> source /etc/mysql/conf.d/zabbix-data.sql
MariaDB [zabbix]> quit
# exit