前言
在上一讲中我们提到使用docker run命令来依次创建容器,这种方式很简便但不够快捷也无法批量管理容器的变更。所以也算是为了做一个练手的实验吧,这次尝试自己写了一个docker-compose.yml,为以后的k8s集群阶段打基础。
在写的过程中也遇到了几个坑,虽然都是很小的语法问题,但是因为没有明显的报错,自己一个一个排查问题也花了不少时间。
一
第一个问题就是我发现每个version之间对语法的要求不一样,由于我没有看过官方手册所以预先不清楚这一点,3.3是可以使用tab进行缩进的,但是3.9则要求行开头使用空格缩进。
二
第二个问题就是所有容器启动完成之后发现zabbix的server容器和web容器连接不上数据库,我首先的排查思路是看看docker网络是否有问题,使用docker network inspect查看后发现ip是正常分配的,容器内也可以ping通数据库。
遂使用bing搜索后得知可能是mysql版本问题,但是这个版本是经过之前用run创建试验过的,是肯定支持8.0的。
然后我尝试进入mysql容器看看是不是表没有创建正确,使用mysql -u root -p登录却发现密码怎么都不对,这里我们就可以窥见一二了,问题应该是出在密码上。
最后发现问题原来在这…
这一段环境变量参数是不能加引号的,而之前我们使用run命令时是加了引号的,又因为up的时候并没有任何报错,所以导致我第一时间没有注意到是这里有问题。
三
此处还有一个注意的点就是web页面出现系统信息web connection问题,这个问题是由于web容器没有连接到server容器而产生。web的配置文件是直接使用getenv获取环境变量中的HOST和PORT所以我们需要在创建web容器时加上这两个环境变量:
- ZBX_SERVER_HOST=zabbix-server-mysql
- ZBX_SERVER_PORT=10051
tips:此处是提供一个思路,如果不是使用compose安装的也可以通过此思路解决。
version: "3.9"
services:
mysql-server:
image: mysql:8.0
command:
--character-set-server=utf8
--collation-server=utf8_bin
--default-authentication-plugin=mysql_native_password
hostname: mysql-server
environment:
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=zabbix123
volumes:
- mysql-data:/var/lib/mysql
restart: unless-stopped
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:latest
ports:
- 10052:10052
restart: unless-stopped
zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:latest
environment:
- DB_SERVER_HOST=mysql-server
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=zabbix123
- ZBX_JAVAGATEWAY=zabbix-java-gateway
ports:
- 10051:10051
depends_on:
- mysql-server
restart: unless-stopped
zabbix-web-nginx-mysql:
image: zabbix/zabbix-web-nginx-mysql:latest
environment:
- ZBX_SERVER_HOST=zabbix-server-mysql
- ZBX_SERVER_PORT=10051
- DB_SERVER_HOST=mysql-server
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=zabbix123
ports:
- 8080:8080
depends_on:
- mysql-server
restart: unless-stopped
volumes:
mysql-data: {}