Docker部署zabbix
1. 安装docker
不做阐述,可以查看https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/。
安装完成后记得编辑/etc/docker/daemon.json文件更换国内源并添加重启docker服务不重启容器选项:
{ "registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"], "live-restore": true }
2. zabbix的部署
环境简介
主机 | OS | 服务 | 备注 |
192.168.1.1 | Ubuntu16.04 | docker,mysql,zabbix-server,zabbix-web,zabbix-agent | 使用docker部署zabbix的服务端与web页面,使用宿主机的数据库 |
192.168.1.2 | Ubuntu16.04 | zabbix-agent | agent的容器与非容器部署的选择在文章结尾会阐明 |
3. Mysql数据库
不做阐述,可以选择容器也可以选择宿主机,推荐在开发环境使用容器,正式环境推荐在宿主机上安装,本文中使用的宿主机的Mysql。
4. Zabbix Server
创建一个zabbix-server的目录,在目录下创建Dockerfile文件
FROM zabbix/zabbix-server-mysql:alpine-4.0-latest ENV LANG en_US.utf8 #更改编码 RUN apk add -U tzdata #安装包更改时区 RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo Asia/Shanghai > /etc/timezone \
在这里说明一下引用的镜像的选择。推荐使用Alpine,这是一个面向安全的轻型Linux发行版,Alpine提供了自己的包管理工具apk(等同于 Ubunru 的 apt 或 Centos 的 yum),Alpine Docker镜像也继承了Alpine Linux发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5MB 左右(对比 Ubuntu 系列镜像接近 200MB),目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。镜像版本可以在dockerhub上进行搜索查看
docker build -t zabbix-server:v1.0 . #生成镜像 docker image ls #查看镜像
接下来使用做好的镜像启动为容器,映射端口在宿主机上,并传递一些引用的镜像中定义好的变量。
docker run --name zabbix-server -t \
-p 10051:10051 \
--hostname zabbix-server \
-e DB_SERVER_HOST="172.17.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="password" \
-d zabbix/zabbix-server:v1.0
这里启动传递变量时需要注意一件事!本文中我们使用的是宿主机的数据库,所以数据库的地址我们一定不可以写为127.0.0.1,因为那代表容器本身,但是容器本身你懂的吧,容器里并没有部署数据库,所以我们使用容器的网关地址也就是容器中认为的宿主机的地址。
docker ps docker logs -f zabbix-server
启动过后使用ps查看一下容器的状态,然后新建窗口跟踪服务日志,检查服务的运行。
5. Zabbix Web
同样的,创建一个zabbix-web的目录,在目录下创建一个Dockerfile文件
FROM zabbix/zabbix-web-nginx-mysql:alpine-4.0-latest ENV LANG en_US.utf8 COPY ./SIMKAI.TTF /usr/share/fonts/ttf-dejavu/ #COPY时目标地址是目录必须要以‘/’结尾 RUN apk add -U tzdata RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo Asia/Shanghai > /etc/timezone && \ mv /usr/share/fonts/ttf-dejavu/SIMKAI.TTF /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf \
解释一下需要COPY的这一行,我们在部署完Web页面后默认是英文的,我们可以在Web页面的设置中更改为中文,但是会出现部分乱码,所以我们需要替换一下默认的字体文件。字体的来源我们可以打开自己的 Windows 在 C:\Windows\Fonts 中复制我们想要的字体,并将文件上传至服务器的Dockerfile文件的同目录中,这里选择的字体不一样,文件名自然不一样,将 SIMKAI.TTF 替换为自己的字体文件名即可。
docker build -t zabbix/zabbix-web:v1.0 . docker image ls
docker run --name zabbix-web -t \
-p 9527:80 \
--hostname zabbix-web \
-e PHP_TZ="Asia/Shanghai" \
-e DB_SERVER_HOST="172.17.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="password" \
--link zabbix-server:zabbix-server \
-d zabbix/zabbix-web:v1.0
docker ps
docker logs -f zabbix-web
此处由于我的这台宿主机上已有nginx服务占用了80端口,所以映射在9527,有需要的话再使用宿主机的nginx反代到本机的9527转发即可。
接下来我们便访问 http://192.168.1.1:9527 查看一下我们的web页面,初始用户及密码为:Admin zabbix
进入页面后我们首先更改一下语言,点击右上角的用户图标更改即可。
然后我们需要配置一下自动发现的规则并启用它
自动发现的规则我们配置好了之后还需要制定发现主机后我们应该让它怎么做,所以我们还需要在动作项中右上角事件源选择自动发现,新建一个动作
6. Zabbix Agent
首先添加zabbix的官方源并安装
wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-2+xenial_all.deb dpkg -i zabbix-release_4.0-2+xenial_all.deb apt update apt -y install zabbix-agent
然后修改配置文件/etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid #pid路径 LogFile=/var/log/zabbix/zabbix_agentd.log #日志文件路径 LogFileSize=0 #日志大小,0代表不生产日志,但是我的默认就是0仍然可以看到日志的输出,未解,默认即可,如不输出日志则改为1 Server=172.17.0.3 #服务端的地址 #ServerActive=127.0.0.1 #主动发现,即agent主动收集数据提交给服务端或二级代理,如果你没有配置主动发现,建议关闭。(主动发现 ≠ Web页面配置的自动发现) #Hostname=Zabbix server #建议关闭,启用HostnameItem参数 Include=/etc/zabbix/zabbix_agentd.d/*.conf #延伸配置文件 UnsafeUserParameters=1 #自定义监控,以后一定会用到,提前打开即可
这里我需要解释一下,因为我这是在宿主机的监控,所以填写服务端地址时需要写容器的地址,如果不知道可以使用命令 docker inspect zabbix-server |grep "IPAddress" 查看。其他服务器因为容器已经将端口映射在主机上了,填写宿主机的IP。
启动并跟踪日志输出,查看有无报错信息
service zabbix-agent start
tailf /var/log/zabbix/zabbix_agentd.log
启动后使用docker logs跟踪一下服务端的日志,查看一下网页端的主机,看看是否自动发现了,这个可以自行去测。
最后关于agent为什么不选择容器而选择在宿主机运行:
首先,agent跑在容器中可以不可以,当然可以,但是会产生很多问题,逻辑上容器时和宿主机资源隔离的,agent就是来监视系统资源的,所以agent需要使用特权模式或者挂载宿主机硬盘到容器才能访问到宿主机的资源,还并不是全部的资源。
再一个就是自定义监控,即使你挂载了硬盘到容器,你也绝不可能在容器里看到宿主机的进程,并且自定义监控的脚本需要放到agent容器里,每次新加或修改就要built一下,这是非常繁杂并且无意义的。
所以使用容器来运行agent的方式我们就不多做考虑了。