ZooKeeper模拟集群构建 (Docker版本)

版权声明:欢迎转载,转载请说明出处https://csdn.yanxml.com。大数据Github项目地址https://github.com/SeanYanxml/bigdata。 https://blog.csdn.net/u010416101/article/details/84038585

前言

之前答应以为博友,构建一下Kafka的JAAS验证过程。但是好久没有使用Docker了,于是先拿ZooKeeper虚拟集群试试手。

PS: 在之前的工作和学习过程中,没有项目的实例进行保存,是在是有点尴尬的。其次,有些朋友不经历复杂的实践过程并不能构建出一套可以使用的系统。于是本次,使用docker构建,使得大家都能随下随用。

本人的Docker账户为: yanxml
DockerHub地址为:https://hub.docker.com/u/yanxml/

本次的章节主要分为如下几个部分:

  • 使用的Docker基础命令
  • 基础镜像的选择和使用
  • JDK安装
  • ZooKeeper本地模拟集群构建
  • HubDocker镜像的使用
  • 构建过程中遇到的Bug

Docker 基础命令

如果你对于Docker完全不了解的话,我建议你花一天的时间学习下Docker技术,我相信肯定会受益匪浅的。这里只是提及下面需要使用的Docker技术。

  • 启动镜像 docker run <-d 后台启动> <-i> <-t> <(镜像名:版本号)/(id)> <启动命令(CMD:ex./bin/bash)>
  • 启动容器 docker start <container Name / container id>
  • 进入已经启动容器 docker exec -i -t <container id> <CMD (/bin/bash)>
  • 拉取容器 docker pull <conatiner name:tag>
  • 推送容器 docker push <container name:tag>
  • 将容器提交为镜像: docker commit <container id> <Image Name:tag>
  • 镜像/镜像TAG重命名: docker tag <Image Name:tag / Image ID> <Image Name: tag>

基础镜像的选择和使用

在安装JDK之前,我们首先需要下载一个基础镜像,例如:alpinecentosubantu. 在这里我选择centos因为centos最接近Redhat内核,alpine虽然最小,但是他的内核不太熟悉,可能会有许多的软件安装不上。并且Centos,很多的软件可以使用yum一键安装,非常方便。

拉取和使用的命令如下所示:

# 拉取(没有版本限制的话 可以选择 latest最新版本)
docker pull centos:7.2.1511

# 第一次启动时(使用exit 退出镜像)
docker run -i -t centos:7.2.1511 /bin/bash

# 再次启动时
docker start 7e01ee3a466d
## 1. 先查询之前启动的镜像ID
localhost:~ Sean$ docker ps -a
CONTAINER ID        IMAGE                                         COMMAND                   CREATED             STATUS                      PORTS               NAMES
7e01ee3a466d        centos:7.2.1511                               "/bin/bash"               22 seconds ago      Exited (0) 22 seconds ago                       angry_mayer
## 2. 启动镜像
docker start 7e01ee3a466d
## 3. 使用docker exec 进入镜像内部
docker exec -i -t 7e01ee3a466d /bin/bash


安装JDK

如果为了方便,你可以选择openjdk的docker镜像。这里为了保证全局都是手动完成,并且封装自己的镜像。于是,没有使用其它人的镜像。docker 内安装JDK的步骤如下所示:

  • 安装wget yum install wget
  • 下载JDK文件(也可以使用docker cp拷贝)
wget -O "jdk.tar.gz" "https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz?AuthParam=1542014680_c4acf81cdfd8833b9e2c3f23445b4885"

注意,后面的下载地址是我在JDK官方网站点击下载,另存为链接保存下来的。各位可以去官方下载页面下载。

  • 解压JDK安装包 tar -zxvf jdk.tar.gz
  • 更改 /etc/profile ,末尾加上如下内容:
export JAVA_HOME=/opt/apps/jdk/jdk1.8.0_191
export PATH=$PATH:$JAVA_HOME/bin
  • 更新PATH变量 source /etc/profile

于是,JDK安装结束了。如果你想下次继续使用,或者其它项目使用。可以使用docker commit将其保存为镜像,并且push到DockerHub上。


安装ZooKeeper

JDK 安装完毕后,先别急着退出Docker镜像。我们还需要安装ZK。安装ZK本地虚拟集群步骤如下:

(实现思路是,在一个镜像內启动三个ZK进程。并且设置3个配置文件。当然,网上也有启动三个ZK镜像的做法,这个我们以后有时间再说。)

wget "http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/"
  • 解压ZK tar -zxvf zookeeper-3.4.10.tar.gz
  • 改名(个人喜好) mv zookeeper-3.4.10 app
  • 设置zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir=/tmp/zookeeper

dataDir=/opt/apps/zookeeper/nodes/zk1/data
dataLogDir=/opt/apps/zookeeper/nodes/zk1/logs

# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1


server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889

