> 文档中心 > Dcoker搭建zookeeper集群操作

Dcoker搭建zookeeper集群操作

zookeeper集群操作

  • 使用Docker搭建zookeeper集群环境
    • 启动docker服务
    • 利用阿里云镜像加速器从中央仓库拉取zookeeper的官方镜像
  • 测试启动zookeeper
    • 启动zk的客户端,测试连接zk服务端
  • ZK 集群的搭建
    • 1.创建docker-compose.yml文件
    • 别忘记搭建一个zookeeper集群的网络
      • docker网络
    • 2.在 docker-compose.yml 当前目录下运行
    • 3.查看创建好的zookeeper集群
    • 4.进入集群查看集群状态
    • 如果zk连接失败,可能是上面网络配置有问题,或者可以尝试在data文件下新建一个myid里面存放当前zk的id(docker-compose里面没有配置的话)
    • 参考

使用Docker搭建zookeeper集群环境

在这里插入图片描述

启动docker服务

Dcoker搭建zookeeper集群操作
出现上面的情况,表示docker没有启动,需要手动启动docker服务

service docker start

启动服务的时候报了这个错

[root@localhost ~]# docker start 722cb567ad8bError response from daemon: driver failed programming external connectivity on endpoint mall-user-service (f83187d7e06975dbfb8d83d45a6907bf8e575be0aedee8aed9ea694cc90e5b97):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8184 -j DNAT --to-destination 172.18.6.2:8184 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1))Error: failed to start containers: 722cb567ad8b

这个时候重启docker就行(systemctl docker restart)

附上关闭cent7的防火墙(systemctl stop firewalld)

这里建议将docker设置为守护进程,即开机自启

systemctl enable docker # 开机自动启动dockersystemctl start docker # 启动dockersystemctl restart docker # 重启dokcer

利用阿里云镜像加速器从中央仓库拉取zookeeper的官方镜像

docker pull zookeeper
在这里插入图片描述


测试启动zookeeper

后台启动zookeeper

docker run -d --name my_zk zookeeper

docker logs -f my_zk :查看日志打印,确保启动成功

在这里插入图片描述


启动zk的客户端,测试连接zk服务端

使用 ZK 命令行客户端连接 ZK 因为刚才我们启动的那个 ZK 容器并没有绑定宿主机的端口, 因此我们不能直接访问它. 但是我们可以通过 Docker 的 link 机制来对这个 ZK 容器进行访问. 执行如下命令:

 docker run -it --rm --link my_zookeeper:zookeeper zookeeper zkCli.sh -server zookeeper

启动一个 zookeeper 镜像, 并运行这个镜像内的 zkCli.sh 命令, 命令参数是 “-server zookeeper”

-rm:容器停止运行,就将该容器删除

–link my_zk:zookeeper :在当前客户端容器内,做服务端容器的ip和域名映射,域名为zookeeper


将我们先前启动的名为 my_zk 的容器连接(link) 到我们新建的这个容器上, 并将其主机名命名为 zookeeper

当我们执行了这个命令后, 就可以像正常使用 ZK 命令行客户端一样操作 ZK 服务了.
Dcoker搭建zookeeper集群操作


ZK 集群的搭建

1.创建docker-compose.yml文件

version: '2'services:  zoo1:    image: zookeeper:3.4 # 镜像名称    restart: always # 当发生错误时自动重启    hostname: zoo1    container_name: zoo1    privileged: true    ports: # 端口      - 2181:2181    volumes: # 挂载数据卷      - ./zoo1/data:/data      - ./zoo1/datalog:/datalog     environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 1 # 节点ID      ZOO_PORT: 2181 # zookeeper端口号      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper节点列表    networks:      default: ipv4_address: 192.168.112.11  zoo2:    image: zookeeper:3.4    restart: always    hostname: zoo2    container_name: zoo2    privileged: true    ports:      - 2182:2181    volumes:      - ./zoo2/data:/data      - ./zoo2/datalog:/datalog    environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 2      ZOO_PORT: 2181      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888    networks:      default: ipv4_address: 192.168.112.12  zoo3:    image: zookeeper:3.4    restart: always    hostname: zoo3    container_name: zoo3    privileged: true    ports:      - 2183:2181    volumes:      - ./zoo3/data:/data      - ./zoo3/datalog:/datalog    environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 3      ZOO_PORT: 2181      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888    networks:      default: ipv4_address: 192.168.112.13networks:  default:    external:      name: mynet

