docker環境,搭建zookeeper集羣

這篇文章分享如何在docker環境下搭建zookeeper集羣。
bin/jdk:8u221鏡像的構建,請參考以前的文章 -- docker基礎環境搭建docker

下載apache-zookeeper-3.5.7-bin.tar.gz,並構建bin/zookeeper:3.5.7鏡像,Dockerfile以下apache

FROM bin/jdk:8u221

WORKDIR /usr/lib

COPY apache-zookeeper-3.5.7-bin.tar.gz .
RUN tar -xzf apache-zookeeper-3.5.7-bin.tar.gz && rm apache-zookeeper-3.5.7-bin.tar.gz

COPY docker-entrypoint.sh /usr/local/bin
RUN  groupadd -r zookeeper && useradd -r -g zookeeper zookeeper \
&& chmod 777  /usr/local/bin/docker-entrypoint.sh

VOLUME /usr/local/zookeeper/data/

WORKDIR /usr/lib/apache-zookeeper-3.5.7-bin
ENTRYPOINT ["docker-entrypoint.sh"]

docker-entrypoint.sh負責編寫配置文件,啓動zookeeper進程bash

#!/bin/bash

if [ -z "$PORT" ]; then
    PORT=2181
fi

cat>>conf/zoo.cfg<<EOF
tickTime=2000
initLimit=10
syncLimit=5
clientPort=$PORT
dataDir=/usr/local/zookeeper/data
EOF

if [ -n "$SERVER_ID" ]; then
    echo $SERVER_ID >> /usr/local/zookeeper/data/myid
fi    

if [ -n "$SERVER_GROUP" ]; then
    for server in ${SERVER_GROUP[@]}; do
        echo "$server" >>conf/zoo.cfg
    done
fi    

chown -R zookeeper:zookeeper /usr/local/zookeeper/data
exec gosu zookeeper bin/zkServer.sh start-foreground

exec bin/zkServer.sh start-foreground使用前臺進程運行zookeeper,由於Docker容器僅在它的1號進程(PID爲1)運行時,會保持運行。若是1號進程退出了(或者轉爲後臺運行),Docker容器也就退出了。 服務器

zookeeper集羣須要在dataDir目錄下建立myid文件,寫入SERVER_ID,並且須要在配置文件中寫入每一個集羣成員的網絡信息。docker-entrypoint.sh中將SERVER_GROUP變量按空格分割,將分隔後的分割寫入到配置文件中。微信

編寫一個docker-bin.sh,負責啓動docker容器網絡

#!/bin/bash

# 用空格鏈接集羣成員網絡信息
server_group='';
for i in `seq 1 3`; do
    server_group="${server_group}server.${i}=zk-${i}:2281:22281 "
done
# 刪除server_group最後一個空格
server_group=${server_group%?}    

sudo docker network create zk-net
for i in `seq 1 3`; do
    sudo docker run -d --name zk-${i} --network zk-net --network-alias zk-$i \
-e SERVER_ID=$i  -e SERVER_GROUP="$server_group" bin/zookeeper:3.5.7
done

能夠看到,寫入配置文件的集羣成員網絡信息格式以下server.(SERVER_ID)=(IP):(PORT1):(PORT2)
其中第一個端口用來集羣成員之間交換信息以及與Leader 服務器交換信息,第二個端口是在Leader不可用時專門用來選舉新Leader的。spa

經過如下命令查看集羣成員的狀態3d

sudo docker exec zk-1 bin/zkServer.sh  status

若是您以爲本文不錯,歡迎關注個人微信公衆號,您的關注是我堅持的動力!
code

相關文章
相關標籤/搜索