1.获取官方镜像

从dockerhub获取官方的zookeeper镜像:

  1. docker pull zookeeper

2.了解镜像内容

拉取完镜像后,通过

  1. docker inspect zookeeper

我们可以查看到关于该镜像的一些基本信息:

  1. ......
  2. "Env": [
  3. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin:/zookeeper-3.4.10/bin",
  4. "LANG=C.UTF-8",
  5. "JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre",
  6. "JAVA_VERSION=8u131",
  7. "JAVA_ALPINE_VERSION=8.131.11-r2",
  8. "ZOO_USER=zookeeper",
  9. "ZOO_CONF_DIR=/conf",
  10. "ZOO_DATA_DIR=/data",
  11. "ZOO_DATA_LOG_DIR=/datalog",
  12. "ZOO_PORT=2181",
  13. "ZOO_TICK_TIME=2000",
  14. "ZOO_INIT_LIMIT=5",
  15. "ZOO_SYNC_LIMIT=2",
  16. "ZOO_MAX_CLIENT_CNXNS=60",
  17. "ZOOCFGDIR=/conf"
  18. ],
  19. "Cmd": [
  20. "zkServer.sh",
  21. "start-foreground"
  22. ],
  23. "Volumes": {
  24. "/data": {},
  25. "/datalog": {}
  26. },
  27. "WorkingDir": "/zookeeper-3.4.10",
  28. "Entrypoint": [
  29. "/docker-entrypoint.sh"
  30. ],
  31. ......

即,该zookeeper的版本是3.4.10,conf目录在/conf,基于该镜像启动的容器的entrypoint为

  1. /docker-entrypoint.sh

默认传入的参数为

  1. zkServer.sh start-foreground

基于该镜像启动一个容器:

  1. docker run -d zookeeper

然后进入容器后,我们可以查看docker-entrypoint.sh的基本内容:

  1. #!/bin/bash
  2. set -e
  3. # Allow the container to be started with `--user`
  4. if [ "$1" = 'zkServer.sh' -a "$(id -u)" = '0' ]; then
  5. chown -R "$ZOO_USER" "$ZOO_DATA_DIR" "$ZOO_DATA_LOG_DIR"
  6. exec su-exec "$ZOO_USER" "$0" "$@"
  7. fi
  8. # Generate the config only if it doesn't exist
  9. if [ ! -f "$ZOO_CONF_DIR/zoo.cfg" ]; then
  10. CONFIG="$ZOO_CONF_DIR/zoo.cfg"
  11. echo "clientPort=$ZOO_PORT" >> "$CONFIG"
  12. echo "dataDir=$ZOO_DATA_DIR" >> "$CONFIG"
  13. echo "dataLogDir=$ZOO_DATA_LOG_DIR" >> "$CONFIG"
  14. echo "tickTime=$ZOO_TICK_TIME" >> "$CONFIG"
  15. echo "initLimit=$ZOO_INIT_LIMIT" >> "$CONFIG"
  16. echo "syncLimit=$ZOO_SYNC_LIMIT" >> "$CONFIG"
  17. echo "maxClientCnxns=$ZOO_MAX_CLIENT_CNXNS" >> "$CONFIG"
  18. for server in $ZOO_SERVERS; do
  19. echo "$server" >> "$CONFIG"
  20. done
  21. fi
  22. # Write myid only if it doesn't exist
  23. if [ ! -f "$ZOO_DATA_DIR/myid" ]; then
  24. echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid"
  25. fi
  26. exec "$@"

可以看到,该脚本主要是用于设置启动zookeeper的用户,以及创建zoo.cfg配置文件。

其中有一段是:

  1. for server in $ZOO_SERVERS; do
  2. echo "$server" >> "$CONFIG"
  3. done
  1. # Write myid only if it doesn't exist
  2. if [ ! -f "$ZOO_DATA_DIR/myid" ]; then
  3. echo "${ZOO_MY_ID:-1}" > "$ZOO_DATA_DIR/myid"
  4. fi

即只要传入ZOO_SERVERS参数,我们就可以设置各个zookeeper server节点的host信息,设置ZOO_MY_ID参数就可以写入本节点的serverID。

这一段脚本的作用使得该镜像可以很好地适配zk的不同模式:单机模式和集群模式(伪集群模式)。

3.在宿主机上搭建多节点集群模式的zookeeper

基于上述调研,我们可以明确搭建一个多节点的zookeeper集群需要的步骤如下:

(1) 获取zookeeper官方镜像

(2) 连通不同zk server节点所在容器之间的网络

(3) 对每个zk server节点设置相同的zoo.cfg,传入集群中各节点的host信息

(4) 设置各个zk server节点的ServerID(修改各自的$dataDir/myid文件)

(5) 启动集群, 并将端口2181映射到宿主机。

