首页 公告 项目 RSS

使用docker搭建zabbix

April 22, 2018 本文有 2226 个字 需要花费 5 分钟阅读

概述

再次之前我们要知道zabbix的主要架构是怎样的,zabbix有一个server端是最主要的,主要是用来收集agent传来的数据然后进行处理等一系列操作,当然有server端肯定有agent端用来收集数据的,数据为了可以图形化展示给人们看那么就要有一个web端来展示数据和方便人们用来配置zabbix,接着单单一个server端收集数据可能会造成server端的压力过大,所以我们还需要有一个proxy端代替server端去接收数据,来减轻server端的压力,最后一个是数据库,我们要把收集起来的数据存到数据库中,这里我选择的是mysql,总的zabbix分为下面几个模块

  • zabbix-server
  • zabbix-web
  • zabbix-proxy
  • zabbix-agent
  • mysql

知道了这些之后我们就要使用docker镜像去组建这么一个架构,因为我是只用来服务器的,所以proxy就不需要了,选用的zabbix是4.0版本,最后我们需要下面几个docker镜像

docker pull zabbix/zabbix-server-mysql:alpine-trunk
docker pull zabbix/zabbix-web-nginx-mysql:alpine-trunk
docker pull zabbix/zabbix-agent:alpine-trunk
docker pull mysql:5.6

注:上面的所有镜像都是不支持arm架构的,所以如果你要用来监控树莓派,只能在树莓派上去编译agent

实验资源概述

首先我使用的就是一台阿里云的服务器是Ubuntu系统安装了docker

把数据库先跑起来

因为数据库是最最基础的,首先得让它跑起来才可以,不然zabbix的数据都放在哪里?首先在本地创建一个zabbix文件夹,以后容器中的所有数据都保存在里面
mkdir zabbix
之后输入下面命令运行容器
docker run --name zabbix-mysql -d -v /root/zabbix/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD="passwd" mysql:5.6
解释一下上面参数的意思–name就是指定容器的名字,-d就是把容器放在后台运行,-v就是把容器中的/var/lib/mysql目录和宿主机中的/root/zabbix/mysql-data目录做映射,这样容器删除了文件也不会丢失,-e后面指定的环境变量就是设置mysql密码,最后就是要使用的镜像的名字

把服务端zabbix-server跑起来

之后就是zabbix中比较核心的server端了,输入下面命令运行它
docker run --name zabbix-server -p10051:10051 --link zabbix-mysql:mysql -v /root/zabbix/zabbix-server:/var/lib/zabbix -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_USER="root" -e MYSQL_PASSWORD="passwd" -d zabbix/zabbix-server-mysql:alpine-trunk
解释一下参数–name就是给容器取个名字,-p就是把宿主机的10051端口和容器中的10051端口映射起来,–link就是把zabbix容器和mysql容器进行关联,防止ip地址变了连接不上,-v就是把容器中的zabbix-server的主目录和宿主机中的/root/zabbix/zabbix-server做映射,防止丢失非结构化的数据,-e参数就是指定数据库的环境变量,比如数据库的地址,因为我们前面做过和mysql容器的关联,所以只要写MySQL的容器名字就好了,之后就是mysql的账号和密码,-d表示让容器跑在后台,最后就是要使用的镜像的名字
最后不要忘记了,因为用的是阿里云主机对应安全组的10051端口要打开

把服务端的zabbix-web跑起来

server起来了,接下来就是web端了,输入下面的命令把web端跑起来
docker run --name zabbix-web --link zabbix-mysql:mysql -p80:80 -p443:443 --link zabbix-server:zabbix-server -v /usr/share/zabbix -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_USER="root" -e MYSQL_PASSWORD="passwd" -e ZBX_SERVER_HOST="zabbix-server" -e PHP_TZ="Asia/Shanghai" -d zabbix/zabbix-web-nginx-mysql:alpine-trunk
这里我碰到过一个问题,就是我使用-v /zabbix-web:/use/share/zabbix 方式挂载zabbixweb的站点目录的时候,docker自动把容器中的目录/usr/share/zabbix内容全部删除了,我不知道这个是不是镜像的问题,所以导致最后/zabbix-web目录里面也是没有任何东西,但是我使用docker managed volume方式时候,就可以成功搞定,所以我为了解决这个问题就采用了下面的方式,当我使用docker managed volume方式挂载好之后,查看对应的volume目录
docker inspect zabbix-web |grep Source

➜  zabbix docker inspect zabbix-web |grep Source
                "Source": "/var/lib/docker/volumes/2b327a18746700dcfb813b46aefeaddb9e04a526ca575d6a0a68d7097b55b72b/_data",
                "Source": "/var/lib/docker/volumes/57e343972c4eaf4875c5d830fe14d45bd97dbcbc69a105b183617f74916b07aa/_data",

接着把volume中的站点目录复制出来
cp -rf /var/lib/docker/volumes/2b327a18746700dcfb813b46aefeaddb9e04a526ca575d6a0a68d7097b55b72b/_data/ /root/zabbix/zabbix-web
之后删除容器
docker stop zabbix-web
docker rm zabbix-web
删除保留的volume
docker volume prune
之后重新生成容器挂载
docker run --name zabbix-web --link zabbix-mysql:mysql -p80:80 -p443:443 --link zabbix-server:zabbix-server -v /root/zabbix/zabbix-web/:/usr/share/zabbix -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_USER="root" -e MYSQL_PASSWORD="passwd" -e ZBX_SERVER_HOST="zabbix-server" -e PHP_TZ="Asia/Shanghai" -d zabbix/zabbix-web-nginx-mysql:alpine-trunk
接着就搞定了问题
我解释一下参数把–name就是给容器指定名字,–link就是把zabbix-web和数据库还有 zabbix-server连接起来,-p就是端口映射,-v就是挂载主机目录到容器/usr/share/zabbix目录中去,-e后面就是指定数据库主机账号还有密码,还有就是指定zabbix-server的主机还有php时区,-d就是把容器放到后台去跑
之后我们访问zabbix的web界面,浏览器输入服务器ip就可以
默认账号Admin密码zabbix

在服务端把zabbix-agent跑起来

最后就是跑agent了
这个比较简单,运行下面命令
docker run --name zabbix-agent --link zabbix-server:zabbix-server -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="zabbix-server" -d zabbix/zabbix-agent:alpine-trunk
之后重新运行一下zabbix-server
docker run --name zabbix-server -p10051:10051 --link zabbix-mysql:mysql --link zabbix-agent:zabbix-agent -v /root/zabbix/zabbix-server:/var/lib/zabbix -e DB_SERVER_HOST="zabbix-mysql" -e MYSQL_USER="root" -e MYSQL_PASSWORD="passwd" -d zabbix/zabbix-server-mysql:alpine-trunk
我先说明一下为什么要重新运行zabbix-server,因为我添加了–link zabbix-mysql:mysql,这个是为了避免zabbix-agent容器更换ip之后zabbix-server就找不到zabbix-agent的地址了,而我们配置这个agent的时候,在web界面点配置->主机->Zabbix server->agent代理程序的接口这里DNS名称输入zabbix-agent就好了,连接到这里当然要选择DNS地址端口是10050,上面参数命令就不解释了,太简单易懂了
如果发现连接不上的情况,多看看容器的日志,还有就是zabbix的两种检查方式,一个是主动模式,一个是被动模式,如果是监控主机最好使用被动模式

欢迎关注我的博客www.bboy.app
Have Fun