使用Docker搭建Zookeeper集群
本文参考:https://blog.csdn.net/wu1226419614/article/details/78075898
拉取zookeeper镜像
https://hub.docker.com上面有很多zookeeper镜像,这里采用官方提供的镜像,版本使用3.4
docker pull zookeeper:3.4
下载成功后,查看所有镜像,zookeeper:3.4已经存在
william@zhangshenao ~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE zookeeper 3.4 cfed220ec48b 2 weeks ago 148MB tomcat 7.0.88 6ccc1317fc1d 6 weeks ago 363MB mysql 5.7.22 0d16d0a97dd1 2 months ago 372MB redis 3.2.11 e97b1f10d81a 2 months ago 99.7MB
zookeeper镜像基本使用
william@zhangshenao ~ docker run --name zk01 -d zookeeper:3.4 00030386911e2735087c1bbc223573d81e3aee5ab0222e1da83a40513d78ce97
这个命令会在后台运行一个 zookeeper 容器, 名字是 zk01, 并且它默认会导出 2181 端口。
查看 ZK 的运行情况, 输出类似如下内容时, 表示 ZK 已经成功启动了:
docker logs -f zk01 ZooKeeper JMX enabled by default Using config: /conf/zoo.cfg 2018-07-25 03:34:26,055 [myid:] - INFO [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg 2018-07-25 03:34:26,062 [myid:] - INFO [main:DatadirCleanupManager@78] - autopurge.snapRetainCount set to 3 2018-07-25 03:34:26,062 [myid:] - INFO [main:DatadirCleanupManager@79] - autopurge.purgeInterval set to 0 2018-07-25 03:34:26,062 [myid:] - INFO [main:DatadirCleanupManager@101] - Purge task is not scheduled. 2018-07-25 03:34:26,063 [myid:] - WARN [main:QuorumPeerMain@116] - Either no config or no quorum defined in config, running in standalone mode 2018-07-25 03:34:26,078 [myid:] - INFO [main:QuorumPeerConfig@136] - Reading configuration from: /conf/zoo.cfg 2018-07-25 03:34:26,078 [myid:] - INFO [main:ZooKeeperServerMain@98] - Starting server 2018-07-25 03:34:26,089 [myid:] - INFO [main:Environment@100] - Server environment:zookeeper.version=3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT 2018-07-25 03:34:26,089 [myid:] - INFO [main:Environment@100] - Server environment:host.name=00030386911e 2018-07-25 03:34:26,091 [myid:] - INFO [main:Environment@100] - Server environment:java.version=1.8.0_171 2018-07-25 03:34:26,091 [myid:] - INFO [main:Environment@100] - Server environment:java.vendor=Oracle Corporation 2018-07-25 03:34:26,092 [myid:] - INFO [main:Environment@100] - Server environment:java.home=/usr/lib/jvm/java-1.8-openjdk/jre 2018-07-25 03:34:26,092 [myid:] - INFO [main:Environment@100] - Server environment:java.class.path=/zookeeper-3.4.12/bin/../build/classes:/zookeeper-3.4.12/bin/../build/lib/*.jar:/zookeeper-3.4.12/bin/../lib/slf4j-log4j12-1.7.25.jar:/zookeeper-3.4.12/bin/../lib/slf4j-api-1.7.25.jar:/zookeeper-3.4.12/bin/../lib/netty-3.10.6.Final.jar:/zookeeper-3.4.12/bin/../lib/log4j-1.2.17.jar:/zookeeper-3.4.12/bin/../lib/jline-0.9.94.jar:/zookeeper-3.4.12/bin/../lib/audience-annotations-0.5.0.jar:/zookeeper-3.4.12/bin/../zookeeper-3.4.12.jar:/zookeeper-3.4.12/bin/../src/java/lib/*.jar:/conf: 2018-07-25 03:34:26,092 [myid:] - INFO [main:Environment@100] - Server environment:java.library.path=/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib 2018-07-25 03:34:26,092 [myid:] - INFO [main:Environment@100] - Server environment:java.io.tmpdir=/tmp 2018-07-25 03:34:26,092 [myid:] - INFO [main:Environment@100] - Server environment:java.compiler=<NA> 2018-07-25 03:34:26,094 [myid:] - INFO [main:Environment@100] - Server environment:os.name=Linux 2018-07-25 03:34:26,094 [myid:] - INFO [main:Environment@100] - Server environment:os.arch=amd64 2018-07-25 03:34:26,095 [myid:] - INFO [main:Environment@100] - Server environment:os.version=4.9.87-linuxkit-aufs 2018-07-25 03:34:26,095 [myid:] - INFO [main:Environment@100] - Server environment:user.name=zookeeper 2018-07-25 03:34:26,095 [myid:] - INFO [main:Environment@100] - Server environment:user.home=/home/zookeeper 2018-07-25 03:34:26,096 [myid:] - INFO [main:Environment@100] - Server environment:user.dir=/zookeeper-3.4.12 2018-07-25 03:34:26,111 [myid:] - INFO [main:ZooKeeperServer@835] - tickTime set to 2000 2018-07-25 03:34:26,112 [myid:] - INFO [main:ZooKeeperServer@844] - minSessionTimeout set to -1 2018-07-25 03:34:26,112 [myid:] - INFO [main:ZooKeeperServer@853] - maxSessionTimeout set to -1 2018-07-25 03:34:26,126 [myid:] - INFO [main:ServerCnxnFactory@117] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory 2018-07-25 03:34:26,139 [myid:] - INFO [main:NIOServerCnxnFactory@89] - binding to port 0.0.0.0/0.0.0.0:2181
使用Docker的zookeeper命令行连接zookeeper
因为刚才我们启动的那个zookeeper容器并没有绑定宿主机的端口,因此我们不能直接访问它,但是我们可以通过Docker的link机制来对这个zookeeper容器进行访问。执行如下命令:
docker run -it --rm --link zk01:zookeeper zookeeper zkCli.sh -server zookeeper
如果对 Docker 有过了解的话,那么对上面的命令一定不会陌生了。
这个命令的含义是:- 启动一个zookeeper镜像,并运行这个镜像内的zkCli命令,命令参数是 “-server zookeeper”
- 将我们先前启动的名为zk01的容器连接(link) 到我们新建的这个容器上,并将其主机名命名为 zookeeper
当我们执行了这个命令后, 就可以像正常使用 ZK 命令行客户端一样操作 ZK 服务了。
zookeeper集群的搭建
因为一个一个地启动 ZK 太麻烦了, 所以为了方便起见,我直接使用 docker-compose 来启动 ZK 集群。
首先创建一个名为 docker-compose.yml 的文件, 其内容如下:
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 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量,其中 ZOO_MY_ID 表示 ZK 服务的 id,它是1-255 之间的整数,必须在集群中唯一。ZOO_SERVERS 是ZK 集群的主机列表。
接着我们在docker-compose.yml当前目录下运行:
COMPOSE_PROJECT_NAME=zk_local docker-compose up
即可启动 ZK 集群了。
执行上述命令成功后,接着在另一个终端中运行 docker-compose ps 命令可以查看启动的 ZK 容器:
COMPOSE_PROJECT_NAME=zk_local docker-compose ps Name Command State Ports <hr /> 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 up” 和 “docker-compose ps” 前都添加了 COMPOSE_PROJECT_NAME=zk_test 这个环境变量, 这是为我们的compose工程起一个名字,以免与其他的 compose 混淆。
使用zookeeper客户端连接zookeeper集群
因为我们分别将 zoo1, zoo2, zoo3 的 2181 端口映射到了 本地主机的2181, 2182, 2183 端口上, 因此我们使用如下命令即可连接 ZK 集群了:
zkCli.sh -server localhost:2181,localhost:2182,localhost:2183
查看zookeeper集群状态
我们可以通过 nc 命令连接到指定的 ZK 服务器, 然后发送 stat 可以查看 ZK 服务的状态, 例如:
echo stat | nc 127.0.0.1 2181