docker搭建Zookeeper集群
# 命令
docker run -d \
--name zookeeper \
--network host \
-v /opt/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/logs:/logs \
zookeeper:3.7
1
2
3
4
5
6
7
2
3
4
5
6
7
以下是基于三台物理机(IP: 10.143.143.101
、10.143.143.102
、10.143.143.103
)通过 Docker 搭建 ZooKeeper 集群的完整方案,整合多篇实践指南的核心步骤,并提供优化建议:
# 🔧 一、环境准备
- 基础要求
- 三台主机均已安装 Docker 和 Docker Compose(≥20.10)。
- 开放端口:
2181
(客户端访问)2888
(节点间通信)3888
(选举端口)。
- 确保三台主机网络互通(禁用防火墙或配置端口白名单)。
# 🐘 二、部署 ZooKeeper 集群(Host 网络模式)
推荐生产环境使用 Host 模式,避免容器网络隔离问题。
# 步骤 1:每台主机创建配置目录
# 三台主机均执行
mkdir -p /data/zookeeper/{conf,data} && cd /data/zookeeper/conf
touch zoo.cfg && touch ../data/myid
1
2
3
2
3
# 步骤 2:配置 zoo.cfg(三台主机相同)
# zoo.cfg 内容
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data
clientPort=2181
quorumListenOnAllIPs=true # 关键!确保跨主机通信
server.101=10.143.143.101:2888:3888
server.102=10.143.143.102:2888:3888
server.103=10.143.143.103:2888:3888
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 步骤 3:配置 myid(每台主机唯一)
- 主机 101:
echo 101 > /data/zookeeper/data/myid
- 主机 102:
echo 102 > /data/zookeeper/data/myid
- 主机 103:
echo 103 > /data/zookeeper/data/myid
# 步骤 4:启动容器(三台主机分别执行)
docker run -d \
--name zookeeper \
--network host \ # 使用主机网络
-v /data/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \
-v /data/zookeeper/data:/data \
zookeeper:3.7 # 推荐稳定版本
1
2
3
4
5
6
2
3
4
5
6
✅ 关键点:
--network host
直接使用宿主机网络栈,避免端口映射问题。quorumListenOnAllIPs=true
确保跨节点通信正常。
# 🌐 三、备选方案:自定义 Docker 网络模式
适用场景:单机多节点测试(需避免端口冲突)。
# 步骤 1:创建共享网络(任一主机执行)
docker network create --subnet=10.10.0.0/24 zk-net
1
# 步骤 2:编写 docker-compose.yml(三台主机配置不同)
# 主机 101 的配置(其他主机修改 IP 和 broker.id)
version: '3.7'
services:
zoo101:
image: zookeeper:3.7
container_name: zoo101
networks:
zk-net:
ipv4_address: 10.10.0.101 # 固定 IP
volumes:
- /data/zookeeper/data:/data
environment:
ZOO_MY_ID: 101
ZOO_SERVERS: "server.101=10.10.0.101:2888:3888;server.102=10.10.0.102:2888:3888;server.103=10.10.0.103:2888:3888"
networks:
zk-net:
external: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
⚠️ 注意:
- 需在三台主机分别配置不同的
ZOO_MY_ID
和容器 IP(如主机 102 用102
和10.10.0.102
)。- 生产环境不推荐此模式,因跨主机网络需额外配置(如 overlay 网络)。
# ✅ 四、集群验证
检查节点状态(任选一台主机)
docker exec -it zookeeper zkServer.sh status
1输出示例:
Mode: leader
(主节点)Mode: follower
(从节点)
测试客户端连接
echo stat | nc 10.143.143.101 2181 # 查看节点状态
1
# ⚙️ 五、生产环境优化建议
- 数据持久化:
- 挂载宿主机目录:
-v /data/zookeeper/data:/data
。
- 挂载宿主机目录:
- 资源限制:
- 限制容器内存:
--memory 1g --cpus 1
。
- 限制容器内存:
- 日志管理:
- 挂载日志目录:
-v /data/zookeeper/logs:/logs
。
- 挂载日志目录:
- 高可用配置:
- 确保
replication-factor >= 3
(容忍单节点故障)。
- 确保
# ⚠️ 六、常见问题解决
- 节点无法选举 Leader
- 检查
myid
文件是否唯一且与server.x
的 ID 匹配。 - 确认防火墙开放
2888
/3888
端口。
- 检查
- 容器跨主机无法通信
- Host 模式:确保宿主机 IP 配置正确(禁用
localhost
)。 - 自定义网络:检查 Docker 跨主机网络配置(如 Calico)。
- Host 模式:确保宿主机 IP 配置正确(禁用
- 启动失败
- 查看日志:
docker logs zookeeper
,重点检查zoo.cfg
语法和 IP 错误。
- 查看日志:
# 💎 总结
方案 | 适用场景 | 关键配置 |
---|---|---|
Host 网络 | 生产环境(多主机) | --network host + 宿主机 IP 绑定 |
自定义网络 | 测试环境(单主机) | 固定容器 IP + 跨主机网络插件 |
推荐选择:三台物理机部署优先采用 Host 网络模式,配置简单且性能接近原生。若需进一步简化运维,可结合 Docker Compose 批量管理。
编辑 (opens new window)
上次更新: 2025/06/24, 00:41:57