docker-zookeeper集群搭建(伪集群)

[TOC]

说明

docker安装问题

各个版本的docker安装需要自行百度, 基本上都是采用yum install docker 或者 apt-get install docker 等方式安装

docker命令问题

这里不对docker所有命令进行介绍, 相关命令会在使用时简要提及

我的docker版本17.05.0-ce

➜  ~ docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:10:54 2017
 OS/Arch:      linux/amd64
 Experimental: false

zookeeper镜像获取

docker pull zookeeper

这个命令会默认拉取最新的zookeeper镜像
镜像下载好了之后, 使用docker images命令可以查看到当前主机中存在的镜像

➜  ~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zookeeper           latest              5291027d4199        7 weeks ago         143MB

zookeeper单节点

zookeeper单节点启动

➜  ~ docker run --name zk1 -d zookeeper:latest
0543d3008a7dd666a72b514aaf922114d4d6ff87b06e1e3b0b8d3b07e4268a70
  • docker run: 该命令是从镜像启动一个容器, 使其运行起来
  • --name: 该参数是指定容器的名称, 如果不指定该参数, 则默认为这个容器的唯一ID, 也就是上面一串字符串的前面几位, 类似于git的版本记录
  • -d: 是让该容器以守护进程运行
  • zookeeper:latest: 指定zookeeper镜像及其版本, :是镜像与版本的分隔符

查看镜像中zookeeper的配置情况

docker exec -it zk1 /bin/bash

这个命令是建立与zk1之间的一个连接, 这个连接通过bash命令进行交互(我是这么理解的, 如有不对, 请指正)

  • -i: 建立标准输入通道进行交互
  • -t: 分配一个tty (我理解为linux登录之后分配的一个会话)

我将两个参数合并在一起, 所以直接用-it就好了

vi /conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2

zookeeper的标准配置就在/conf
当我们启动容器的时候, zookeeper会自动启动, 并加载这个配置文件, 这个文件稍后我们还会用到, 留意一下

zookeeper单节点运行情况查看

➜  ~ docker logs zk1
...
-> 中间省略很多内容没有贴出来  
...binding to port 0.0.0.0/0.0.0.0:2181

查看zookeeper镜像启动日志(具体这个日志是怎么输出到这里的, 我还没去弄明白)

zookeeper运行状态

docker inspect zk1

查看docker 容器的一些构建信息, 这里我主要是查询该容器的ip地址

"IPAddress": "172.17.0.2"

接下在宿主机中执行命令, 查看zookeeper运行状态

➜  ~ echo stat | nc 172.17.0.2 2181
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
 /172.17.0.1:35160[0](queued=0,recved=1,sent=0)

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

由此可知, 我们当前的zookeeper是单节点运行的, 接下来搭建集群版, 很简单哦, 正常配置zookeeper集群是一样的

zookeeper的docker容器集群搭建

说明

由于是宿主机只有一个, 所以所有docker容器在本机中都存在与一个网段中, 相互之间是可以进行通信的, 不需要使用--link命令也可以通信, 如果对docker有更进一步配置, 就需要要参照其它文档进行设置了

启动两个节点

重新按照如上命令启动两个节点, 加上zk1就3个节点了
通过docker inspect {container_name}命令我们可以获取到所有zookeeper单节点的ip地址

  • zk1: 172.17.0.2
  • zk2: 172.17.0.3
  • zk3: 172.17.0.4

配置

进入zk1, 编辑配置文件

docker exec -it zk1 /bin/bash

加上server的配置信息, 我直接贴出最终结果

clientPort=2181
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
server.1=172.17.0.2:2888:3888
server.2=172.17.0.3:2888:3888
server.3=172.17.0.4:2888:3888

可以看出我把后面启动的两个zk的ip地址信息都添加进来了
2888, 是zk之间通信的端口
3888, 是zk之间投票选举的端口

保存退出

echo 1 > /data/myid

这条命令的意思是, 将1输出到/data/myid文件中, 这个是什么作用呢?
从我们的配置中可以看出, zk1的服务名是server.1, 这个1就是指定的服务名称

zk2, 和 zk3, 在配置文件上进行相同操作, 但是在echo 命令上分别输出2, 3,到对应的myid文件中

说一下为什么要放在/data目录下
因为从配置文件中我们知道, zookeeper配置了数据目录在/data, 所以我们要将myid文件放在/data目录下

全部保存退出, 重启容器

docker restart zk1
docker restart zk2
docker restart zk3

查看集群是否部署成功

➜  ~ echo stat | nc 172.17.0.2 2181
Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
Clients:
 /172.17.0.1:35192[0](queued=0,recved=1,sent=0)

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

可以明显看到之前查询的mode从standlone变成了follower, 说明集群部署成功, 好了~~

结尾

这是一个学习阶段的探索, 有不足的地方请见谅, 欢迎指出毛病, 有错就改, 大家一起进步, 如果按照本方法不能成功搭建伪集群, 可留言与我联系, 微信: byhand90

    原文作者:小雨转暴雨
    原文地址: https://www.jianshu.com/p/9a2963c2998a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