注意dataDirdataLogDirclientPortserver.x根据个人需要修改。其次,本次是本地虚拟集群,所以zoo.cfg拷贝3份,其上参数分别设置为自己需要的参数。(例如: zoo1.cfg中clientPort为2181,zoo2.cfg中为2182)。

  • 设置myid 在相应节点的dataDir目录下,创建myid文件echo "1" > myid/ echo "2" > myid / echo "3" > myid
  • 完成后的结构大概如下所示:
|-- app(zk解压后文件)
|-- bin
`-- nodes
    |-- zk1
    |   |-- conf
    |   |   |-- zoo.cfg
    |   |-- data
    |   `-- logs
    |-- zk2
    |   |-- conf
    |   |   |-- zoo.cfg
    |   |-- data
    |   `-- logs
    `-- zk3
        |-- conf
        |   |-- zoo.cfg
        |-- data
        `-- logs
  • 编写启动脚本 start.sh
#!/bin/bash

source /etc/profile

/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/nodes/zk1/conf/zoo.cfg

/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/zookeeper/zk2/conf/zoo.cfg

/opt/apps/zookeeper/app/bin/zkServer.sh start /opt/apps/zookeeper/zk3/conf/zoo.cfg

# 为了让zk的docker容器一直运行 死循环
tail -f anaconda-post.log
  • 编写关闭脚本 stop.sh
#!/bin/bash

ps -ef | grep zookeeper | grep -v grep | awk '{print $2}' | xargs kill -9
  • 保存镜像
docker commit 2fb6d2e4ac11 yanxml/zookeeper-cluster:0.0.4
  • 推送镜像(推送前需要登陆 docker login)
docker push yanxml/zookeeper-cluster:0.0.4

远程镜像地址: DockerHub: zookeeper-cluster


使用Docker 镜像

通过如上步骤我们构建了一个Docker本地ZK虚拟集群。以后再使用的时候就方便多了。我们只需要docker pull yanxml/zookeeper-cluster:0.0.4下载到本地,然后启动这个镜像即可。相关命令如下所示:

# 拉取
docker pull yanxml/zookeeper-cluster:0.0.4
# 启动
docker run -d -p 2181:2181 -p 2182:2182 -p 2183:2183  yanxml/zookeeper-cluster:0.0.4  /opt/apps/zookeeper/bin/start.sh

Questions

  • exec format error
 exec failed: container_linux.go:348: starting container process caused "exec format error": unknown


这个错误的一个原因是script.sh没有加#!/bin/bash
  • 如何查看centos系统64还是32
一、

[root@linuxzgf ~]#getconf LONG_BIT
[root@linuxzgf ~]#getconf WORD_BIT
(32位的系统中int类型和long类型一般都是4字节,64位的系统中int类型还是4字节的,但是long已变成了8字节inux系统中可用"getconf WORD_BIT"和"getconf LONG_BIT"获得word和long的位数。64位系统中应该分别得到32和64。)

二、

[root@linuxzgf ~]#uname -a
如果有x86_64就是64位的,没有就是32位的
后面是X686或X86_64则内核是64位的,i686或i386则内核是32位的
  • 如何所需镜像大小

这个是最值得一提的问题。因为docker镜像大小是层层叠加的,一旦某个版本存在冗余,则整个开发产品直到最终都会存在冗余。主要有如下做法:1. 保持每个更新迭代都过程最小化;2. 将数据和日志内容进行映射,通过-m挂载,实现容器内部和物理机器相通。


Reference

[1]. 查看CentOS系统版本是32位的还是64位的
[2]. docker “exec format error”
[3]. (Github)zookeeper-docker
[4]. Docker镜像推送(push)到Docker Hub
[5]. 使用wget下载jdk方法
[6]. docker将实例保存为镜像,移除镜像
[7]. Linux中拷贝 cp命令中拷贝所有的写法详解
[8]. Linux 下配置zookeeper集群
[9]. 安装zookeeper(单机,伪集群)
[10]. 使用 Docker 一步搞定 ZooKeeper 集群的搭建
[11]. docker环境搭建zk集群
[12]. docker 启动,端口映射,挂载本地目录
[13]. ZooKeeper系列3:ZooKeeper命令、命令行工具及简单操作
[14]. Docker容器内应用服务自启动
[15]. 批量kill掉包含某个关键字的进程
[16]. 为了让docker容器一直运行难道要写个死循环的程序?
[17]. docker CMD 命令
[18]. 如何提交docker镜像到DockerHub
[19]. 给镜像改名docker tag
[20]. Docker镜像推送(push)到Docker Hub
[21]. 如何将自己的镜像上传到Docker hub上
[22]. Docker镜像推送(push)到Docker Hub
[23]. docer缩小镜像大小的六种方法
[24]. 7 步精简 Docker 镜像几百MB(上)
[25]. 如何在Docker容器内外互相拷贝数据?

没有更多推荐了,返回首页