zoukankan      html  css  js  c++  java
  • 【Docker搭建】3. 在Docker中搭建Zookeeper集群

    1. 安装Docker,详细请看安装教程。若已安装,请看 2.

    2. 拉取 Zookeeper 镜像

    docker pull zookeeper

    3. Zookeeper 单节点启动

    docker run --name zk1 -d zookeeper

    4. 修改镜像中 Zookeeper 的配置

    1. 进入镜像
      docker exec -it zk1 /bin/bash

    2. 安装 vim 编辑器

    apt-get update
    apt-get install vim
    
    1. 使用 vi 进入配置文件
      docker vi /conf/zoo.cfg
    • 进入配置文件后,需要添加如下配置,不然下面无法查看 Zookeeper 运行状态
      4lw.commands.whitelist=*

    添加后的配置文件:

    dataDir=/data
    dataLogDir=/datalog
    tickTime=2000
    initLimit=5
    syncLimit=2
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=0
    maxClientCnxns=60
    standaloneEnabled=true
    admin.enableServer=true
    server.1=localhost:2888:3888;2181
    4lw.commands.whitelist=*
    
    1. 保存退出,重启 Zookeeper 容器
      docker restart zk1

    2. 查看 Zookeeper 运行状态
      docker inspect zk1

    3. 该容器的 ip 地址为IPAddres字段
      "IPAddress": "172.17.0.7"

    4. 在宿主机中执行命令, 查看 Zookeeper 运行状态
      echo stat | nc 172.17.0.7 2181

    Latency min/avg/max: 0/0/0
    Received: 1
    Sent: 0
    Connections: 1
    Outstanding: 0
    Zxid: 0x0
    Mode: standalone
    Node count: 5
    
    1. 重新开两个 shell 窗口,分别启动一个 zookeeper 服务
    • shell2:
      docker run --name zk2 -d zookeeper

    • shell3:
      docker run --name zk3 -d zookeeper

    1. 分别进入这两台容器
    • shell2:
      docker exec -it zk2 /bin/bash

    • shell3:
      docker exec -it zk3 /bin/bash

    1. 一起安装 vim 编辑器
    apt-get update
    apt-get install vim
    
    1. 安装完毕后,三台容器都使用 vi 进入配置文件
      docker vi /conf/zoo.cfg

    2. 修改配置文件,这里以 zk1 为样式:

    dataDir=/data
    dataLogDir=/datalog
    tickTime=2000
    initLimit=5
    syncLimit=2
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=0
    maxClientCnxns=60
    standaloneEnabled=true
    admin.enableServer=true
    4lw.commands.whitelist=*
    clientPort=2181
    server.1=0.0.0.0:2888:3888
    server.2=172.17.0.8:2888:3888
    server.3=172.17.0.9:2888:3888
    

    这里请注意: zk1 容器对应的本机ip地址,也就是 server.1 的ip地址为0.0.0.0。并且其他集群容器的ip也因人而异,这里只是拿我本机的 172.17.0.7 做示范。大家还是要用 docker inspect zk1 查看自己的容器 ip 地址哦~
    如果是 zk2 的配置文件,则应是:

    clientPort=2181
    server.1=172.17.0.7:2888:3888
    server.2=0.0.0.0:2888:3888
    server.3=172.17.0.9:2888:3888
    

    再次注意:无论 zk 几,clientPort是不需要改的,统一用2181就好。

    1. 接着修改zk容器的myid。zk1 的 myid 默认为 1,我们不动它,这里主要把 zk2 和 zk3 的myid改成对应的 serverid

    vi /data/myid

    如果是 zk2 ,就把1删掉,输入2。 zk3 同理。

    5. 全部保存退出,重启容器

    docker restart zk1
    docker restart zk2
    docker restart zk3
    

    6. 查看集群是否部署成功(容器ip地址因人而异)

    echo stat | nc 172.17.0.7 2181
    echo stat | nc 172.17.0.8 2181
    echo stat | nc 172.17.0.9 2181

    [root@VM-0-16-centos ~]# echo stat | nc 172.17.0.7 2181
    Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
    Clients:
     /172.17.0.1:34874[0](queued=0,recved=1,sent=0)
     /175.0.122.47:53135[1](queued=0,recved=12,sent=12)
    
    Latency min/avg/max: 1/6.75/19
    Received: 13
    Sent: 12
    Connections: 2
    Outstanding: 0
    Zxid: 0x300000004
    Mode: follower
    Node count: 8
    [root@VM-0-16-centos ~]# echo stat | nc 172.17.0.8 2181
    Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
    Clients:
     /172.17.0.1:36698[0](queued=0,recved=1,sent=0)
    
    Latency min/avg/max: 0/0.0/0
    Received: 1
    Sent: 0
    Connections: 1
    Outstanding: 0
    Zxid: 0x300000004
    Mode: leader
    Node count: 8
    Proposal sizes last/min/max: 664/36/664
    [root@VM-0-16-centos ~]# echo stat | nc 172.17.0.9 2181
    Zookeeper version: 3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
    Clients:
     /172.17.0.1:56788[0](queued=0,recved=1,sent=0)
    
    Latency min/avg/max: 0/0.0/0
    Received: 1
    Sent: 0
    Connections: 1
    Outstanding: 0
    Zxid: 0x300000004
    Mode: follower
    Node count: 8
    

    可以看到 zk2 成了leader, zk1 和 zk3 为follwer。集群初步部署成功。

    7. 修改容器映射端口

    修改容器映射端口本来是需要在通过镜像运行成容器时通过 -p 宿主机端口:容器 端口指定的,但是前面我没有指定,直接运行了,导致后面通过 Java API 操作不了,这时候就需要将宿主机端口映射到容器端口上,这样就可以通过 宿主机ip + 宿主机与容器映射的端口 访问了。

    1. 查出要修改的容器id
      docker ps
    [root@VM-0-16-centos ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                  NAMES
    f0fbc33f40c6        zookeeper           "/docker-entrypoint.…"   29 hours ago        Up 31 minutes       2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp                 zk3
    b458e209c005        zookeeper           "/docker-entrypoint.…"   29 hours ago        Up 31 minutes       2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp                 zk2
    90e7ee5bbbae        zookeeper           "/docker-entrypoint.…"   29 hours ago        Up 31 minutes       2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp   zk1
    

    找到对应的三个 zk 容器ID分别为

    • 90e7ee5bbbae zk1
    • b458e209c005 zk2
    • f0fbc33f40c6 zk3
    1. 停止3个容器
    docker stop zk1
    docker stop zk2
    docker stop zk3
    
    1. 停止Docker服务
      systemctl stop docker

    2. 进入宿主机中的容器目录
      cd /var/lib/docker/containers

    3. 修改配置文件
      查看所有的容器,前面的容器id就是这些文件前一部分的文件名
      ls -al

    [root@VM-0-16-centos containers]# ls -al
    total 44
    drwx-----x 11 root root 4096 Mar  8 17:36 .
    drwx--x--x 14 root root 4096 Mar  8 11:27 ..
    drwx-----x  4 root root 4096 Mar  8 11:27 0f83816cf30aa27a1735d771f1e7b0114677005911c64d1b3840039b23559bff
    drwx------  4 root root 4096 Mar  8 11:27 5d4d66b999ac246b32669bb790fb76015261cabd47a098cd9a85046bbd81ec19
    drwx-----x  4 root root 4096 Mar  9 15:31 617d7e4721db4e5a175882d90d024621de39712841c866d60279dffb856b0561
    drwx------  4 root root 4096 Mar  8 11:27 89bc5384ee62b95c64f8247b0af5eb2c7b0ae287cb444a7ddd7e2ecd0aee2764
    drwx-----x  4 root root 4096 Mar  9 15:31 90e7ee5bbbaedb0d4cdde377583e224ff2142198e480e3da13789c8d8f41b067
    drwx-----x  4 root root 4096 Mar  8 11:27 a06988405363fd774e18e1a5bdcf8d108d3767fd947e5f12214db2ccb43992b9
    drwx-----x  4 root root 4096 Mar  9 15:31 b458e209c00501b8bd7ddd34eddacbe6800ce6e0ad69f9eb9a860a4d7e0999a3
    drwx-----x  4 root root 4096 Mar  8 11:28 dac93cc33388f0c63a71475bbcc83e0c0f410c9e011bb9f1849adc17edf915d6
    drwx-----x  4 root root 4096 Mar  9 15:31 f0fbc33f40c62e5745244b12269b303fbb6c4f3965281c7954e304f3681a9855
    

    根据前面查到的容器id,进入hostconfig.json然后修改对应的配置

    vi 容器ID/hostconfig.json
    # 如果之前没有端口映射, 应该有这样的一段:
    "PortBindings":{}
    # 增加一个映射, 这样写:
    "PortBindings":{"2181/tcp":[{"HostIp":"","HostPort":"2181"}]}
    # 前一个数字是容器端口, 后一个是宿主机端口. 
    # 而修改现有端口映射更简单, 把端口号改掉就行.
    这里以zk1为例,其他两个分别修改为 "2182/tcp":[{"HostIp":"","HostPort":"2182"}] ,"2183/tcp":[{"HostIp":"","HostPort":"2183"}]
    
    1. 重新启动
    • 启动 docker 服务
      systemctl start docker

    • 启动三个容器

    docker start zk1
    docker start zk2
    docker start zk3
    

    外部客户端就可以通过 宿主机ip + 宿主机 与容器映射的端口连接到该Zookeeper集群了

    8. 常用命令

    启动容器
    docker start zk?

    停止容器
    docker stop zk?

    重启容器
    docker restart zk?

    进入容器
    docker exec -it zk?bash

    删除容器
    docker rm zk?

    查看日志
    docker logs -f zk?

  • 相关阅读:
    ExtJs 4 的filefield上传后 返回值success接受不正常
    winform treeview 通过节点名称添加子节点
    Live Writer Test
    mysqlcluster笔记
    ExtJS中form提交之后获取返回的json值
    MYSQL大小写(由于数据由windows迁移到Linux导致)
    ORACLE分科目统计每科前三名的学生的语句
    一列数据横排显示
    Oracle11g使用exp导出空表
    myeclipse2015卸载、安装、破解全过程-----myeclipse2015
  • 原文地址:https://www.cnblogs.com/zilongmao/p/14486291.html
Copyright © 2011-2022 走看看