[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