这个配置文件会告诉 Docker 分别运行三个 zookeeper 镜像, 并分别将本地的 2181, 2182, 2183 端口绑定到对应的容器的2181端口上. ZOO_MY_ID 和 ZOO_SERVERS 是搭建 ZK 集群需要设置的两个环境变量, 其中 ZOO_MY_ID 表示 ZK 服务的 id, 它是1-255 之间的整数, 必须在集群中唯一. ZOO_SERVERS 是ZK 集群的主机列表.

server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

配置参数解读

server.A=B:C:D

A 是一个数字,表示这个是第几号服务器;

集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。

B 是这个服务器的地址;

C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;

D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口


别忘记搭建一个zookeeper集群的网络

docker network create --driver bridge --subnet 192.168.112.0/16 --gateway 192.168.112.0 mynet

–driver bridge :桥接方式搭建
–subnet 192.168.112.0/16 : 子网
–gateway 192.168.112.0 :网关

通过下面这个命令,可以查看当前我们创建的网络的详细情况:

docker network inspect mynet

在这里插入图片描述


docker网络

Docker有三种网络模式,bridge、host、none,在你创建容器的时候,不指定–network默认是bridge。

这个需要单独学习一下docker的网络通讯

  • bridge:为每一个容器分配IP,并将容器连接到一个docker0虚拟网桥,通过docker0网桥与宿主机通信。也就是说,此模式下,你不能用宿主机的IP+容器映射端口来进行Docker容器之间的通信。
  • host:容器不会虚拟自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。这样一来,Docker容器之间的通信就可以用宿主机的IP+容器映射端口
  • none:无网络。

二、Docker下安装zookeeper(单机 & 集群)


2.在 docker-compose.yml 当前目录下运行

Dcoker搭建zookeeper集群操作


3.查看创建好的zookeeper集群

Dcoker搭建zookeeper集群操作

或在docker-compose.yml文件所在目录输入

docker-compose ps


4.进入集群查看集群状态

docker exec -it zoo1 /bin/bash
 cd bin
zkServer.sh status

在这里插入图片描述


如果zk连接失败,可能是上面网络配置有问题,或者可以尝试在data文件下新建一个myid里面存放当前zk的id(docker-compose里面没有配置的话)

如果是网络配置问题,那么采用下面的docker-compose.yml文件

version: '2'services:  zoo1:    image: zookeeper:3.4 # 镜像名称    restart: always # 当发生错误时自动重启    hostname: zoo1    container_name: zoo1    privileged: true    ports: # 端口      - 2181:2181    volumes: # 挂载数据卷      - ./zoo1/data:/data      - ./zoo1/datalog:/datalog     environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 1 # 节点ID      ZOO_PORT: 2181 # zookeeper端口号      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper节点列表  zoo2:    image: zookeeper:3.4    restart: always    hostname: zoo2    container_name: zoo2    privileged: true    ports:      - 2182:2181    volumes:      - ./zoo2/data:/data      - ./zoo2/datalog:/datalog    environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 2      ZOO_PORT: 2181      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888  zoo3:    image: zookeeper:3.4    restart: always    hostname: zoo3    container_name: zoo3    privileged: true    ports:      - 2183:2181    volumes:      - ./zoo3/data:/data      - ./zoo3/datalog:/datalog    environment:      TZ: Asia/Shanghai      ZOO_MY_ID: 3      ZOO_PORT: 2181      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

或者尝试增加myid
在这里插入图片描述


参考

docker搭建zookeeper 3.5版本集群(超级详细)

Docker方式搭建Zookeeper集群

Docker下安装zookeeper(单机 & 集群)

Docker搭建Zookeeper&Kafka集群