目前我需要一个zabbix的测试环境,这次我打算让zabbix建立在容器上。首先你的系统上得有docker,这个不解释了。

参考文档:https://www.zabbix.com/documentation/4.0/zh/manual/installation/containers

容器版的zabbix需要以下几个容器组件:mysql zabbix-java-gateway zabbix-server-mysql zabbix-nginx
数据库当然可以有很多种选择,不过官方的教程里使用的是mysql。

部署也有几种方法,其中一种是一个容器里包含了所有的组件,只要运行一个容器就可以了。还有一种是组件统统为独立的容器,然后将它们用--link命令将它们联系起来。我是用的第二种。

命令只有四条,分别启动四个容器。如果电脑中没有这四个容器会自动下载它们。

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" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin

docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest

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" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest

docker run --name zabbix-web-nginx-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" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

其中MYSQL_PASSWORD和MYSQL_ROOT_PASSWORD是可以根据需要变动的,不过所有的容器密码都得保持一致,否则页面不能被打开。
四个命令打完,zabbix就可以访问了。默认账户和密码是Admin和zabbix。
由于不太熟悉docker所以犯了小错误。以下记录一下
首先,网页访问不了先检查password是否填的一样,除了zabbix-java-gateway之外,其他都需要同样的密码。
再次检查防火墙和selinux,将它们关闭或者放行(测试环境中关闭。)

错误:
docker: Error response from daemon: Conflict. The container name "/zabbix-server-mysql" is already in use by container "9fc185bad94200043400345dfc9e8b2c41e198bae4e0c911744c3e1b47e64503". You have to remove (or rename) that container to be able to reuse that name.

第一次运行上面的命令之后,即使关闭了容器,如果要再次运行命令,也需要将之前的容器删除,才能建立名字和之前相同的容器。

docker ps -a

docker stop  [  ...]
docker rm  [  ...]

其中contianer.name从docker ps -a命令中获取,一定要-a参数,否则停止的容器是不显示的。

错误:
docker: Error response from daemon: driver failed programming external connectivity on endpoint zabbix-server-mysql (3149119198cc0398bf7df82e406938a97dd63afdcda6ec8d0467487e14b3046f): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 10051 -j DNAT --to-destination 172.17.0.4:10051 ! -i docker0: iptables: No chain/target/match by that name.

产生的原因是运行这条命令之前已经运行了映射目标端口的命令,网上说解决方法是重启docker服务?虽然有效,但是我觉得太不靠谱了,如果有容器运行着,也重启吗?

就目前而言,zabbix已经运行了。zabbix-agent我不打算运行在容器里。作为快速生成的测试环境我觉得够了,不过我觉得官网的代码只不过是一种演示,mysql容器要是关掉了,或者挂掉了,那不是所有的数据都没了?