前言 如果你对于zookeeper不懂的话,不建议来看此文章的内容。你可以自行网上查阅zookeeper资料学习。 在学习一门技术的时候,首先要了解这技术是干什么用的、基本的概念以及简单的上手使用。
搭建zookeeper单节点环境
获取zookeeper镜像
只要是想使用镜像,第一步都是先获取镜像
docker pull zookeeper
查看下载的zookeeper镜像
docker images
如下图所示:
运行zookeeper镜像
docker run -d --name zookeeper -p 2181:2181 zookeeper
这里的2181是zookeeper的默认端口号。当然,你在启动镜像的时候,可以不用指定port的映射,解决的办法就是可以通过docker提供的link机制来实现容器的访问。
查看运行中的zookeeper容器
docker ps
如下图所示:
连接zookeeper服务
在Linux命令行中执行以下命令:
docker exec -it ea zkCli.sh
其中的“ea”是zookeeper容器ID的前两位字符。
回车如下图(一般需要按两下回车键,才能看到最下面的“CONNECTED”的字样):
出现上面的信息,说明zookeeper正常启动
另一种连接zookeeper服务的方式
或许有的朋友可能对上面的命令“docker exec -it ea zkCli.sh”中的 zkCli.sh 不太明白。这个 zkCli.sh 是哪里来的?
你也可以通过另外一种命令来进入zookeeper容器:
docker exec -it ea /bin/bash
唯一不同的地方,就是最后面的命令内容。 执行该命令之后,进入的是zookeeper容器的文件系统的根目录。
我们可以查看一下容器的文件系统根目录下面有什么东西,在容器内执行命令:
cd /
回车之后,再执行命令:
ls
如下图所示:
可以明显的看到,有一个zookeeper的文件夹,也就是我们在容器中安装的zookeeper所在的目录。 然后,除了黄色区域的内容,再仔细看一下其他的目录,是不是发现了什么?不错,和我们平时看到的Linux系统根目录下面的内容是一样的。其实Docker容器就是一个简洁型的Linux文件系统。
找到我们的zookeeper目录之后,执行下面命令:
cd ./zookeeper-3.4.12/bin/
可以看到目录下面有一些脚本:
如果我们要连接zookeeper服务的话,需要使用 zkCli.sh 脚本来连接。
使用zkCli.sh连接zookeeper
在上面所在的目录下,执行以下命令:
./zkCli.sh -server 127.0.0.1:2181
出现下图所示信息,说明成功连接了zookeeper服务:
查看当前zookeeper的模式
和上面一样,需要在 /zookeeper-3.4.12/bin/ 目录下,执行以下命令查看zookeeper服务的模式:
./zkServer.sh status
如下图所示:
可以看到,当前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
pip -V
如果出现 -bash: pip: command not found 的提示,说明没有安装python-pip,需要安装一下python-pip包。 参考文章 https://www.cnblogs.com/YatHo/p/7815400.html
以下是我的阿里云服务器上的执行情况: 可以看到已经自带了pip包。
- 对安装好的pip进行升级
因为系统自带的软件包,很有可能不是最新版本,所以我们最好先更新到最新版本。
pip install --upgrade pip
运行结果如下:
已经升级到最新的 10.0.1 版本了。
安装Docker-Compose
在Linux命令行中执行命令:
pip install docker-compose
查看安装的docker-compose版本
docker-compose -version
如下图所示表示安装成功:
创建 docker-compose 文件
这里我就在 /opt 目录下新建了一个 zookeeper 目录(你也可以自定义存储目录),如下图:
在当前目录(/opt/zookeeper/)创建一个名为 docker-compose.yml 的文件, 其内容如下:
version: '2'
services:
zoo1:
image: zookeeper
restart: always
container_name: zoo1
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
container_name: zoo2
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
container_name: zoo3
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
这个配置文件会告诉 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/ )下运行:
COMPOSE_PROJECT_NAME=zk_cluster docker-compose up
即可启动 ZK 集群了。
注意:这种方式非后台运行,当执行 Ctrl + C 组合键的时候,所有的ZK容器都会停止运行。
以后台方式运行docker-compose
COMPOSE_PROJECT_NAME=zk_cluster docker-compose up -d
很简单,只要在最后面加上“-d”即可。
运行效果如下图:
可以看到,是以后台方式运行的ZK容器集群。
查看启动的ZK集群
执行上述命令成功后,接着新开启一个终端,然后在新终端界面中,首先进入 /opt/zookeeper/ 目录,在该目录下运行以下命令可以查看启动的 ZK 容器:
COMPOSE_PROJECT_NAME=zk_cluster docker-compose ps
如下图:
你也可以通过 docker ps 命令查看启动的ZK容器列表,如下图:
很明显的看到,启动了3个ZK容器,每个容器对应着宿主机的不同的端口号。
测试连接ZK集群
查看ZK集群的信息,有多种方法。这里我们就使用最普通的进入容器内部来查看ZK节点的信息以及它的模式。
通过上面的图,可以看到3个ZK容器的ID信息。
这里我们先进入zoo1这个容器,查看ZK的信息,执行以下命令:
docker exec -it 49 zkServer.sh status
其中“49”指的是zoo1容器的ID。
运行结果如下图:
可以看到,Mode的值为“follower”,指的是从节点,并非主节点。
以此类推,查看 zoo2 这个ZK容器的信息:
当前ZK容器节点为主节点
查看 zoo3 这个ZK容器的信息:
当前ZK容器节点为从节点
经过以上的查看,可以清晰的看到,其中一个ZK容器是一个主节点leader,另外2个都是从节点follower。
到此,在Docker中搭建zookeeper的集群环境已经讲解完了。
当然,其中的知识点还是很多的,文章只是一个入门级,对于更深层次的技术探索,各位可以自行网上学习的。