用Docker快速搭建分布式锁服务的关键是选对中间件(Redis或ZooKeeper)、配好核心参数、用成熟客户端(Redisson/Curator)封装锁逻辑;单节点容器即可支撑中小规模业务,Redis适合高吞吐秒杀场景,ZooKeeper适合强一致任务调度场景。

用 Docker 快速搭建基于容器的分布式锁服务,关键不是堆集群,而是选对中间件、配好核心参数、再用成熟客户端封装锁逻辑。单节点 Redis 或 ZooKeeper 容器就能支撑中小规模业务,开发测试和初期上线都够用。
Redis 方案:轻量高吞吐,适合秒杀、订单幂等
Redis 是最常用的选择,启动快、响应低,配合 Redisson 客户端能自动续期、防死锁:
- 准备配置文件 redis.conf,至少启用:bind 0.0.0.0(允许远程访问)、protected-mode no、requirepass yourpwd(必须设密码)、appendonly yes(AOF 持久化)
- 运行容器,挂载配置和数据目录:
docker run -d --name redis-lock -p 6379:6379 \<br> -v /opt/redis/conf/redis.conf:/etc/redis/redis.conf \<br> -v /opt/redis/data:/data \<br> redis:7 redis-server /etc/redis/redis.conf - 应用端引入 redisson-spring-boot-starter,在 application.yml 中配置 host、port、password,并指定 redisson.yml 启用单节点模式与 JSON 序列化
- 代码中直接调用:
RLock lock = redissonClient.getLock("order:1001");<br> lock.lock(30, TimeUnit.SECONDS); // 自动看门狗续期
ZooKeeper 方案:强一致可靠,适合任务调度、主从选举
ZooKeeper 天然支持临时顺序节点,连接断开即自动释放锁,无需手动设超时,更“零感知”:
- 拉取官方镜像:
docker pull zookeeper:3.5.6 - 创建 zoo.cfg 文件,关键项包括:tickTime=2000、initLimit=10、syncLimit=5、dataDir=/data、clientPort=2181
- 启动容器并挂载配置与数据目录:
docker run -d --name zk -p 2181:2181 \<br> -v /opt/zk/conf/zoo.cfg:/conf/zoo.cfg \<br> -v /opt/zk/data:/data \<br> zookeeper:3.5.6
注意:配置文件要挂载到 /conf/zoo.cfg,不能只挂载目录 - Java 项目引入 curator-recipes(版本需与 ZooKeeper 服务端一致),用
InterProcessMutex创建可重入锁,加锁即创建临时顺序节点,断连自动清理
验证与避坑要点
不跑通验证,等于没搭成:
- Redis 验证:两个终端同时执行
redis-cli -a yourpwd -h 127.0.0.1 SETNX lock:test 1,一个返回 (integer) 1(抢到),另一个返回 0(失败),再用EXPIRE lock:test 5测试过期释放 - ZooKeeper 验证:进容器执行
zkCli.sh,用create -e /lock/test ""创建临时节点,然后quit断开连接,再连进去用ls /lock确认节点已消失 - 务必禁用 protected-mode 并设置 requirepass,否则公网暴露等于裸奔
- Redis 持久化建议开启 AOF;ZooKeeper 的 dataDir 和 dataLogDir 必须挂载宿主机目录,否则容器重启后锁状态丢失
选型建议:别硬套,按场景定
没有绝对优劣,只有是否匹配:
- 要快、要简单、QPS 高 → 选 Redis + Redisson,SETNX 底层+自动续期兜底
- 要强一致、要自动失效、要监听通知 → 选 ZooKeeper + Curator,临时顺序节点天然适配锁语义
- 不用 RedLock 或多节点集群起步,单容器足够验证逻辑;后续扩容再考虑哨兵、Cluster 或 ZooKeeper 集群


















