docker-compose 部署rabbitmq集群
·
✅安装
✅ 项目结构(每台机器)
假设你的 docker-compose.yml 在如下结构下:
/opt/soft/
├── docker-compose.yml
└── rabbitmq/
├── data/
└── erlang.cookie
✅ 统一配置说明
| 项目 | 值 |
|---|---|
| 镜像 | rabbitmq:4.0.4-management |
| 用户名密码 | rabbit / 123456 |
| cookie 内容 | RABBITMQCLUSTERCOOKIE(统一) |
| UID:GID | 999:999(RabbitMQ容器内用户) |
| 主机 IP | 192.168.1.60 / .61 / .62 |
| 节点名 | rabbit1 / rabbit2 / rabbit3 |
✅ 每台宿主机 docker-compose.yml
只需将以下内容 复制粘贴到你的 docker-compose.yml 末尾即可,不影响其他服务。
🧾 192.168.1.60(rabbit0)
rabbitmq:
image: rabbitmq:4.0.4
container_name: rabbitmq
restart: always
network_mode: host
hostname: rabbit0
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq
- ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
🧾 192.168.1.61(rabbit1)
rabbitmq:
image: rabbitmq:4.0.4
container_name: rabbitmq
restart: always
network_mode: host
hostname: rabbit1
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq
- ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
🧾 192.168.1.62(rabbit2)
rabbitmq:
image: rabbitmq:4.0.4
container_name: rabbitmq
restart: always
network_mode: host
hostname: rabbit2
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: "-rabbitmq_management_agent disable_metrics_collector false"
TZ: Asia/Shanghai
volumes:
- ./rabbitmq/data:/var/lib/rabbitmq
- ./rabbitmq/erlang.cookie:/var/lib/rabbitmq/.erlang.cookie
✅ 生成并设置 .erlang.cookie(三台一样)
# 切换到项目根目录
cd /opt/soft
# 创建 rabbitmq 文件夹(如果还没)
mkdir -p rabbitmq/data
# 写入 cookie 文件
echo "RABBITMQCLUSTERCOOKIE" > rabbitmq/erlang.cookie
# 设置权限(必须)
chmod 400 rabbitmq/erlang.cookie
# 设置所有者(必须是 999:999)
chown 999:999 rabbitmq/erlang.cookie
✅ /etc/hosts 配置(三台都要配置)
三台机器上都执行,确保可以互相通过 hostname 通信
echo "
192.168.1.60 rabbit0
192.168.1.61 rabbit1
192.168.1.62 rabbit2
" >> /etc/hosts
✅ 启动 RabbitMQ(每台)
docker-compose up -d rabbitmq
✅ 加入集群命令(只在 rabbit1 / rabbit2 上执行)
👉 在 rabbit1 上执行(192.168.1.61)
docker exec -it rabbitmq rabbitmqctl stop_app
docker exec -it rabbitmq rabbitmqctl join_cluster rabbit@rabbit0
docker exec -it rabbitmq rabbitmqctl start_app
👉 在 rabbit2 上执行(192.168.1.62)
docker exec -it rabbitmq rabbitmqctl stop_app
docker exec -it rabbitmq rabbitmqctl join_cluster rabbit@rabbit0
docker exec -it rabbitmq rabbitmqctl start_app
✅ 开启webUI
docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management
✅ 客户端设置 queue-type=quorum
因为经典模式队列,当主节点down掉,不会自动切换新leader。客户端新建队列时必须指定queue-type=quorum。
4.0.4版本已经不支持设置策略。强制queue-type=quorum 。
✅验证
分别从命令行、Web UI、消息收发、Quorum 队列等多个角度进行确认。
✅ 用命令行检查集群状态
在任意一个节点容器中执行(推荐 rabbit@rabbit0):
docker exec -it rabbitmq rabbitmqctl cluster_status
你应当看到类似输出:
Cluster status of node rabbit@rabbit0 ...
[{nodes,[{disc,[rabbit@rabbit0,rabbit@rabbit1,rabbit@rabbit2]}]},
{running_nodes,[rabbit@rabbit0,rabbit@rabbit1,rabbit@rabbit2]},
{cluster_name,<<"rabbit@rabbit0">>},
{partitions,[]},
...]
🔍 核心验证点:
| 字段 | 正常状态 |
|---|---|
nodes |
三个都列出来(disk/ram 都行) |
running_nodes |
三个节点都显示 |
partitions |
必须为空,表示无网络分裂 |
✅ 访问 Web 管理控制台(Management UI)
每个节点都有 Web 管理界面,访问:
http://192.168.1.60:15672
http://192.168.1.61:15672
http://192.168.1.62:15672
默认账号:
用户名:rabbit
密码:123456
✅ 检查界面中:
- 【Overview】:节点数是否为 3
- 【Nodes】:是否显示 rabbit@rabbit0、rabbit1、rabbit2 且全部 green
- 【Queues】:是否能创建并看到队列
- 【Connections】:后续可以看到生产者/消费者连接情况
✅ 创建 Quorum 队列并验证同步
在控制台中创建:
- 进入任一节点 Web UI
- 点「Queues」→ Add a new queue
- 填写:
- Name:
test-quorum - Durable: ✅
- Type:
Quorum
- Name:
然后在【Queues】中点击进去,能看到:
- Leader Node 是哪个
- 同步副本列表(Replicas)
可以在其他节点上打开 Web UI,进入同样的队列页面,会看到一样的信息。
✅ 客户端连接验证
你可以用如下连接串测试客户端连接:
amqp://rabbit:123456@192.168.1.60:5672,192.168.1.61:5672,192.168.1.62:5672
任一节点宕机,其他节点仍然能连接并消费/发布消息(前提是 Quorum Queue)。
✅ 模拟宕机测试容灾
执行:
docker stop rabbitmq
比如在 rabbit@rabbit0 上停止节点:
- 观察其他节点是否仍在运行
- 客户端连接是否受影响
test-quorum队列是否还能收发消息
如果成功说明 Quorum Queue 容灾生效。
rejected Unable to publish message. Check queue limits.
✅ 查看节点之间连接关系
你也可以看每个节点之间的通信链接:
docker exec -it rabbitmq rabbitmqctl report
会看到 node list、peer、连接、内存等详细信息。
更多推荐



所有评论(0)