前言 如果你对于zookeeper不懂的话,不建议来看此文章的内容。你可以自行网上查阅zookeeper资料学习。 在学习一门技术的时候,首先要了解这技术是干什么用的、基本的概念以及简单的上手使用。

搭建zookeeper单节点环境

获取zookeeper镜像

只要是想使用镜像,第一步都是先获取镜像

  1. docker pull zookeeper

查看下载的zookeeper镜像

  1. docker images

如下图所示:
zookeeper - 图1

运行zookeeper镜像

  1. docker run -d --name zookeeper -p 2181:2181 zookeeper

这里的2181是zookeeper的默认端口号。当然,你在启动镜像的时候,可以不用指定port的映射,解决的办法就是可以通过docker提供的link机制来实现容器的访问。

查看运行中的zookeeper容器

  1. docker ps

如下图所示:
zookeeper - 图2

连接zookeeper服务

在Linux命令行中执行以下命令:

  1. docker exec -it ea zkCli.sh

其中的“ea”是zookeeper容器ID的前两位字符。

回车如下图(一般需要按两下回车键,才能看到最下面的“CONNECTED”的字样):
zookeeper - 图3

出现上面的信息,说明zookeeper正常启动

另一种连接zookeeper服务的方式

或许有的朋友可能对上面的命令“docker exec -it ea zkCli.sh”中的 zkCli.sh 不太明白。这个 zkCli.sh 是哪里来的?

你也可以通过另外一种命令来进入zookeeper容器:

  1. docker exec -it ea /bin/bash

唯一不同的地方,就是最后面的命令内容。 执行该命令之后,进入的是zookeeper容器的文件系统的根目录。

我们可以查看一下容器的文件系统根目录下面有什么东西,在容器内执行命令:

  1. cd /

回车之后,再执行命令:

  1. ls

如下图所示: zookeeper - 图4

可以明显的看到,有一个zookeeper的文件夹,也就是我们在容器中安装的zookeeper所在的目录。 然后,除了黄色区域的内容,再仔细看一下其他的目录,是不是发现了什么?不错,和我们平时看到的Linux系统根目录下面的内容是一样的。其实Docker容器就是一个简洁型的Linux文件系统。

找到我们的zookeeper目录之后,执行下面命令:

  1. cd ./zookeeper-3.4.12/bin/

可以看到目录下面有一些脚本: zookeeper - 图5

如果我们要连接zookeeper服务的话,需要使用 zkCli.sh 脚本来连接。

使用zkCli.sh连接zookeeper

在上面所在的目录下,执行以下命令:

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

出现下图所示信息,说明成功连接了zookeeper服务: zookeeper - 图6

查看当前zookeeper的模式

和上面一样,需要在 /zookeeper-3.4.12/bin/ 目录下,执行以下命令查看zookeeper服务的模式:

  1. ./zkServer.sh status

如下图所示: zookeeper - 图7

可以看到,当前zookeeper服务是单节点的,并非集群环境。

搭建zookeeper集群环境

实际企业生产环境,往往都是搭建的集群环境,避免单实例情况下的异常导致服务不可用。

这是我以前写的在原生的centos系统上搭建的zookeeper集群环境的文档,有兴趣可以看看 https://pan.baidu.com/s/1hrMaRpq

这里我们就搭建3个zookeeper节点吧。3个节点已经算是最小单元的集群环境了。

为了编写简单,zookeeper 名称我们使用“ZK”来表示。

因为一个一个地启动 ZK 太麻烦了, 所以为了方便起见, 我们直接使用 docker-compose 来启动 ZK 集群。

Docker-Compose —— Docker编排工具

简介 Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。 Docker-Compose是一个部署多个容器的简单但是非常必要的工具.

两种最新的安装Docker-Compose的方式

  • 从github上下载docker-compose二进制文件安装

  • pip安装

官方文档 https://docs.docker.com/compose/install/

这里我就使用 pip 的方式安装。

安装Docker-Compose之前,请先安装 python-pip

安装 python-pip

  • 首先检查Linux有没有安装python-pip包,终端执行 pip -V
  1. pip -V

如果出现 -bash: pip: command not found 的提示,说明没有安装python-pip,需要安装一下python-pip包。 参考文章 https://www.cnblogs.com/YatHo/p/7815400.html

