网上有很多介绍 zookeeper 和 kafka 的集群搭建方法,同时官网中也有相应的 zookeeper 和 kafka 的镜像,但是试了很多 zookeeper 和 kafka 分开不同的容器链接的时候总是有这样那样的问题,同时由于我们公司使用 zookeeper 的只是为了 kafka,虚拟机中都是将 kafka 和 zookeeper 放在同一容器中,同时由于版本需要保持一致,故想自己重新定义镜像然后同时开启 3 个容器,每个容器中分别开启 zookeeper 和 kafka 的服务
#使用命令:
docker-compose -f stack.yml up -d
version: '3.1'
services:
zkl_31:
image: zookafka:2.12 #使用的镜像
restart: always
hostname: zkl_31 #设置容器的hostname
container_name: zkl_31 #容器名称,方便在rancher中显示有意义的名称
ports:
- 2184:2184 #将本容器的zookeeper默认端口号映射出去
- 9095:9095 #将kafka的端口号映射出去
environment: #环境变量的一些设置
ZOO_MY_ID: 1 #即是zookeeper的节点值,也是kafka的brokerid值
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zkl_32:2888:3888 server.3=zkl_33:2888:3888 #zookeeper中设置的集群链接地址
> ZK_CONNECT: 192.168.109.102:2184,192.168.109.102:2185,192.168.109.102:2186 #kafka中的链接zookeeper的地址,==标记下个人感觉这个ip地址也可以设置成hostname,目前还没有试试,以后有时间可以试下。==
zkl_32:
image: zookafka:2.12
restart: always
hostname: zkl_32
container_name: zkl_32
ports:
- 2185:2184
- 9096:9095
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zkl_31:2888:3888 server.2=0.0.0.0:2888:38 server.3=zkl_33:2888:3888
ZK_CONNECT: 192.168.109.102:2184,192.168.109.102:2185,192.168.109.102:2186
zkl_33:
image: zookafka:2.12
restart: always
hostname: zkl_33
container_name: zkl_33
ports:
- 2186:2184
- 9097:9095
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zkl_31:2888:3888 server.2=zkl_32:2888:3888 server.3=0.0.0.0:2888:3888
ZK_CONNECT: 192.168.109.102:2184,192.168.109.102:2185,192.168.109.102:2186
#基础镜像使用kinogmt/centos-ssh:6.7,这里面已经装好了ssh,密码是password
FROM 192.168.109.81:5000/centos7.2
#作者
MAINTAINER JUAN.ZI
#定义工作目录
ENV WORK_PATH /usr/local/work
#定义日志目录
ENV LOG_PATH /usr/local/work/logs
#定义zookeeper的Data目录
ENV ZK_DATA_PATH $WORK_PATH/zkdata
#定义jdk1.8的文件夹
ENV JDK_PACKAGE_FILE jdk1.8.0_144
#定义jdk1.8的文件名
ENV JAVA_HOME=$WORK_PATH/jdk1.8.0_71
#定义java环境变量
ENV JAVA_HOME=$WORK_PATH/jdk1.8.0_71
#定义java环境变量
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#创建工作目录
RUN mkdir -p $WORK_PATH
#创建日志目录
RUN mkdir -p $LOG_PATH
#创建zookeeper的Data目录
RUN mkdir -p $ZK_DATA_PATH
#将jdk和kafka添加到容器中
ADD /jdk-tomcat/jdk-8u71-linux-x64.tar.gz /usr/local/work
ADD /jdk-tomcat/kafka_2.12-1.1.0.tar.gz /usr/local/work
COPY run2.sh ${WORK_PATH}
CMD ["/usr/local/work/run2.sh"]
此部分脚本主要功能是:将 compose 中设置的变量内容更新到 zookeeper 和 kafka 的配置文件中,没有研究过 kafka 的 zookeeper 的链接地址要求,感觉此部分可以直接用 hostname 进行连接,以后有时间再试下。另外可能还有更简单的 kafaka 集群配置方法,自己还没找到,先用这种笨方法来做吧。
#!/bin/bash
ZK_HOME="/usr/local/work/kafka_2.12-1.1.0" #设置zookeeper的home路径
ZK_CONF="${ZK_HOME}/config/zookeeper.properties" #设置zookeeper的配置文件路径
ZK_DATA="/usr/local/work/zkdata" #设置zookeeper数据存放路径
ZK_CONF_TXT="tickTime=2000\ninitLimit=10\nsyncLimit=5\ndataDir=${ZK_DATA}\nclientPort=2181" #在zookeeper的配置文件中增加此配置项
#CON_IP=`sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
#echo "ip=${CON_IP}"
echo "zookeeper is start"
#echo "args in compose ${ZK_CONF},${ZOO_MY_ID},${ZOO_SERVERS},${ZK_CONF_TXT}"
echo -e ${ZK_CONF_TXT} >${ZK_CONF}
#将zooserver换行添加到zookeeper的配置文件中
for i in ${ZOO_SERVERS}
do
echo "$i" >>${ZK_CONF}
done
echo "${ZOO_MY_ID}" >${ZK_DATA}/myid
echo "kafka_brokerid=${ZOO_MY_ID},CONNET=${ZK_CONNECT}"
sed -i "s/0/${ZOO_MY_ID}/g" /usr/local/work/kafka_2.12-1.1.0/config/server.properties |grep "broker.id" #设置kafka的brokerid
sed -i "s/localhost:2181/${ZK_CONNECT}/g" /usr/local/work/kafka_2.12-1.1.0/config/server.properties |grep "zookeeper.connect" #设置kafka链接zookeeper的配置
echo `cat /usr/local/work/kafka_2.12-1.1.0/config/server.properties |grep "zookeeper.connect"`
echo "*******************************"
echo `cat /usr/local/work/kafka_2.12-1.1.0/config/server.properties |grep "broker.id"`
#后台启动zookeeper
echo "*******start zookeeper*******"
nohup ${ZK_HOME}/bin/zookeeper-server-start.sh ${ZK_HOME}/config/zookeeper.properties > zookeeper.log &
echo "启动kafka"
/usr/local/work/kafka_2.12-1.1.0/bin/kafka-server-start.sh /usr/local/work/kafka_2.12-1.1.0/config/server.properties