Docker 安装zookeeper 集群

一、常规方法搭建

1.拉取镜像

#拉取最新的镜像
docker pull zookeeper 

2.创建 bridge 网络

Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可。

#创建自定义网络
docker network create --driver bridge --subnet=172.168.0.0/16 --gateway=172.168.1.1 mynet
#查看已存在网络
docker network ls

3.创建挂载目录

# 创建 zookeeper 节点目录
mkdir -p /home/docker/zookeeper/{node1,node2,node3}
创建 zookeeper 节点配置存放目录config、数据存放目录data、数据日志存放目录datalog、日志存放目录logs
mkdir -p /home/docker/zookeeper/node1/{conf,data,datalog,logs}
mkdir -p /home/docker/zookeeper/node2/{conf,data,datalog,logs}
mkdir -p /home/docker/zookeeper/node3/{conf,data,datalog,logs}

4.创建配置文件

# zookeeper 节点1 配置存放目录
cd /home/docker/zookeeper/node1/conf
# 编辑配置文件
vi zoo.cfg

# zookeeper 节点2 配置存放目录
cd /home/docker/zookeeper/node2/conf
# 编辑配置文件
vi zoo.cfg

# zookeeper 节点3 配置存放目录
cd /home/docker/zookeeper/node3/conf
# 编辑配置文件
vi zoo.cfg

参考配置

# Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
dataDir=/data

# 事物日志存储地点,如果没提供的话使用的则是 dataDir
dataLogDir=/datalog

# 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位
tickTime=2000

# 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
initLimit=5

# 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=2

# 默认值为3,不支持以系统属性方式配置。用于配置Zookeeper在自动清理的时候需要保留的快照数据文件数量和对应的事务日志文件。此参数的最小值为3,如果配置的值小于3会自动调整到3
autopurge.snapRetainCount=3

# 默认值为0,单位为小时,不支持以系统属性方式配置。用于配置Zookeeper进行历史文件自动清理的频率。如果配置为0或负数,表示不需要开启定时清理功能
autopurge.purgeInterval=0

# 默认为60,不支持以系统属性方式配置。从Socket层面限制单个客户端与单台服务器之间的并发连接数,即以ip地址来进行连接数的限制。
# 如果设置为0,表示不做任何限制。仅仅是单台客户端与单个Zookeeper服务器连接数的限制,不能控制所有客户端的连接数总和
maxClientCnxns=60

# 3.5.0中的新功能:当设置为false时,可以在复制模式下启动单个服务器,单个参与者可以使用观察者运行,并且群集可以重新配置为一个节点,并且从一个节点。
# 对于向后兼容性,默认值为true。可以使用QuorumPeerConfig的setStandaloneEnabled方法或通过将“standaloneEnabled = false”或“standaloneEnabled = true”添加到服务器的配置文件来设置它。
standaloneEnabled=false

# 内嵌的管理控制台,停用这个服务
admin.enableServer=false

# 开启四字命令,将所有命令添加到白名单中
4lw.commands.whitelist=*

# 集群中服务的列表
server.1=172.168.0.1:2888:3888;2181
server.2=172.168.0.2:2888:3888;2181
server.3=172.168.0.3:2888:3888;2181

5.集群启动

节点1启动

# 启动命令
docker run -d --restart always \
--name zookeeper-node1 \
--network mynet \
--ip 172.168.0.1 \
-p 2181:2181 \
-e ZOO_MY_ID=1 \
-v /home/docker/zookeeper/node1/conf/zoo.cfg:/conf/zoo.cfg \
-v /home/docker/zookeeper/node1/data:/data \
-v /home/docker/zookeeper/node1/datalog:/datalog \
-v /home/docker/zookeeper/node1/logs:/logs \
zookeeper

节点2 启动

# 启动命令
docker run -d --restart always \
--name zookeeper-node2 \
--network mynet \
--ip 172.168.0.2 \
-p 2182:2181 \
-e ZOO_MY_ID=2 \
-v /home/docker/zookeeper/node2/conf/zoo.cfg:/conf/zoo.cfg \
-v /home/docker/zookeeper/node2/data:/data \
-v /home/docker/zookeeper/node2/datalog:/datalog \
-v /home/docker/zookeeper/node2/logs:/logs \
zookeeper

节点3 启动

