物联网架构成长之路(27)-Docker练习之Zookeeper安装
0. 前言
准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明。不过Kafka依赖Zookeeper,因此先练习一些用Docker构建Zookeeper。
1. 安装ZooKeeper
使用Kafka前,要安装ZooKeeper。这里利用最近刚学的Docker,我构建成一个ZooKeeper Image,供以后使用。
FROM openjdk:8-jdk-alpine RUN apk add --no-cache bash && rm -rf /var/cache/apk/* && /bin/bash
RUN wget http://mirrors.aliyun.com/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz && \
tar -zxvf zookeeper-3.4.13.tar.gz && \
rm -rf zookeeper-3.4.13.tar.gz && \
mv zookeeper-3.4.13 zookeeper && \
cd /zookeeper && rm -rf contrib dist-maven docs recipes src *.txt *.md *.xml && \
cp /zookeeper/conf/zoo_sample.cfg /zookeeper/conf/zoo.cfg && \
sed -i "s#dataDir=/tmp/zookeeper#dataDir=/data#g" /zookeeper/conf/zoo.cfg
ENV PATH /zookeeper/bin:$PATH EXPOSE 2181 CMD ["zkServer.sh", "start-foreground"]
构建、运行
docker build -t zookeeper:3.4. .
docker run -d -p : zookeeper:3.4.
挂载 -v /my_data:/data


2. Zookeeper Cluster模式
具体的Cluster模式,可以参考我之前的博客 https://www.cnblogs.com/wunaozai/p/8249657.html
现在是测试3个node的Zookeeper节点
zoo.cfg
tickTime=
initLimit=
syncLimit=
dataDir=/data
clientPort=
server.=zoo1::
server.=zoo2::
server.=zoo3::
docker-compose.yml
version: ''
services:
zoo1:
image: zookeeper:3.4.
volumes:
- /root/workspace/docker/kafka/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /root/workspace/docker/kafka/zookeeper/myid1:/data/myid
zoo2:
image: zookeeper:3.4.
volumes:
- /root/workspace/docker/kafka/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /root/workspace/docker/kafka/zookeeper/myid2:/data/myid
zoo3:
image: zookeeper:3.4.
volumes:
- /root/workspace/docker/kafka/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /root/workspace/docker/kafka/zookeeper/myid3:/data/myid
准备运行3个节点的Zookeeper。要现在目录准备zoo.cfg文件,在该配置文件最后面,要配置server.id=server:port,然后还要为每个Zookeeper节点准备一个myid文件
echo "" > myid1
echo "" > myid2
echo "" > myid3
docker-componse up
启动后,我们进入任意一台主机,然后create path data,这样这份数据都会同步到各个节点上。
3. zkui Zookeeper可视化Web客户端
我使用这个Zookeeper可视化客户端,https://github.com/DeemOpen/zkui 在源代码之上,
mvn package -Dmaven.test.skip=true
利用Dockerfile构建zkui Image
Dockerfile
FROM openjdk:8-jdk-alpine MAINTAINER wunaozai <i@wunaozai.com> WORKDIR /var/app
ADD zkui-*.jar /var/app/zkui.jar
ADD config.cfg /var/app/config.cfg
ADD bootstrap.sh /var/app/bootstrap.sh EXPOSE 9090 ENTRYPOINT ["/var/app/bootstrap.sh"]
bootstrap.sh
#!/bin/sh
ZK_SERVER=${ZK_SERVER:-"localhost:2181"}
USER_SET=${USER_SET:-"{\"users\": [{ \"username\":\"admin\" , \"password\":\"manager\",\"role\": \"ADMIN\" \},{ \"username\":\"appconfig\" , \"password\":\"appconfig\",\"role\": \"USER\" \}]\}"}
LOGIN_MESSAGE=${LOGIN_MESSAGE:-"Please login using admin/manager or appconfig/appconfig."}
sed -i "s/^zkServer=.*$/zkServer=$ZK_SERVER/" /var/app/config.cfg
sed -i "s/^userSet = .*$/userSet = $USER_SET/" /var/app/config.cfg
sed -i "s/^loginMessage=.*$/loginMessage=$LOGIN_MESSAGE/" /var/app/config.cfg
echo "Starting zkui with server $ZK_SERVER"
exec java -jar /var/app/zkui.jar
config.cfg
#Server Port
serverPort=9090
#Comma seperated list of all the zookeeper servers
zkServer=localhost:2181,localhost:2181
#Http path of the repository. Ignore if you dont intent to upload files from repository.
scmRepo=http://myserver.com/@rev1=
#Path appended to the repo url. Ignore if you dont intent to upload files from repository.
scmRepoPath=//appconfig.txt
#if set to true then userSet is used for authentication, else ldap authentication is used.
ldapAuth=false
ldapDomain=mycompany,mydomain
#ldap authentication url. Ignore if using file based authentication.
ldapUrl=ldap://<ldap_host>:<ldap_port>/dc=mycom,dc=com
#Specific roles for ldap authenticated users. Ignore if using file based authentication.
ldapRoleSet={"users": [{ "username":"domain\\user1" , "role": "ADMIN" }]}
userSet = {"users": [{ "username":"admin" , "password":"manager","role": "ADMIN" },{ "username":"appconfig" , "password":"appconfig","role": "USER" }]}
#Set to prod in production and dev in local. Setting to dev will clear history each time.
env=prod
jdbcClass=org.h2.Driver
jdbcUrl=jdbc:h2:zkui
jdbcUser=root
jdbcPwd=manager
#If you want to use mysql db to store history then comment the h2 db section.
#jdbcClass=com.mysql.jdbc.Driver
#jdbcUrl=jdbc:mysql://localhost:3306/zkui
#jdbcUser=root
#jdbcPwd=manager
loginMessage=Please login using admin/manager or appconfig/appconfig.
#session timeout 5 mins/300 secs.
sessionTimeout=300
#Default 5 seconds to keep short lived zk sessions. If you have large data then the read will take more than 30 seconds so increase this accordingly.
#A bigger zkSessionTimeout means the connection will be held longer and resource consumption will be high.
zkSessionTimeout=5
#Block PWD exposure over rest call.
blockPwdOverRest=false
#ignore rest of the props below if https=false.
https=false
keystoreFile=/home/user/keystore.jks
keystorePwd=password
keystoreManagerPwd=password
# The default ACL to use for all creation of nodes. If left blank, then all nodes will be universally accessible
# Permissions are based on single character flags: c (Create), r (read), w (write), d (delete), a (admin), * (all)
# For example defaultAcl={"acls": [{"scheme":"ip", "id":"192.168.1.192", "perms":"*"}, {"scheme":"ip", id":"192.168.1.0/24", "perms":"r"}]
defaultAcl=
# Set X-Forwarded-For to true if zkui is behind a proxy
X-Forwarded-For=false
4. Zookeeper与zkui结合
用Zookeeper自带的zkCli.sh -server 127.0.0.1 可以正常的对Zookeeper数据进行增删改查了。但是有时候测试的时候,还是要Web的客户端比较方便,前期调试开发都是比较友好的。
docker-compose.yml
version: '3'
services:
zoo:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zookeeper
ports:
- 2181:2181
zkui:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zkui
environment:
- ZK_SERVER=zoo:2181
ports:
- 8080:9090

docker-compose.yml
version: '3'
services:
zoo1:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zookeeper
volumes:
- /home/lmx/workspace/docker/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /home/lmx/workspace/docker/zookeeper/myid1:/data/myid
zoo2:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zookeeper
volumes:
- /home/lmx/workspace/docker/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /home/lmx/workspace/docker/zookeeper/myid2:/data/myid
zoo3:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zookeeper
volumes:
- /home/lmx/workspace/docker/zookeeper/zoo.cfg:/zookeeper/conf/zoo.cfg
- /home/lmx/workspace/docker/zookeeper/myid3:/data/myid
zkui:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/zkui
environment:
- ZK_SERVER=zoo1:2181,zoo2:2181,zoo3:2181
ports:
- 8080:9090

参考资料:
https://www.cnblogs.com/wunaozai/p/8249657.html
http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_singleAndDevSetup
https://hub.docker.com/r/library/openjdk/
https://hub.docker.com/r/wurstmeister/zookeeper
本文地址: https://www.cnblogs.com/wunaozai/p/9978795.html
物联网架构成长之路(27)-Docker练习之Zookeeper安装的更多相关文章
- 物联网架构成长之路(25)-Docker构建项目用到的镜像1
0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...
- 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)
0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
- 物联网架构成长之路(22)-Docker练习之Etcd服务搭建
0. 前言 时隔多日,前段时间忙完一个可有可无的项目后,又进入摸鱼时间,没有办法,非互联网公司,就是闲得蛋疼.又开始了自学之路.以前入门过Docker,然后又很久没有看了,最近重新看了一下,推荐一下这 ...
- 物联网架构成长之路(26)-Docker构建项目用到的镜像2
0. 前言 前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了.刚开始学,Dockerf ...
- 物联网架构成长之路(23)-Docker练习之Elasticsearch服务搭建
0. 前言 最近基本都是学一些环境配置,和一些中间件的安装与配置.没有实际编写代码.可能看起来有点水,我对自己的学习方式是,先要了解各个中间件的安装配置以及简单使用,理论应用场景,然后我在小项目中,逐 ...
- 物联网架构成长之路(44)-Docker私有仓库Harbor
0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...
- 物联网架构成长之路(31)-EMQ基于HTTP权限验证
看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...
- 物联网架构成长之路(35)-利用Netty解析物联网自定义协议
一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...
随机推荐
- js基础梳理-如何理解作用域和作用域链?
本文重点是要梳理执行上下文的生命周期中的建立作用域链,在此之前,先回顾下关于作用域的一些知识. 1.什么是作用域(scope)? 在<JavaScritp高级程序设计>中并没有找到确切的关 ...
- 字节跳动冬令营网络赛 D.The Easiest One(贪心 数位DP)
题目链接 \(x:\ 11010011\) \(y:\ 10011110\) (下标是从高位往低位,依次是\(1,2,...,n\)) 比如对于这两个数,先找到最高的满足\(x\)是\(0\),\(y ...
- 蓝桥杯 ——无重复组合——C++
问题描述: 求任意长度的(ABCD.....)全部n=0,1,2 ....组合情况(n小于等于串的长度) 解决思路: 如果串的长度固定,n的值固定循环嵌套 在这里以深度优先形成一棵树,如下图: 源代码 ...
- 英语口语练习系列-C33-露营-谈论日期-离思
词汇-露营 Camping camping 露营 campground camping camper picnic bonfire backpack tent public campground co ...
- 潭州课堂25班:Ph201805201 django 项目 第四十一课 后台 轮播图管理功能讲解,文档管理功能 实现 (课堂笔记)
在进入轮播图管理页面时,要把轮播图显示在页面上,所以后台要向前台返回: 图片路由,:image_url 优先级: priority def get(self, request): # priority ...
- Markdown指南
Markdown 指南 前几天学习了markdown,然后一直在用,很喜欢这种格式即内容的写作形式.在简书写了几篇,对固定链接的格式很不满意,于是寻找能够支持markdown.固定链接显格式.支持自定 ...
- 在win10中解决 你要以何方式打开此 .xlsx
鼠标右击开始按钮,点击控制面板. 查看方式选择大图标或者小图标. 然后点击“默认程序”. 点击,设置默认程序. 在左侧程序蓝,选择你需要设定的程序.然后点击“将此程序设为默认值”.确定 ...
- (转)为什么wait(),notify()和notifyAll()必须在同步块或同步方法中调用
我们常用wait(),notify()和notifyAll()方法来进行线程间通信.线程检查一个条件后就行进入等待状态,例如,在“生产者-消费者”模型中,生产者线程发现缓冲区满了就等待,消费者线程通过 ...
- assets 与 res 目录的区别
res 目录存放的资源在编译时,会自动生成 R.java,该文件为 res 目录下的资源创建索引,程序可以直接通过 R 资源清单类进行访问,文件assets 目录存放的资源一般是通过 AssetMan ...
- 3ds max学习笔记(十四)-- (FFD自由变形)
FFD长方体,FFD圆柱体: 栗子2:通过对长方体进行自由编辑,松弛,和涡轮平滑的操作实现抱枕模型,抱枕表面的凹凸效果,可以通过贴图的方式来实现: