Docker创建Zookeeper集群教程版

  • 68

Docker创建Zookeeper集群

docker官方下载Zookeeper镜像文件

//pull最新zk
docker pull zookeeper

Using default tag: latest
latest: Pulling from library/zookeeper
fc7181108d40: Already exists
73f08ce352c8: Pull complete
eac271a34b40: Pull complete
9ba0eff26192: Pull complete
ac4c9fe65e23: Pull complete
18a36aec0f39: Pull complete
bba2d87ab531: Pull complete
f75afd732baa: Pull complete
Digest: sha256:6e6efbba52ffe5f85358db96a0088a43b582c94f2e5703a0462a10aeeab38667
Status: Downloaded newer image for zookeeper:latest

出现上述镜像信息,表明zookeeper镜像文件拉取成功

docker查看Zookeeper镜像

//images查看镜像
docker images
zookeeper           latest         215d317d188b        4 weeks ago         211 MB

docker启动Zookeeper镜像

//run docker容器命令
//--name 容器名称
//-d 设置镜像名称或者镜像id
docker run --name zk001 -d 215
//或者直接映射 指定端口号 --publish等同于-p
docker run --privileged=true -d --name zookeeper --publish 2181:2181  -d zookeeper:latest
//docker查看容器运行日志
docker logs -f zk001
//出现以下日志信息,表明Zookeeper容器运行成功,默认端口号2181
2019-07-10 07:07:02,972 [myid:1] - INFO  [main:DefaultSessionIdManager@365] - DefaultSessionIdManager workerName=node0
2019-07-10 07:07:02,974 [myid:1] - INFO  [main:DefaultSessionIdManager@370] - No SessionScavenger set, using defaults
2019-07-10 07:07:02,980 [myid:1] - INFO  [main:HouseKeeper@149] - node0 Scavenging every 600000ms
2019-07-10 07:07:03,003 [myid:1] - INFO  [main:ContextHandler@855] - Started o.e.j.s.ServletContextHandler@cb644e{/,null,AVAILABLE}
2019-07-10 07:07:03,033 [myid:1] - INFO  [main:AbstractConnector@292] - Started ServerConnector@100fc185{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2019-07-10 07:07:03,033 [myid:1] - INFO  [main:Server@410] - Started @1304ms
2019-07-10 07:07:03,034 [myid:1] - INFO  [main:JettyAdminServer@112] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
2019-07-10 07:07:03,048 [myid:1] - INFO  [main:ServerCnxnFactory@135] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2019-07-10 07:07:03,061 [myid:1] - INFO  [main:NIOServerCnxnFactory@673] - Configuring NIO connection handler with 10s sessionless connection timeout, 1 selector thread(s), 4 worker threads, and 64 kB direct buffers.
2019-07-10 07:07:03,066 [myid:1] - INFO  [main:NIOServerCnxnFactory@686] - binding to port /0.0.0.0:2181
2019-07-10 07:07:03,107 [myid:1] - INFO  [main:ZKDatabase@117] - zookeeper.snapshotSizeFactor = 0.33
2019-07-10 07:07:03,115 [myid:1] - INFO  [main:FileTxnSnapLog@372] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-10 07:07:03,120 [myid:1] - INFO  [main:FileTxnSnapLog@372] - Snapshotting: 0x0 to /data/version-2/snapshot.0
2019-07-10 07:07:03,149 [myid:1] - INFO  [main:ContainerManager@64] - Using checkIntervalMs=60000 maxPerMinute=10000
//docker 查看容器启动列表
docker ps
//zookeeper 容器信息
//端口号
//2181 对客户端提供服务
//2888 集群内机器通讯使用(Leader监听此端口)
//3888 选举leader使用
//8080 Zookeeper AdminServer端口
0c52cfd70e7b        215        "/docker-entrypoint.s"   6 seconds ago       Up 4 seconds        2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp   zk001

docker进入zookeeper服务操作

上述docker run --name zk001 -d 215d 命令只是创建一个zookeeper实例容器,但是并没有进入zookeeper服务中,使用以下命令即可以进入zookeeper服务进行实践操作。

//run docker启动命令
//-it 使用交互模式
//--rm run命令中使用--rm命令表示容器退出时自动移除
//--link 添加到另一个容器的链接 这里表示重新创建的zookeeper容器链接到zk001容器中
//215d zookeeper镜像id
//zkCli.sh -sercer zookeeper 启动zookeeper客户端命令 参数为“-server zookeeper”
docker run -it --rm --link zk001:zookeeper 215 zkCli.sh -server zookeeper
//如果出现以下日志信息,表示docker启动zookeeper容器成功,就可以使用zookeeper命令进行操作服务了
Welcome to ZooKeeper!
JLine support is enabled
2019-07-10 07:41:30,160 [myid:zookeeper:2181] - INFO  [main-SendThread(zookeeper:2181):ClientCnxn$SendThread@1112] - Opening socket connection to server zookeeper/172.17.0.2:2181. Will not attempt to authenticate using SASL (unknown error)
2019-07-10 07:41:30,275 [myid:zookeeper:2181] - INFO  [main-SendThread(zookeeper:2181):ClientCnxn$SendThread@959] - Socket connection established, initiating session, client: /172.17.0.3:53328, server: zookeeper/172.17.0.2:2181
2019-07-10 07:41:30,305 [myid:zookeeper:2181] - INFO  [main-SendThread(zookeeper:2181):ClientCnxn$SendThread@1394] - Session establishment complete on server zookeeper/172.17.0.2:2181, sessionid = 0x10001249ca20003, negotiated timeout = 30000

[zk: zookeeper(CONNECTED) 0] ls /
[zookeeper]
[zk: zookeeper(CONNECTED) 1]

至此,docker部署单机zookeeper服务实例就已经完成了。

docker部署zookeeper集群

此处使用docker的三剑客之一docker-compose,即docker官方编排项目之一,负责快速的部署分布式应用,由于此处我们需要部署三个Zookeeper实例,docker-compose可以满足服务快速编排。

使用docker-compose之前,先查看系统中是否安装了docker-compose,如果未安装可自行google

//查看docker-compose版本信息
docker-compose --version
docker-compose version 1.8.1, build 878cff1

docker-compose是使用.yml模板文件来做容器编排,它是将一些列应用容器实例组成一个完整的业务单元进行管理。比如:我们需要创建一个zookeeper集群,可以使用一个docker-compose工程进行管理,不用手动去启动n个zk实例,这样既方便统一管理也可以提高工作效率。

此处搭建集群的镜像,下载上述的zookeeper新版本,集群安装一直不成功,所以我下载的是国内阿里云提供的zk镜像。如下:

//拉取镜像
docker pull registry.aliyuncs.com/denverdino/zookeeper
//查看镜像
docker images
registry.aliyuncs.com/denverdino/zookeeper   3.4.8         6c7fd7d20260        2 years ago         155 MB

docker-compose模板文件

//版本信息
version: '3.0'
//实例服务
services:
    zoo1:
        //镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。6c7fd7d20260为上述下载的阿里云镜像
        image: 6c7fd7d20260
        //指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
        restart: always
        //容器名称
        container_name: zoo1
        //暴露端口信息 使用宿主端口:容器端口 (HOST:CONTAINER) 格式
        ports:
            - "2181:2181"
        //设置环境变量
        environment:
            //zk_id
            SERVER_ID: 1
            //zk服务配置信息
            ADDITIONAL_ZOOKEEPER_1: server.1=zoo1:2888:3888
            ADDITIONAL_ZOOKEEPER_2: server.2=zoo2:2888:3888
            ADDITIONAL_ZOOKEEPER_3: server.3=zoo3:2888:3888

    zoo2:
        image: 6c7fd7d20260
        restart: always
        container_name: zoo2
        ports:
            - "2182:2181"
        environment:
            SERVER_ID: 2
            ADDITIONAL_ZOOKEEPER_1: server.1=zoo1:2888:3888
            ADDITIONAL_ZOOKEEPER_2: server.2=zoo2:2888:3888
            ADDITIONAL_ZOOKEEPER_3: server.3=zoo3:2888:3888
    zoo3:
        image: zookeeper
        restart: always
        container_name: zoo3
        ports:
            - "2183:2181"
        environment:
           SERVER_ID: 3
            ADDITIONAL_ZOOKEEPER_1: server.1=zoo1:2888:3888
            ADDITIONAL_ZOOKEEPER_2: server.2=zoo2:2888:3888
            ADDITIONAL_ZOOKEEPER_3: server.3=zoo3:2888:3888

docker-compose up 创建zookeeper集群

进入本地创建好的docker-compose.yml目录下,执行下面的命令

//docker-compose up 启动命令,如果加-d参数是在后台启动并运行所有容器,不加-d将在前台启动,控制台会输出日志。
docker-compose up

Creating network "zk_default" with the default driver
Creating zk001
Creating zk002
Creating zk003
//查看zk集群运行状态
docker-compose ps

Name               Command               State                          Ports
-----------------------------------------------------------------------------------------------------
zoo1   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
zoo2   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
zoo3   /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp

使用nc命令查看各个zk服务的状态

查看zoo1的服务 从节点

//nc命令
echo stat|nc 127.0.0.1 2181
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
 /172.20.0.1:51670[0](queued=0,recved=1,sent=0)

Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: follower
Node count: 4

查看zoo2服务 主节点

//nc命令
echo stat|nc 127.0.0.1 2182
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
 /172.20.0.1:50000[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 2/7/10
Received: 4
Sent: 3
Connections: 1
Outstanding: 0
Zxid: 0x100000007
Mode: leader
Node count: 5

查看zoo3服务 从节点

//nc命令
echo stat|nc 127.0.0.1 2183
Zookeeper version: 3.4.8--1, built on 02/06/2016 03:18 GMT
Clients:
 /172.20.0.1:38216[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/4/10
Received: 6
Sent: 5
Connections: 1
Outstanding: 0
Zxid: 0x100000007
Mode: follower
Node count: 5

docker 命令进入zk服务容器验证

进入zoo1容器中

//docker执行进入容器
docker exec -it zoo1 bash
//使用zkServer.sh查询服务状态
bash-4.3# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower

使用zkCli.sh查询该zk服务节点信息

//客户端连接脚本
bash-4.3# bin/zkCli.sh
//出现以下信息表示连接成功
Welcome to ZooKeeper!
JLine support is enabled
2019-07-20 08:39:02,009 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@876] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session
2019-07-20 08:39:02,028 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x16c0e7dea6d0001, negotiated timeout = 30000

查看节点信息

//查看节点
[zk: localhost:2181(CONNECTED) 0] ls /
[zk, zookeeper]

创建节点 创建mengxi节点,该节点的值为“mengxi”

//创建节点
[zk: localhost:2181(CONNECTED) 1] create /mengxi "mengxi"
Created /mengxi

查询创建的节点

//创建的节点
[zk: localhost:2181(CONNECTED) 2] ls /
[zk, mengxi, zookeeper]

查看节点具体信息

//节点值
[zk: localhost:2181(CONNECTED) 3] get /mengxi
mengxi
cZxid = 0x100000009
ctime = Sat Jul 20 08:40:34 GMT 2019
mZxid = 0x100000009
mtime = Sat Jul 20 08:40:34 GMT 2019
pZxid = 0x100000009
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

查看其他节点信息

由于zookeeper核心原子广播原理,在一个节点添加节点信息,会被广播至其他节点,即保持各个server之间的同步。可以使用zk客户端工具连接其他节点,查看被同步的节点信息。

//连接zoo2服务(通过查看节点信息,发现刚才在zoo1创建的节点,已经同步至zoo2)
bash-4.3# bin/zkCli.sh -server zoo2:2181
[zk: zoo2:2181(CONNECTED) 0] ls /
[zk, mengxi, zookeeper]
//连接zoo3服务(通过查看节点信息,发现刚才在zoo1创建的节点,已经同步至zoo3)
bash-4.3# bin/zkCli.sh -server zoo3:2181
[zk: zoo3:2181(CONNECTED) 0] ls /
[zk, mengxi, zookeeper]

自定义的网络来配置zookeeper集群

除了上述,使用docker-compose命令进行服务编排的方式,还有一种方式是通过自定义网络配置来进行zookeeper集群搭建。如果上述方式搭建不成功,可尝试用该方式进行搭建。
每个docker服务安装后可以通过命令 docker inspect 查看容器的具体信息,包括网络IP。

拉取镜像

//这里依然使用阿里云提供的镜像
docker pull registry.aliyuncs.com/denverdino/zookeeper:3.4.8

自定义docker网络

//自定义网络
docker network create --subnet 172.30.0.0/16 --gateway 172.30.0.1 --ip-range 172.30.0.0/17 net_env_test

注意:
解释上述创建命令,创建网段为172.30.0.0/16 的network,可用于自动分配的网段范围为 172.30.0.0/17(172.30.0.1 - 172.30.127.254), 这意味着,我们保留了一段IP用于手动分配:172.30.128.0/17(172.30.128.1 - 172.30.255.254), 网络名称为 net_env_test

创建zookeeper集群

//zoo1
docker run -d \
//容器名称
--name zoo1 \
//容器指定网络
--net net_env_test \
//指定容器对应的ip地址
--ip 172.30.200.1 \
//设置zookeeper配置文件
-e SERVER_ID=1 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=172.30.200.1:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=172.30.200.2:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=172.30.200.3:2888:3888 \
//设置容器暴露的端口号
-p 2181:2181 \
//镜像id
6c7fd

//zoo2
docker run -d \
--name zoo2 \
--net net_env_test \
--ip 172.30.200.2 \
-e SERVER_ID=2 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=172.30.200.1:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=172.30.200.2:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=172.30.200.3:2888:3888 \
-p 2182:2181 \
6c7fd

//zoo3
docker run -d \
--name zoo3 \
--net net_env_test \
--ip 172.30.200.3 \
-e SERVER_ID=3 \
-e ADDITIONAL_ZOOKEEPER_1=server.1=172.30.200.1:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_2=server.2=172.30.200.2:2888:3888 \
-e ADDITIONAL_ZOOKEEPER_3=server.3=172.30.200.3:2888:3888 \
-p 2183:2181 \
6c7fd

获取集群IP地址

//通过docker inspect --format格式化输出
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -f name=zoo[1-3] -q)
172.30.200.1
172.30.200.2
172.30.200.3

查看容器进程

//通过docker ps命令查看
docker ps -f name=zoo[1-3]
89ee6414f186        6c7fd7d20260        "/opt/zookeeper.sh"   2 days ago          Up 2 days           2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp   zoo2
2a47125f765e        6c7fd7d20260        "/opt/zookeeper.sh"   2 days ago          Up 2 days           2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp   zoo3
f83b9768d6f2        6c7fd7d20260        "/opt/zookeeper.sh"   2 days ago          Up 2 days           2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp   zoo1

进入容器查看

//进入容器
docker exec -it zoo1 bash
//通信zoo2
bash-4.3# ping zoo2
64 bytes from 172.19.0.3: seq=0 ttl=64 time=7.824 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.153 ms
64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.109 ms

可以看出来,zoo1成功与zoo2进行通信,其他查看节点信息命令可以参考上述命令,这里不在赘述。

使用zk连接工具ZooInspector查看节点

为了方便查看zookeeper中的节点信息,推荐使用ZooInspector小工具进行查看,Mac与Windows都可以使用,这里分享给大家。
ZooInspector下载地址 https://pan.baidu.com/s/1DzS9IuGepw7nPMzN3Q2Fiw 密码 ysuf

下载解压文件,运行build -> zookeeper-dev-ZooInspector.jar ,如下图
Docker创建Zookeeper集群

运行后,出现如下界面
Docker创建Zookeeper集群

点击连接图标,输入连接信息
Docker创建Zookeeper集群

显示当前zk服务节点信息
Docker创建Zookeeper集群

📚文章说明:
1、本文章链接失效后,请通过右下角企鹅QQ告知管理员,24小时内补链接,谢谢。点击下载说明了解。
2、天天精品分享的资源均通过网络公开合法渠道获取的,仅阅读交流测试使用,请在下载后24小时内删除。
3、版权归作者或出版社方所有,本站不对涉及的版权问题负法律责任。点击免责申明了解详情。
4、若版权方认为天天精品侵权,请联系客服QQ或发送邮件myttjp@163.com处理。
5、会员和精品豆系对搜集搬运、整理及网站运营做的友情赞助,非购买文件费用,敬请谅解。点击关于本站了解本站。
6、每位访客应尊重版权方的知识产权,支持版权方和出版社。

发表评论