使用docker搭建zookeeper集群

前景知识

  • docker 基本操作
  • docker-compose 基本操作
  • zookeeper 基本原理与配置

实践版本:
docker Version:1.12.6 API version:1.24 Go version:go1.6.2
docker-compose version 1.14.0, build c7bdf9e
zookeeper 3.4.10

安装环境

安装docker: sudo apt-get install docker.io -y
安装docker-compose

1
2
sudo apt-get install python-pip -y
pip install docker-compose

运行docker -versiondocker-compose -version能出现版本信息,则是安装成功

使用docker-compse进行创建

这种方式最为简单快速
创建文件docker-compose.yml,配置如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '2'
services:
zoo1:
image: zookeeper
restart: always
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
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
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

在文件的目录下运行

1
docker-compose up

验证方式:

运行信息

1
docker ps

可以看到运行中的容器信息

1
2
3
4
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
102db57ef270 zookeeper "/docker-entrypoint.s" 24 minutes ago Up 24 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp compose_zoo2_1
cca20ce3dd60 zookeeper "/docker-entrypoint.s" 24 minutes ago Up 24 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp compose_zoo3_1
767bc1cc85cc zookeeper "/docker-entrypoint.s" 24 minutes ago Up 24 minutes 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp compose_zoo1_1

查是leader还是follower

进入其中一个,看是leader还是follower

1
docker exec -it compose_zoo1_1 /bin/bash

进入bash中后,输入./bin/zkServer.sh status
会出现下面状态

1
2
3
4
bash-4.3# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: follower

创建结点

docker exec -it compose_zoo1_1 /bin/bash
进入容器后

1
./bin/zkCli.sh -server 127.0.0.1:2181

进入zookeeper中

1
2
3
4
5
6
[zk: 127.0.0.1:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 1] create /test mytest
Created /test
[zk: 127.0.0.1:2181(CONNECTED) 2] ls /
[zookeeper, test]

进入其它容器,可以看到他们的状态是一样的,说明配置成功。

关于配置的解释

官方镜像中用ZOO_MY_IDZOO_SERVERS来指定服务器id与服务器配置

server.1=192.168.211.1:2888:3888
server.X=Y:Z:W

  • X是一个数字,表示这个是第几号服务器
  • Y是这个服务器的ip地址或域名或主机名.
  • Z表示的是这个服务器与集群中的 Leader 服务器交换信息的端口.
  • W表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

可能遇到的问题

如果出现

1
2
3
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

可能是当前用户没有加入到docker组中
使用

1
sudo gpasswd -a ${USER} docker

把当前用户加入到组中,再开一个会话,就可以正常了。

参考文档