以下是我的阿里云服务器上的执行情况: zookeeper - 图8 可以看到已经自带了pip包。

  • 对安装好的pip进行升级

因为系统自带的软件包,很有可能不是最新版本,所以我们最好先更新到最新版本。

  1. pip install --upgrade pip

运行结果如下:
zookeeper - 图9

已经升级到最新的 10.0.1 版本了。

安装Docker-Compose

在Linux命令行中执行命令:

  1. pip install docker-compose

查看安装的docker-compose版本

  1. docker-compose -version

如下图所示表示安装成功:
zookeeper - 图10

创建 docker-compose 文件

这里我就在 /opt 目录下新建了一个 zookeeper 目录(你也可以自定义存储目录),如下图:
zookeeper - 图11

在当前目录(/opt/zookeeper/)创建一个名为 docker-compose.yml 的文件, 其内容如下:

  1. version: '2'
  2. services:
  3. zoo1:
  4. image: zookeeper
  5. restart: always
  6. container_name: zoo1
  7. ports:
  8. - "2181:2181"
  9. environment:
  10. ZOO_MY_ID: 1
  11. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  12. zoo2:
  13. image: zookeeper
  14. restart: always
  15. container_name: zoo2
  16. ports:
  17. - "2182:2181"
  18. environment:
  19. ZOO_MY_ID: 2
  20. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  21. zoo3:
  22. image: zookeeper
  23. restart: always
  24. container_name: zoo3
  25. ports:
  26. - "2183:2181"
  27. environment:
  28. ZOO_MY_ID: 3
  29. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

这个配置文件会告诉 Docker 分别运行三个 zookeeper 镜像, 并分别将本地的 2181, 2182, 2183 端口绑定到对应的容器的2181端口上(每个zookeeper容器的默认端口都是2181,这句话意思也就是说,将宿主机的2181、2182、2183这3个端口号,分别映射到3个zookeeper容器的2181端口)。

ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量,其中 ZOO_MY_ID 表示 ZK 服务的 id,它是1-255 之间的整数,必须在集群中唯一;ZOO_SERVERS 是ZK 集群的主机列表。

运行 docker-compose

接着我们在 docker-compose.yml 所在的目录(/opt/zookeeper/ )下运行:

  1. COMPOSE_PROJECT_NAME=zk_cluster docker-compose up

即可启动 ZK 集群了。
注意:这种方式非后台运行,当执行 Ctrl + C 组合键的时候,所有的ZK容器都会停止运行。

以后台方式运行docker-compose

  1. COMPOSE_PROJECT_NAME=zk_cluster docker-compose up -d

很简单,只要在最后面加上“-d”即可。

运行效果如下图:
zookeeper - 图12

可以看到,是以后台方式运行的ZK容器集群。

查看启动的ZK集群

执行上述命令成功后,接着新开启一个终端,然后在新终端界面中,首先进入 /opt/zookeeper/ 目录,在该目录下运行以下命令可以查看启动的 ZK 容器:

  1. COMPOSE_PROJECT_NAME=zk_cluster docker-compose ps

如下图:
zookeeper - 图13

你也可以通过 docker ps 命令查看启动的ZK容器列表,如下图:
zookeeper - 图14

很明显的看到,启动了3个ZK容器,每个容器对应着宿主机的不同的端口号。

测试连接ZK集群

查看ZK集群的信息,有多种方法。这里我们就使用最普通的进入容器内部来查看ZK节点的信息以及它的模式。

通过上面的图,可以看到3个ZK容器的ID信息。

这里我们先进入zoo1这个容器,查看ZK的信息,执行以下命令:

  1. docker exec -it 49 zkServer.sh status

其中“49”指的是zoo1容器的ID。

运行结果如下图:
zookeeper - 图15

可以看到,Mode的值为“follower”,指的是从节点,并非主节点。

以此类推,查看 zoo2 这个ZK容器的信息
zookeeper - 图16

当前ZK容器节点为主节点

查看 zoo3 这个ZK容器的信息
zookeeper - 图17

当前ZK容器节点为从节点

经过以上的查看,可以清晰的看到,其中一个ZK容器是一个主节点leader,另外2个都是从节点follower。

到此,在Docker中搭建zookeeper的集群环境已经讲解完了。
当然,其中的知识点还是很多的,文章只是一个入门级,对于更深层次的技术探索,各位可以自行网上学习的。