docker 搭建 zookeeper 集群

docker 搭建 zookeeper 集群,第1张

文章目录
  • 下载官方zookeeper镜像
    • 搜索官方镜像
    • 下载官方镜像
    • 查看镜像元数据
  • 创建docker网络
    • 新建bridge网络
  • 创建挂载路径
  • 创建容器并加入网络
    • 查看节点状态
  • 集群生成脚本
  • 参考文献

下载官方zookeeper镜像 搜索官方镜像
$ docker search zookeeper

NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
zookeeper                          Apache ZooKeeper is an open-source server wh…   1216      [OK]       
...
下载官方镜像
$ docker pull zookeeper

Using default tag: latest
latest: Pulling from library/zookeeper
a2abf6c4d29d: Pull complete 
2bbde5250315: Pull complete 
202a34e7968e: Pull complete 
4e4231e30efc: Pull complete 
707593b95343: Pull complete 
b070e6dedb4b: Pull complete 
46e5380f3905: Pull complete 
8b7e330117e6: Pull complete 
Digest: sha256:2c8c5c2db6db22184e197afde13e33dad849af90004c330f20b17282bcd5afd7
Status: Downloaded newer image for zookeeper:latest
docker.io/library/zookeeper:latest
查看镜像元数据
$ docker inspect zookeeper
[
    {
        "Id": "sha256:36c607e7b14df07e3976ebe6216db9aabd41ef0884f73d4e6b5ccf5d44d9c195",
        "RepoTags": [
            "zookeeper:latest"
        ],
        "RepoDigests": [
            "zookeeper@sha256:2c8c5c2db6db22184e197afde13e33dad849af90004c330f20b17282bcd5afd7"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-22T18:17:20.28518457Z",
        "Container": "086e5b0d9ac03c033e92402c9a0ac04376e6c4530f798549645a0fb834edc180",
        "ContainerConfig": {
            "Hostname": "086e5b0d9ac0",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "2181/tcp": {},
                "2888/tcp": {},
                "3888/tcp": {},
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/apache-zookeeper-3.7.0-bin/bin",
                "JAVA_HOME=/usr/local/openjdk-11",
                "LANG=C.UTF-8",
                "JAVA_VERSION=11.0.13",
                "ZOO_CONF_DIR=/conf",
                "ZOO_DATA_DIR=/data",
                "ZOO_DATA_LOG_DIR=/datalog",
                "ZOO_LOG_DIR=/logs",
                "ZOO_TICK_TIME=2000",
                "ZOO_INIT_LIMIT=5",
                "ZOO_SYNC_LIMIT=2",
                "ZOO_AUTOPURGE_PURGEINTERVAL=0",
                "ZOO_AUTOPURGE_SNAPRETAINCOUNT=3",
                "ZOO_MAX_CLIENT_CNXNS=60",
                "ZOO_STANDALONE_ENABLED=true",
                "ZOO_ADMINSERVER_ENABLED=true",
                "ZOOCFGDIR=/conf"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"zkServer.sh\" \"start-foreground\"]"
            ],
            "Image": "sha256:034a6fb5e9094c790fd637c3b8098df0dbeacd0327461859e79f3ca268f4e6c9",
            "Volumes": {
                "/data": {},
                "/datalog": {},
                "/logs": {}
            },
            "WorkingDir": "/apache-zookeeper-3.7.0-bin",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "2181/tcp": {},
                "2888/tcp": {},
                "3888/tcp": {},
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/apache-zookeeper-3.7.0-bin/bin",
                "JAVA_HOME=/usr/local/openjdk-11",
                "LANG=C.UTF-8",
                "JAVA_VERSION=11.0.13",
                "ZOO_CONF_DIR=/conf",
                "ZOO_DATA_DIR=/data",
                "ZOO_DATA_LOG_DIR=/datalog",
                "ZOO_LOG_DIR=/logs",
                "ZOO_TICK_TIME=2000",
                "ZOO_INIT_LIMIT=5",
                "ZOO_SYNC_LIMIT=2",
                "ZOO_AUTOPURGE_PURGEINTERVAL=0",
                "ZOO_AUTOPURGE_SNAPRETAINCOUNT=3",
                "ZOO_MAX_CLIENT_CNXNS=60",
                "ZOO_STANDALONE_ENABLED=true",
                "ZOO_ADMINSERVER_ENABLED=true",
                "ZOOCFGDIR=/conf"
            ],
            "Cmd": [
                "zkServer.sh",
                "start-foreground"
            ],
            "Image": "sha256:034a6fb5e9094c790fd637c3b8098df0dbeacd0327461859e79f3ca268f4e6c9",
            "Volumes": {
                "/data": {},
                "/datalog": {},
                "/logs": {}
            },
            "WorkingDir": "/apache-zookeeper-3.7.0-bin",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 277821092,
        "VirtualSize": 277821092,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/49465b4bfe0763fa582987f66ace8500f7855a68e5d78e97c015d2a59f34d983/diff:/var/lib/docker/overlay2/2ce2eda42d094c73fb77c3957ca0c164a3629c53a50048319fbde62a1e5e05b8/diff:/var/lib/docker/overlay2/b67d2bc434b170f11b0e1549e68446ada1234db1acc42fc58284f745d5a93204/diff:/var/lib/docker/overlay2/b82b007f28635d8601982206284c3aa1e0ca29f40f75dc03ed48f901df64dea7/diff:/var/lib/docker/overlay2/63aa7a8639204ccb5c393d04ab28c11048fd0cb367e9264f9e710e1a08fbbdde/diff:/var/lib/docker/overlay2/a6ffcae54ad0cbbc9d04b1bf46d14c13dc92c533223464e2eb86acc92df509bf/diff:/var/lib/docker/overlay2/968d924353f2cf0f7226df1d44a28557ae4a473e853a4cfea72a49bf79feb3ce/diff",
                "MergedDir": "/var/lib/docker/overlay2/decf5b31c5806d0d0065958867be916743e953ee67518bddaabc4a677a822036/merged",
                "UpperDir": "/var/lib/docker/overlay2/decf5b31c5806d0d0065958867be916743e953ee67518bddaabc4a677a822036/diff",
                "WorkDir": "/var/lib/docker/overlay2/decf5b31c5806d0d0065958867be916743e953ee67518bddaabc4a677a822036/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
                "sha256:afda989d53ee25f18b7810206b39580df30518043d1f34f1d514f665ba8026f4",
                "sha256:c3aa798711862658bf26a9c0d64e917e737ddfe89558554b02d22022694f45d7",
                "sha256:d0771a598f012fdd2b325314c006c37843f6be2f59d30a862a68c6c17f27e2b8",
                "sha256:2490c30bbef3f75a4c1a4874b9eb550f90eec35c4ec098e4734ae6e52d67a6fa",
                "sha256:00510f82f2cdfb4a39f994b7461d1bad936998a355f7baac29821ef92a4f5ad4",
                "sha256:b2f57731deef9b512cf5cef75f1f373c4869e6e6d9740181f31cad4aa564b890",
                "sha256:73d59a6eacae0c15469ec7fa4f219be70cc9a2bda526b181340903d200531cc8"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

通过元数据,主要是了解如下信息:

  • 暴露端口:
"ExposedPorts": {
	"2181/tcp": {},
	"2888/tcp": {},
	"3888/tcp": {},
	"8080/tcp": {}
},
  • 挂载文件位置:
"Volumes": {
	"/data": {},
	"/datalog": {},
	"/logs": {}
},
  • 环境变量,如
创建docker网络

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

  • bridge:为每一个容器分配IP,并将容器连接到一个docker0虚拟网桥,通过docker0网桥与宿主机通信。此模式下,不能用宿主机IP+容器映射端口来进行Docker容器之间的通信。
  • host:容器不会虚拟自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。此模式下,Docker容器之间的通信使用宿主机IP+容器映射端口
  • none:无网络
新建bridge网络
$ docker network create --driver bridge --subnet=172.88.0.0/16 --gateway=172.88.0.1 bnet

$ docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
0eb12f8968c5   bnet          bridge    local

$ docker inspect 0eb12f8968c5
[
    {
        "Name": "bnet",
        "Id": "0eb12f8968c5b102ca6955f8ad31be525a1f89d0da7c3e8e24bf492e35c9bbde",
        "Created": "2022-04-19T19:17:23.127433237+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.88.0.0/16",
                    "Gateway": "172.88.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
创建挂载路径

实际路径看情况修改,假设建立3节点集群

mkdir -p $PWD/zookeeper_nodes/node_1
mkdir -p $PWD/zookeeper_nodes/node_2
mkdir -p $PWD/zookeeper_nodes/node_3
创建容器并加入网络
docker run -d -p 2181:2181 --name zookeeper_1 --privileged --restart always --network bnet --ip 172.88.0.2 \
-v $PWD/zookeeper_nodes/node_1/volumes/data:/data \
-v $PWD/zookeeper_nodes/node_1/volumes/datalog:/datalog \
-v $PWD/zookeeper_nodes/node_1/volumes/logs:/logs \
-e ZOO_MY_ID=1 \
-e "ZOO_SERVERS=server.1=172.88.0.2:2888:3888;2181 server.2=172.88.0.3:2888:3888;2181 server.3=172.88.0.4:2888:3888;2181" \
zookeeper:latest

docker run -d -p 2182:2181 --name zookeeper_2 --privileged --restart always --network bnet --ip 172.88.0.3 \
-v $PWD/zookeeper_nodes/node_2/volumes/data:/data \
-v $PWD/zookeeper_nodes/node_2/volumes/datalog:/datalog \
-v $PWD/zookeeper_nodes/node_2/volumes/logs:/logs \
-e ZOO_MY_ID=2 \
-e "ZOO_SERVERS=server.1=172.88.0.2:2888:3888;2181 server.2=172.88.0.3:2888:3888;2181 server.3=172.88.0.4:2888:3888;2181" \
zookeeper:latest

docker run -d -p 2183:2181 --name zookeeper_3 --privileged --restart always --network bnet --ip 172.88.0.4 \
-v $PWD/zookeeper_nodes/node_3/volumes/data:/data \
-v $PWD/zookeeper_nodes/node_3/volumes/datalog:/datalog \
-v $PWD/zookeeper_nodes/node_3/volumes/logs:/logs \
-e ZOO_MY_ID=3 \
-e "ZOO_SERVERS=server.1=172.88.0.2:2888:3888;2181 server.2=172.88.0.3:2888:3888;2181 server.3=172.88.0.4:2888:3888;2181" \
zookeeper:latest

查看节点状态
$ docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED         STATUS         PORTS                                                                     NAMES
614f30e10235   zookeeper:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   2888/tcp, 3888/tcp, 8080/tcp, 0.0.0.0:2183->2181/tcp, :::2183->2181/tcp   zookeeper_3
5aac903dae27   zookeeper:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   2888/tcp, 3888/tcp, 8080/tcp, 0.0.0.0:2182->2181/tcp, :::2182->2181/tcp   zookeeper_2
67b2fd1b3df6   zookeeper:latest   "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   2888/tcp, 3888/tcp, 8080/tcp, 0.0.0.0:2181->2181/tcp, :::2181->2181/tcp   zookeeper_1

$ docker exec -it zookeeper_1 bash
root@67b2fd1b3df6:/apache-zookeeper-3.7.0-bin# ./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 exec -it zookeeper_2 bash
root@5aac903dae27:/apache-zookeeper-3.7.0-bin# ./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

$ docker exec -it zookeeper_3 bash
root@614f30e10235:/apache-zookeeper-3.7.0-bin# ./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

此外,可以测试创建节点,此不赘述

集群生成脚本
#!/bin/bash

echo "删除所有zookeeper容器"
sudo docker ps -a | grep zookeeper_ | awk '{print }' | xargs -I {} sudo docker rm -f {}

# 设置节点个数
num_nodes=3
if [ $# -ge 1 ] && [  -ge 0 ];then
    num_nodes=
fi

# 设置存储位置
data_path=/data/zookeeper_nodes
if [ -d $data_path ];then
    sudo rm -rf $data_path
fi

# 设置集群IP
ip_prefix="172.88.0"
servers=""
for i in `seq $num_nodes`; do
    servers="$servers server.$i=zookeeper_$i:2888:3888;2181"
done
servers=${servers#* }

temp_file="init_containers.sh"
echo > $temp_file

for i in `seq $num_nodes`; do
    cmd="sudo docker run -d 
    -p `expr 2181 + $i`:2181 
    --name zookeeper_$i 
    --hostname zookeeper_$i 
    --privileged 
    --restart always 
    --network bnet 
    --ip $ip_prefix.`expr $i + 1` 
    -v $data_path/zookeeper_nodes/node_$i/volumes/data:/data 
    -v $data_path/zookeeper_nodes/node_$i/volumes/datalog:/datalog 
    -v $data_path/zookeeper_nodes/node_$i/volumes/logs:/logs 
    -e ZOO_MY_ID=$i 
    -e ZOO_SERVERS='$servers' 
    zookeeper:latest"
    echo $cmd >> $temp_file
    echo >> $temp_file
done
echo "创建具有$num_nodes个节点的zookeeper集群"
sh $temp_file && rm -f $temp_file

参考文献

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存