使用Docker部署ZooKeeper三节点集群需配置统一zoo.cfg、唯一myid、自定义网络zk-net,分别启动zk1/zk2/zk3容器并映射不同客户端端口,通过stat命令验证Mode为leader/follower即成功。

使用 Docker 部署 ZooKeeper 集群并不复杂,关键在于理解其集群模式(Quorum)的通信机制,并确保容器间网络互通、配置一致、ID 唯一。下面以 3 节点集群为例,给出可直接运行的实战步骤。
准备 ZooKeeper 配置文件
ZooKeeper 集群依赖 zoo.cfg 中的 server.x 配置实现节点发现。每个节点需有唯一 myid(1~255),且必须与配置中对应。
在宿主机新建目录(如 zk-cluster),为每个节点创建子目录:
zk1/conf/zoo.cfgzk2/conf/zoo.cfgzk3/conf/zoo.cfg
以 zk1/conf/zoo.cfg 为例,内容如下:
tickTime=2000 initLimit=10 syncLimit=5 dataDir=/data clientPort=2181 autopurge.snapRetainCount=3 autopurge.purgeInterval=0 <h1>集群节点定义(所有节点配置完全相同)</h1><p>server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
再分别创建 zk1/data/myid(内容为 1)、zk2/data/myid(内容为 2)、zk3/data/myid(内容为 3)。
使用自定义网络启动容器
务必使用 Docker 自定义桥接网络,避免使用默认 bridge 网络导致 DNS 解析失败或端口映射干扰集群通信。
执行:
docker network create zk-net
然后依次启动三个容器(注意挂载路径和主机名):
docker run -d \ --name zk1 \ --network zk-net \ --hostname zk1 \ -v $(pwd)/zk1/conf:/conf \ -v $(pwd)/zk1/data:/data \ -p 2181:2181 \ -e ZOO_MY_ID=1 \ --restart always \ zookeeper:3.8 <p>docker run -d \ --name zk2 \ --network zk-net \ --hostname zk2 \ -v $(pwd)/zk2/conf:/conf \ -v $(pwd)/zk2/data:/data \ -p 2182:2181 \ -e ZOO_MY_ID=2 \ --restart always \ zookeeper:3.8</p><p>docker run -d \ --name zk3 \ --network zk-net \ --hostname zk3 \ -v $(pwd)/zk3/conf:/conf \ -v $(pwd)/zk3/data:/data \ -p 2183:2181 \ -e ZOO_MY_ID=3 \ --restart always \ zookeeper:3.8
说明:
- --hostname 必须与 zoo.cfg 中的 server.x 主机名严格一致;
- -e ZOO_MY_ID 是官方镜像支持的环境变量,会自动写入 /data/myid(若已挂载则以挂载内容为准);
- 客户端端口(2181)对外映射不同(2181/2182/2183),避免冲突;
- 集群内部通信端口 2888(Follower 连接 Leader)和 3888(Leader 选举)无需映射到宿主机,仅需容器内互通。
验证集群状态
进入任一容器执行四字命令检查:
docker exec zk1 bash -c "echo stat | nc localhost 2181 | grep Mode"
正常应输出类似 Mode: follower 或 Mode: leader。也可用:
docker exec zk1 bash -c "echo mntr | nc localhost 2181"
查看完整监控指标,重点关注 zk_server_state、zk_followers、zk_synced_followers 等字段。
从宿主机连接测试(需安装 zkCli.sh 或使用 telnet):
echo "ls /" | nc localhost 2181
常见问题与避坑提示
容器启动后立即退出:检查 myid 文件是否存在、内容是否为纯数字且在 1–255 之间;确认 zoo.cfg 中的 server.x 主机名能否被容器内 DNS 解析(可用 ping zk2 测试)。
节点显示 standalone 模式:说明未成功加入集群。多因 zoo.cfg 配置不一致、网络不通、或 myid 与 server.x 不匹配。
Java NIO 异常或连接超时:ZooKeeper 3.8+ 默认启用 TLS,若未配置证书,建议显式禁用(在 zoo.cfg 加入):
ssl.quorum.enabled=false
或改用兼容性更稳的 zookeeper:3.7 镜像。
数据持久化建议:生产环境务必挂载 /data 和 /datalog(如有),避免容器重建丢失状态。



















