一、单节点安装

1、环境部署

docker:18.09.9-ce
zookeeper:3.5.6

2、拉取 zookeeper 镜像

docker pull zookeeper

默认是摘取最新版本 zookeeper:latest。

查看当前镜像

容器化部署zookeeper_zookeeper

3、准备工作

将它部署在 /usr/local/zookeeper 目录下:
cd /usr/local&& mkdir zookeeper && cd zookeeper
创建data目录,用于挂载容器中的数据目录:
mkdir data

容器化部署zookeeper_docker_02

 4、正式部署

# 部署命令:
docker run -d -eTZ="Asia/Shanghai" -p 2181:2181 -v $PWD/data:/data --name zookeeper--restart always zookeeper

# 命令详细说明:
-eTZ="Asia/Shanghai" 	# 指定上海时区 
-d 										# 表示在一直在后台运行容器
-p 2181:2181 					# 对端口进行映射,将本地2181端口映射到容器内部的2181端口
--name 								# 设置创建的容器名称
-v 										# 将本地目录(文件)挂载到容器指定目录
--restartalways 			#始终重新启动zookeeper

# 查看容器启动情况:
docker ps -a
注:状态(STATUS)为Up,说明容器已经启动成功

 5、测试

使用zk命令行客户端连接zk
docker run -it --rm--link zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper
注:-server zookeeper是启动zkCli.sh的参数

6、其它命令

查看zookeeper容器实例进程信息docker top zookeeper
停止zookeeper实例进程docker stop zookeeper
启动zookeeper实例进程docker start zookeeper
重启zookeeper实例进程docker restart zookeeper
查看zookeeper进程日志docker logs -f zookeeper
杀死zookeeper实例进程docker kill -s KILL zookeeper
移除zookeeper实例docker rm -f -v zookeeper

二、集群方式安装

集群方式选择使用docker-compose来完成。

1、安装docker-compose

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

2、 配置docker-compose

编写配置文件,并将其命名为:docker-compose.yml(docker-compose默认配置文件名)
配置文件内容:
version:'2'
services:
    zoo1:
        image: zookeeper
        restart: always
        container_name: zoo1
        ports:
            -"2181:2181"
        environment:
            ZOO_MY_ID: 1
            ZOO_SERVERS:server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo2:
        image: zookeeper
        restart: always
        container_name: zoo2
        ports:
            -"2182:2181"
        environment:
            ZOO_MY_ID: 2
            ZOO_SERVERS:server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            -"2183:2181"
        environment:
            ZOO_MY_ID: 3
            ZOO_SERVERS:server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
此配置文件表示,Docker需要启动三个zookeeper实例,并将2181,2182,2183三个端口号映射到容器内的2181这个端口上。
ZOO_MY_ID:表示zk服务的ID, 取值为1-255之间的整数,且必须唯一
ZOO_SERVERS:表示zk集群的主机列表

3、启动zookeeper集群

docker-compose up -d
该命令执行需要在docker-compose配置文件的目录下执行,结果如下:
docker-compose up -d 
Starting zoo1 ... done
Starting zoo2 ... done
Starting zoo3 ... done

4、查看zookeeper集群实例

# 通过docker ps查看
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
e53b4c838001 zookeeper "/docker-entrypoint.…"4 minutes ago Up 44 seconds 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zoo1
19282fb6f9b4 zookeeper "/docker-entrypoint.…"4 minutes ago Up 44 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp zoo2
099b926fa2d3 zookeeper "/docker-entrypoint.…"4 minutes ago Up 44 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp zoo3

# 通过docker-compose ps查看
Name              Command               State                     Ports                  
------------------------------------------------------------------------------------------
zoo1   /docker-entrypoint.sh zkSe ...   Up     0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp
zoo2   /docker-entrypoint.sh zkSe...   Up      0.0.0.0:2182->2181/tcp, 2888/tcp,3888/tcp
zoo3   /docker-entrypoint.sh zkSe...   Up      0.0.0.0:2183->2181/tcp, 2888/tcp,3888/tcp
注:这个命令需要在docker-compose配置文件下执行

5、管理docker-compose服务

# 停止docker-compose服务
docker-compose stop
 
# 启动docker-compose服务
docker-compose start 

# 重启docker-compose服务
docker-compose restart

6、查看zookeeper集群节点主从关系

使用docker exec -it zoo1 /bin/bash这个命令进入zoo1节点中,之后输入./bin/zkServer.sh statu来查看节点主从关系
docker exec -it zoo1 /bin/bash 
bash-4.4# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower
bash-4.4#

三、脚本安装

1、编写Dockerfile

# Dockerfile
FROM registry.herlly.com/jdk:1.8u162
MAINTAINER herlly 
 
# Install zookeeper
RUN mkdir-v /data/logs && mkdir -pv /data/zookeeper
ADD zookeeper-3.4.11.tar.gz /data/
ADD run.sh /run.sh
RUN chmod+x /run.sh
EXPOSE 2181
EXPOSE 2888
EXPOSE 3888
CMD ["/run.sh"]

# run.sh
#!/bin/bash
ZOO_CFG="/data/zookeeper-3.4.11/conf/zoo.cfg"
 
# Outputserver ID
echo"server id (myid): ${SERVER_ID}"
echo"${SERVER_ID}" > /data/zookeeper/myid
 
# Addadditional ZooKeeper servers into the zoo.cfg file
echo"${ADDITIONAL_ZOOKEEPER_1}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_2}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_3}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_4}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_5}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_6}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_7}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_8}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_9}" >> ${ZOO_CFG}
echo"${ADDITIONAL_ZOOKEEPER_10}" >> ${ZOO_CFG}
 
# StartZookeeper
exec/data/zookeeper-3.4.11/bin/zkServer.sh start-foreground

2、使用方法(集群中各节点需指定不通的name、hostname、SERVER_ID等)

docker run -d --name zk1 --hostname zk1 --network lnso --restart=always -e SERVER_ID=1-e ADDITIONAL_ZOOKEEPER_1=server.1=zk1:2888:3888 -eADDITIONAL_ZOOKEEPER_2=server.2=zk2:2888:3888 -eADDITIONAL_ZOOKEEPER_3=server.3=zk3:2888:3888 registry/zookeeper:3.4.11