# 启动命令
docker run -d --restart always \
--name zookeeper-node3 \
--network mynet \
--ip 172.168.0.3 \
-p 2183:2181 \
-e ZOO_MY_ID=3 \
-v /home/docker/zookeeper/node3/conf/zoo.cfg:/conf/zoo.cfg \
-v /home/docker/zookeeper/node3/data:/data \
-v /home/docker/zookeeper/node3/datalog:/datalog \
-v /home/docker/zookeeper/node3/logs:/logs \
zookeeper

6.查看集群状态

# 在容器 zookeeper-node1 中开启一个交互模式的终端
docker exec -it zookeeper-node1 /bin/bash
# 查看 zookeeper 状态 node1为follower
bin/zkServer.sh status

ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

# 在容器 zookeeper-node2 中开启一个交互模式的终端
docker exec -it zookeeper-node2 /bin/bash
# 查看 zookeeper 状态 node2为leader
bin/zkServer.sh status

ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

# 在容器 zookeeper-node3 中开启一个交互模式的终端
docker exec -it zookeeper-node3 /bin/bash
# 查看 zookeeper 状态 node3为follower
bin/zkServer.sh status

ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

二、使用docker-compose搭建

1.拉取镜像

#拉取最新的镜像
docker pull zookeeper 

2.创建 bridge 网络

Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的。我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可。

#创建自定义网络
docker network create --driver bridge --subnet=172.168.0.0/16 --gateway=172.168.1.1 mynet
#查看已存在网络
docker network ls

3.安装 docker-compose

# 运行以下命令以下载 Docker Compose 的当前稳定版本:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.12.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 测试是否安装成功
docker-compose --version	# 检查版本信息
  • 可能出现错误解决
    如果出现类似这种错误: -bash: /usr/local/bin/docker-compose: Text file busy(或者中文: 文本文件忙)
    则文件正在被占用,可用下面命令解除占用后再次执行docker-compose --version
# 找出正在使用该文件的进程
fuser /usr/local/bin/docker-compose

# 杀死该进程
sudo kill -9 PID(上面显示的数字)

# 运行其他命令
docker-compose version

4.编写 docker-compose.yml 脚本

任意目录下新建 docker-compose.yml 文件,复制以下内容,执行命令 docker-compose up -d

version: '2'
services:
 zookeeper01:
  image: zookeeper # 镜像名称
  restart: always # 当发生错误时自动重启
  hostname: zookeeper01
  container_name: zookeeper01
  privileged: true
  ports: # 端口
   - 2181:2181
  volumes: # 挂载数据卷
   - ./zookeeper01/data:/data
   - ./zookeeper01/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 1 # 节点ID
   ZOO_PORT: 2181 # zookeeper端口号
   ZOO_SERVERS: server.1=zookeeper01:2888:3888;2181 server.2=zookeeper02:2888:3888;2181 server.3=zookeeper03:2888:3888;2181 # zookeeper节点列表
  networks:
   mynet: # 自定义网络名
    ipv4_address: 172.168.0.1

 zookeeper02:
  image: zookeeper
  restart: always
  hostname: zookeeper02
  container_name: zookeeper02
  privileged: true
  ports:
   - 2182:2181
  volumes:
   - ./zookeeper02/data:/data
   - ./zookeeper02/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 2
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zookeeper01:2888:3888;2181 server.2=zookeeper02:2888:3888;2181 server.3=zookeeper03:2888:3888;2181
  networks:
   mynet:
    ipv4_address: 172.168.0.2

 zookeeper03:
  image: zookeeper
  restart: always
  hostname: zookeeper03
  container_name: zookeeper03
  privileged: true
  ports:
   - 2183:2181
  volumes:
   - ./zookeeper03/data:/data
   - ./zookeeper03/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 3
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zookeeper01:2888:3888;2181 server.2=zookeeper02:2888:3888;2181 server.3=zookeeper03:2888:3888;2181
  networks:
   mynet:
    ipv4_address: 172.168.0.3

networks:
 mynet: # 自定义网络名
  external: true

若无意外如下为成功

[root@bogon zookeeper]# docker-compose up -d
[+] Running 3/3
 ⠿ Container zookeeper01  Started                                                                                                                2.2s
 ⠿ Container zookeeper02  Started                                                                                                                2.5s
 ⠿ Container zookeeper03  Started 

6.查看集群状态

可用docker ps命令查看容器并用docker exec -it zookeeper01 zkServer.sh status查看zookeeper状态

你可能感兴趣的:(java-zookeeper,docker,zookeeper)