Use docker containerization to deploy zabbix server and web server.
1 前言
Zabbix 功能强大、应用广泛,但部署、维护、升级一直是很繁琐的事情,不仅是zabbix组件多,依赖也很多;
现在容器化部署广泛应用,可以大大优化部署架构和提升维护效率,把部署复杂和维护量大的server和前端使用容器部署,与数据库、proxy、agent分离,维护和升级互不影响。
当server和前端出现漏洞、需要升级时,变更docker容器即可。
2 如何做(How)
- 物理主机环境部署数据库(本文使用 mysql 5.7.31),创建数据库和用户;
- 容器部署zabbix server和前端(web server);在 docker hub中找到server和前端镜像(zabbix/zabbix-server-mysql)和(zabbix/zabbix-web-nginx-mysql),zabbix版本:6.4.4。
- 在需要采集数据的节点部署proxy和agent,proxy按需要部署。
3 部署细节(Do)
3.1 数据库部署和配置
数据库部署参考:安装和部署mysql,安装完成后创建zabbix数据库和用户,并授权;
create database zabbix character set utf8mb4 collate utf8mb4_bin;
create user zabbix@'%' identified by 'zabbix';
grant all privileges on zabbix.* to zabbix@'%';
flush privileges;
3.2 部署zabbix server
使用基于centos 的zabbix 6.4.4 版本镜像,拉取zabbix-server-mysql镜像;
[root@lx-sywu ~]# docker pull zabbix/zabbix-server-mysql:centos-6.4.4
centos-6.4.4: Pulling from zabbix/zabbix-server-mysql
4ddc186d6578: Already exists
baab6923c8da: Pull complete
54ac192de6a0: Pull complete
cc799623e812: Pull complete
284d3a354f54: Pull complete
e3c35d5594aa: Pull complete
8ac0e0a7a67f: Pull complete
4f4fb700ef54: Pull complete
8c0dd113966f: Pull complete
Digest: sha256:4cb5ce39d418c99560d87fe5230db3a969f65cf72d9d2759fae97b6777be2c78
Status: Downloaded newer image for zabbix/zabbix-server-mysql:centos-6.4.4
创建容器;
docker create --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="192.168.2.6" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e ZBX_DBTLSCONNECT="required" \
-e ZBX_LISTENPORT="19051" \
-e ZBX_LISTENIP=192.168.1.20 \
-e ZBX_ALLOWUNSUPPORTEDDBVERSIONS=1 \
-p 19051:19051 \
--restart unless-stopped \
--net=host \
--privileged \
zabbix/zabbix-server-mysql:centos-6.4.4
参数名 | 描述 |
---|---|
DB_SERVER_HOST | 数据库服务器地址 |
MYSQL_DATABASE | 数据库名 |
MYSQL_USER | 数据库用户名 |
MYSQL_PASSWORD | 数据库密码 |
ZBX_LISTENPORT | zabbix server监听端口 |
ZBX_LISTENIP | zabbix server监听地址,docker容器宿主机地址 |
ZBX_ALLOWUNSUPPORTEDDBVERSIONS | 由于zabbix 6.0开始最低支持mysql 8.0版本,我用了5.7.31版本不在支持范围,需要设置该参数 |
更多参数参考docker hub上的说明。
由于容器运行会连接数据库检查数据表是否存在,存在则跳过,不存在则自动创建,可能会出现很多异常,容器会停止,再重启又执行相同的操作,非常耗时;我建议创建容器,但先不要运行,从容器中拷贝出创建数据表和数据的脚本手工执行,遇到异常及时解决。 创建数据表和数据的脚本放在/usr/share/doc/zabbix-server-mysql目录下,从容器中拷贝出来,手工在数据库执行脚本;
[root@lx-sywu tmp]# docker cp zabbix-server-mysql:/usr/share/doc/zabbix-server-mysql /tmp
[root@lx-sywu zabbix-server-mysql]# ll /tmp/zabbix-server-mysql/
total 3760
-rw-r--r--. 1 root root 3847548 Jun 27 20:32 create.sql.gz
zcat /tmp/zabbix-server-mysql/create.sql.gz | mysql --default-character-set=utf8mb4 -uzabbix -p zabbix -h 192.168.2.6
数据库执行完脚本,可以查询users表是否有数据来验证;
MySQL [zabbix]> select * from zabbix.users;
+--------+----------+--------+---------------+--------------------------------------------------------------+-----+-----------+------------+---------+---------+---------+----------------+------------+---------------+---------------+----------+--------+-----------------+----------------+
| userid | username | name | surname | passwd | url | autologin | autologout | lang | refresh | theme | attempt_failed | attempt_ip | attempt_clock | rows_per_page | timezone | roleid | userdirectoryid | ts_provisioned |
+--------+----------+--------+---------------+--------------------------------------------------------------+-----+-----------+------------+---------+---------+---------+----------------+------------+---------------+---------------+----------+--------+-----------------+----------------+
| 1 | Admin | Zabbix | Administrator | $2y$10$92nDno4n0Zm7Ej7Jfsz8WukBfgSS/U0QkIuu8WkJPihXBb2A1UrEK | | 1 | 0 | default | 30s | default | 0 | | 0 | 50 | default | 3 | NULL | 0 |
| 2 | guest | | | $2y$10$89otZrRNmde97rIyzclecuk6LwKAsHN0BcvoOKGjbT.BwMBfm7G06 | | 0 | 15m | default | 30s | default | 0 | | 0 | 50 | default | 4 | NULL | 0 |
+--------+----------+--------+---------------+--------------------------------------------------------------+-----+-----------+------------+---------+---------+---------+----------------+------------+---------------+---------------+----------+--------+-----------------+----------------+
2 rows in set (0.00 sec)
最后再启动容器;
docker start zabbix-web-nginx-mysql
** Preparing Zabbix server
** Preparing database
** Using MYSQL_USER variable from ENV
** Using MYSQL_PASSWORD variable from ENV
********************
* DB_SERVER_HOST: 192.168.2.6
* DB_SERVER_PORT: 3306
* DB_SERVER_DBNAME: zabbix
********************
** Database 'zabbix' already exists. Please be careful with database COLLATE!
** Table 'zabbix.dbversion' already exists.
** Preparing Zabbix server configuration file
** Updating '/etc/zabbix/zabbix_server.conf' parameter "ListenIP": '192.168.1.20'...added
** Updating '/etc/zabbix/zabbix_server.conf' parameter "ListenPort": '19051'...added
** Updating '/etc/zabbix/zabbix_server.conf' parameter "ListenBacklog": ''...removed
** Updating '/etc/zabbix/zabbix_server.conf' parameter "SourceIP": ''...removed
** Updating '/etc/zabbix/zabbix_server.conf' parameter "LogType": 'console'...added
** Updating '/etc/zabbix/zabbix_server.conf' parameter "LogFile": ''...removed
** Updating '/etc/zabbix/zabbix_server.conf' parameter "LogFileSize": ''...removed
** Updating '/etc/zabbix/zabbix_server.conf' parameter "PidFile": ''...removed
3.3 部署zabbix web
使用基于centos 的zabbix 6.4.4 版本镜像,拉取zabbix-web-nginx-mysql镜像;
[root@lx-sywu ~]# docker pull zabbix/zabbix-web-nginx-mysql:centos-6.4.4
centos-6.4.4: Pulling from zabbix/zabbix-web-nginx-mysql
4ddc186d6578: Pulling fs layer
4ddc186d6578: Pull complete
6116e8f9d9ab: Pull complete
f98f6ca931f7: Pull complete
fa40cd37a151: Pull complete
4f4fb700ef54: Pull complete
3321fe706fcb: Pull complete
Digest: sha256:d4c07f91f5b1c7b70416be94895fcd8c1b6967062cbbc6699f475ca7d850acab
Status: Downloaded newer image for zabbix/zabbix-web-nginx-mysql:centos-6.4.4
[overview](https://hub.docker.com/r/zabbix/zabbix-web-nginx-mysql)
创建容器;
docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="192.168.1.20" \
-e ZBX_SERVER_PORT="19051" \
-e DB_SERVER_HOST="192.168.2.6" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e ZBX_DBTLSCONNECT="required" \
--net=host \
-p 19080:19080 \
--restart unless-stopped \
--privileged \
-d zabbix/zabbix-web-nginx-mysql:centos-6.4.4
参数名 | 描述 |
---|---|
ZBX_SERVER_HOST | zabbix server服务器地址 |
ZBX_SERVER_PORT | zabbix server端口 |
DB_SERVER_HOST | 数据库服务器地址 |
MYSQL_DATABASE | 数据库名 |
MYSQL_USER | 数据库用户名 |
MYSQL_PASSWORD | 数据库密码 |
更多参数参考docker hub上的说明。这个前端监听端口默认是8080,没有参数配置,需要进入容器后手工修改为自定义的端口。
docker exec -ti zabbix-web-nginx-mysql /bin/bash
vi /etc/zabbix/nginx.conf
listen 19080;
listen [::]:19080;
到此,zabbix server和web server都部署完成了;
[root@lx-sywu ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d707b8517c68 zabbix/zabbix-web-nginx-mysql:centos-6.4.4 "docker-entrypoint.sh" About an hour ago Up About an hour zabbix-web-nginx-mysql
ae453f33177a zabbix/zabbix-server-mysql:centos-6.4.4 "/usr/bin/tini -- /u…" About an hour ago Up About an hour zabbix-server-mysql
打开zabbix web。
在采集数据的节点部署proxy和agent与常规部署相同,参考zabbix agent和zabbix proxy安装文档,此处省略。
4 总结
容器化部署zabbix server和web server需要使用(zabbix-server-mysql)和(zabbix-web-nginx-mysql)镜像,根据需要选择版本,可以在不同的物理机上的docker分别部署这两个镜像,也可以在同一个主机上的docker部署这两个镜像;容器化部署简化了很多工作,也提升了日后管理和维护(漏洞修复、版本升级)效率,最大化的减少了对操作系统和用户的影响。
5 参考资料
https://hub.docker.com/r/zabbix - zabbix in docker hub
https://www.zabbix.com/documentation/6.4/en/manual/concepts/agent - zabbix agent install
https://www.zabbix.com/documentation/6.4/en/manual/concepts/proxy - zabbix proxy install