基于上述步骤,整合成如下的shell脚本:

  1. #!/bin/bash
  2. #Get zookeeper image
  3. zkimage=`docker images | grep zookeeper | awk {'print $1'}`
  4. if [ -n "$zkimage" ]
  5. then
  6. echo 'The zookeeper image is already existed.'
  7. else
  8. echo 'Pull the latest zookeeper image.'
  9. docker pull zookeeper
  10. fi
  11. #Create network for zookeeper containers
  12. zknet=`docker network ls | grep zknetwork | awk {'print $2'}`
  13. if [ -n "$zknet" ]
  14. then
  15. echo 'The zknetwork is already existed.'
  16. else
  17. echo 'Create zknetwork.'
  18. docker network create zknetwork
  19. fi
  20. #Start zookeeper cluster
  21. echo 'Start 3 zookeeper servers.'
  22. ZOO_SERVERS="server.1=zkServer1:2888:3888 server.2=zkServer2:2888:3888 server.3=zkServer3:2888:3888"
  23. docker run -d -e ZOO_SERVERS="$ZOO_SERVERS" -e ZOO_MY_ID=1 --name zkServer1 --net zknetwork -p 2181:2181 zookeeper
  24. docker run -d -e ZOO_SERVERS="$ZOO_SERVERS" -e ZOO_MY_ID=2 --name zkServer2 --net zknetwork -p 2182:2181 zookeeper
  25. docker run -d -e ZOO_SERVERS="$ZOO_SERVERS" -e ZOO_MY_ID=3 --name zkServer3 --net zknetwork -p 2183:2181 zookeeper

执行该shell脚本,便可启动一个新的zk集群。

  1. root@hadoop985:~/docker/zookeeper-docker# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. bfc84ce7aa1d zookeeper "/docker-entrypoin..." 36 minutes ago Up 36 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp zkServer3
  4. 18b6b1d9987c zookeeper "/docker-entrypoin..." 36 minutes ago Up 36 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp zkServer2
  5. 0b6d1b69bb05 zookeeper "/docker-entrypoin..." 36 minutes ago Up 36 minutes 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zkServer1

Docker中搭建zookeeper集群的更多相关文章

  1. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  2. 在CentOS7中搭建Zookeeper集群

    前几天装了CentOS7.并安装了一些基本的工具,现在我手上有三台机器:分别是master,slave1,slave2. 今天我将搭建zookeeper,使用的版本是zookeeper-3.4.11. ...

  3. docker容器中搭建kafka集群环境

    Kafka集群管理.状态保存是通过zookeeper实现,所以先要搭建zookeeper集群 zookeeper集群搭建 一.软件环境: zookeeper集群需要超过半数的的node存活才能对外服务 ...

  4. docker 搭建zookeeper集群和kafka集群

    docker 搭建zookeeper集群 安装docker-compose容器编排工具 Compose介绍 Docker Compose 是 Docker 官方编排(Orchestration)项目之 ...

  5. 如何搭建Zookeeper集群

     ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的 ...

  6. centos 6.5 搭建zookeeper集群

    为什么使用Zookeeper? 大部分分布式应用需要一个主控.协调器或控制器来管理物理分布的子进程(如资源.任务分配等)目前,大部分应用需要开发私有的协调程序,缺乏一个通用的机制协调程序的反复编写浪费 ...

  7. docker-compose搭建zookeeper集群

    搭建zookeeper集群 创建docker-compose.yml文件 ``` version: '3.1' services: zoo1: image: zookeeper restart: al ...

  8. docker-compose搭建zookeeper集群环境 CodingCode

    docker-compose搭建zookeeper集群环境 使用docker-compose搭建zookeeper集群环境 zookeeper是一个集群环境,用来管理微服务架构下面的配置管理功能. 这 ...

  9. 使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇

    使用Cloudera Manager搭建zookeeper集群及HDFS HA实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用Cloudera Manager搭建zo ...

随机推荐

  1. 201521123050《Java程序设计》第2周学习总结

    本周学习总结 (1)掌握各种数据类型的使用 基本类型 整数类型(byte,short,int,long,char) 浮点类型(float,double) boolean类型(true, false) ...

  2. 201521123037 《Java程序设计》第1周学习总结

    #1.本章学习总结 了解java的发展历程 能够区分JVM.JRE.JDK之间的关系 了解文件名.类名要相同,且文件名大小写代表不同的名称 初步了解java编程语句 学会用控制台编译java程序 #2 ...

  3. Spring Boot Maven Plugin(二):run目标

    简介 Spring Boot Maven Plugin插件提供spring boot在maven中的支持.允许你打包可运行的jar包或war包. 插件提供了几个maven目标和Spring Boot ...

  4. 06jQuery-06-AJAX

    1.JS的AJAX AJAX,Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求. 如果要让用户留在当前页面中,同时发出新的HTTP请求,就 ...

  5. 举例让抽象问题具体化:包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). import java.util.Stack; public c ...

  6. Unity 3D Time 类

    Time   class in UnityEngine Description The interface to get time information from Unity. Static Var ...

  7. StringBuffer的替换和反转和截取功能

    A:StringBuffer的替换功能 * public StringBuffer replace(int start,int end,String str): * 从start开始到end用str替 ...

  8. [js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法

    canvas是html5中引入的一个新元素,俗称画布,既然是画布,当然是用来画图的.canvas技术指的是利用javascript操作canvas元素绘制图形的技术,要使用canvas,一定要浏览器支 ...

  9. SpringAop详解

    近几天学习了一下SpringAop在网上找了一些资料,此链接为原文链接http://www.cnblogs.com/xrq730/p/4919025.html AOP AOP(Aspect Orien ...

  10. Hive基础(2)---(启动HiveServer2)Hive严格模式

    启动方式 1, hive  命令行模式,直接输入/hive/bin/hive的执行程序,或者输入 hive –service cli 用于linux平台命令行查询,查询语句基本跟mysql查询语句类似 ...