我一向主张原生部署,最后因各种原因,不得不采用此方法曲线救国,在此记录踩过的坑。
使用设备:Macbook Pro 15-inch, 2019
操作系统:macOS Sequoia Beta 15.4
软件版本:Docker Desktop for Mac – Intel Chip Version 4.39.0(18744)
官方的使用手册附上,建议先仔细阅读,养成阅读《说明书》的好习惯
https://www.zabbix.com/documentation/current/zh/manual/installation/containers
其实官方的教程基本讲的很明白了,这里再讲一遍,主要是记录一下踩过的坑。
官方 Zabbix 组建镜像选择,latest,根据官方的描述,基于 Alpine Linux 镜像的最新稳定版 Zabbix 组件。那我们就以这个为例了。
基于我个人的喜好,喜欢在稳定的情况下,追新。根据官方的资料,对 MySQL 8.4.4 作了支持更新,但是保守起见,选择 MySQL 8.0.41;Web Server 一般情况下我会采用 Apache,这里测试就选择 Nginx 好了。
1. 创建专用于 Zabbix 组件容器的网络:
# docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net
2. 启动空的 MySQL 服务器实例:
# docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-d mysql:8.0 \
--restart unless-stopped \
--character-set-server=utf8 --collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password
这里官方的教程有1个坑,以上官方的命令启动会报错,需要将“–restart unless-stopped \”放到“-d mysql:8.0 \”前面,就可以正常启动了,完整命令如下:
# docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
--restart unless-stopped \
-d mysql:8.0 \
--character-set-server=utf8 --collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password
3. 启动 Zabbix Java 网关实例:
# docker run --name zabbix-java-gateway -t \
--network=zabbix-net \
--restart unless-stopped \
-d zabbix/zabbix-java-gateway
4. 启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例:
# docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--network=zabbix-net \
-p 10051:10051 \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql
说明:Zabbix server 实例将 10051/TCP端口(Zabbix trapper)暴露给主机。
5. 启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例:
# docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--network=zabbix-net \
-p 80:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql
说明:Zabbix web 界面实例将 80/TCP 端口(HTTP)暴露给主机。
到此,Zabbix 7.2.4就部署好了,浏览器打开“http://localhost”就可以访问 Zabbix Web 界面,输入默认的用户名“Admin”,密码“zabbix”即可登录。
这里又有1个坑等着大家,有个问题项提示,IP为 127.0.0.1 的主机 Zabbix server 不可用,接口类型是Agent,端口是10050,按照传统的部署,安装 zabbix-agent,这里已经正常的监控到 Zabbix server 自身这台主机了。
大家莫慌,至此,大家已经在 Docker 里启动了4个实例,分别是 mysql-server、zabbix-java-gateway、zabbix-server-mysql、zabbix-web-nginx-mysql,还没有 zabbix-agent,并且此时 127.0.0.1 也只是指 zabbix-web-nginx-mysql 实例,并非 Docker 或者 宿主机。
非强迫症患者可以删除上述主机,开始自己的 Zabbix 体验之旅了。
强迫症患者咱们继续。
6. 启动 Zabbix agent 实例:
# docker run --name zabbix-agent -t \
-e ZBX_HOSTNAME="Zabbix server" \
-e ZBX_SERVER_HOST="172.20.240.0" \
-e ZBX_SERVER_PORT="10051" \
--privileged=true \
--network=zabbix-net \
--restart unless-stopped \
-p 10050:10050 \
-d zabbix/zabbix-agent
说明:–privileged=true \ 使用改参数,container 内的 root 拥有真正的 root 权限,从而获得几乎与主机相同的权限。这意味着容器可以访问和控制主机的所有硬件设备、操作系统内核和其他系统资源。
这里有1个大坑,第二行的参数 “ZBX_HOSTNAME” 的值为 “Zabbix server”,很多人都在这里掉坑了,如果不按照这个设置,zabbix-server-mysql、zabbix-agent 两个实例将会疯狂报错。
还有1个坑,第三行的参数 “ZBX_SERVER_HOST” 的值为 zabbix-server-mysql 的 IP,或者设置为 Zabbix 组件容器网络的【网关】,强烈推荐使用网关,我们这里是 “172.20.240.0”,使用网关的好处是,Docker Desktop 无论怎么重启,都可以正常连接,如果填写 zabbix-server-mysql 的 IP,下次重启 IP 可能就发生变化了,导致无法连接。
最后,回到 Zabbix web 界面,修改主机 Zabbix server 的 IP 地址为 172.20.240.0,更新后不一会,就可以正常连接,至此,问题解决。