Docker Compose 部署 ZooKeeper 集群完整指南
以下是使用 Docker Compose 部署三节点 ZooKeeper 集群的完整流程:
准备工作
-
安装 Docker 和 Docker Compose
# Ubuntu 示例 sudo apt update sudo apt install docker.io docker-compose sudo usermod -aG docker $USER # 将当前用户加入docker组 newgrp docker # 刷新组权限
-
创建工作目录
mkdir zookeeper-cluster cd zookeeper-cluster
创建配置文件
创建 compose.yaml
文件
# zookeeper-cluster/compose.yaml
services:
zoo1:
image: zookeeper:3.9
hostname: zoo1
container_name: zoo1
ports:
- "2181:2181" # 客户端端口
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ./data/zoo1/data:/data
- ./data/zoo1/logs:/datalog
zoo2:
image: zookeeper:3.9
hostname: zoo2
container_name: zoo2
ports:
- "2182:2181" # 客户端端口(不同外部端口)
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
volumes:
- ./data/zoo2/data:/data
- ./data/zoo2/logs:/datalog
zoo3:
image: zookeeper:3.9
hostname: zoo3
container_name: zoo3
ports:
- "2183:2181" # 客户端端口(不同外部端口)
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
volumes:
- ./data/zoo3/data:/data
- ./data/zoo3/logs:/datalog
创建数据目录结构
# 创建数据存储目录
mkdir -p data/zoo1/{data,logs}
mkdir -p data/zoo2/{data,logs}
mkdir -p data/zoo3/{data,logs}
# 创建每个节点的myid文件
echo 1 > data/zoo1/data/myid
echo 2 > data/zoo2/data/myid
echo 3 > data/zoo3/data/myid
启动 ZooKeeper 集群
# 启动所有服务
docker compose up -d
# 查看运行状态
docker compose ps
# 预期输出:
# NAME COMMAND SERVICE STATUS PORTS
# zoo1 "/docker-entrypoint.…" zoo1 running 0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
# zoo2 "/docker-entrypoint.…" zoo2 running 0.0.0.0:2182->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
# zoo3 "/docker-entrypoint.…" zoo3 running 0.0.0.0:2183->2181/tcp, 2888/tcp, 3888/tcp, 8080/tcp
验证集群状态
检查节点日志
docker compose logs zoo1
docker compose logs zoo2
docker compose logs zoo3
# 在日志中寻找类似内容:
# [INFO] [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:QuorumPeer@915] - LEADING - LEADER ELECTION TOOK - 204 MS
连接到任意节点
# 连接到 zoo1
docker exec -it zoo1 zkCli.sh -server 127.0.0.1:2181
# 在 Zookeeper CLI 中运行:
[zk: 127.0.0.1:2181(CONNECTED) 0] stat
# 查看输出中的 Mode: leader 或 Mode: follower
[zk: 127.0.0.1:2181(CONNECTED) 1] quit
检查集群状态
# 使用四字命令检查集群状态
echo stat | nc localhost 2181 | grep Mode
echo stat | nc localhost 2182 | grep Mode
echo stat | nc localhost 2183 | grep Mode
# 预期输出(一个leader,两个follower):
# Mode: leader
# Mode: follower
# Mode: follower
管理命令
# 停止集群
docker compose down
# 重新启动集群
docker compose up -d
# 删除集群和数据(谨慎使用)
docker compose down -v
文件结构说明
zookeeper-cluster/
├── compose.yaml # Docker Compose 配置文件
└── data/ # 数据存储目录
├── zoo1/ # 节点1数据
│ ├── data/ # 包含 myid 文件
│ └── logs/ # 事务日志
├── zoo2/ # 节点2数据
│ ├── data/
│ └── logs/
└── zoo3/ # 节点3数据
├── data/
└── logs/
关键注意事项
-
myid 文件:每个节点必须在
/data
目录中有对应的myid
文件,内容为节点ID(1,2,3) -
端口映射:
- 客户端端口:2181, 2182, 2183 映射到三个节点的 2181
- 内部通信端口(2888/3888)不需要暴露,容器间通过 Docker 网络通信
-
服务发现:
- 集群节点通过
hostname
(zoo1, zoo2, zoo3)互相发现 - Docker Compose 会自动创建专用网络
- 集群节点通过
-
持久化存储:
- 数据存储在本地
data/
目录中 - 容器重启后数据不会丢失
- 数据存储在本地
-
版本兼容性:
- 使用官方 ZooKeeper 3.9 镜像
- 支持 Docker Compose v2.0+
现在三节点 ZooKeeper 集群已经部署完成!可以使用客户端通过 localhost:2181, 2182 或 2183 连接集群。