Linux Ubuntu 上使用 Docker 安装并成功运行 RabbitMQ
在 Linux 上使用 Docker 安装 RabbitMQ 是一种快速、轻量级且便于管理的方式。RabbitMQ 是一个功能强大的开源消息队列系统,常用于分布式系统中的消息传递。
下面我将详细介绍如何在 Linux(以 Ubuntu/CentOS 为例) 上使用 Docker 安装并运行 RabbitMQ,包括 默认版本 和 带管理界面的版本。
Docker安装单节点RabbitMQ
一 前提条件
确保你已经安装了 Docker(参考之前提供的 Docker 安装教程);Docker 服务已启动;
sudo systemctl start docker
sudo systemctl enable docker
二 使用 Docker 运行 RabbitMQ(默认镜像)
RabbitMQ 官方提供了 Docker 镜像,我们可以直接从 Docker Hub 拉取并运行。
-
拉取 RabbitMQ 官方镜像
docker pull rabbitmq
这个镜像是 不带管理界面 的版本,仅包含 RabbitMQ 核心功能。
如果你想使用 带 Web 管理界面 的版本,应该拉取 rabbitmq:management 镜像(推荐)。 -
运行 RabbitMQ 容器(不带管理界面)
docker run -d \ --name rabbitmq \ -p 5672:5672 \ rabbitmq
-d:后台运行容器;
--name rabbitmq:给容器命名为 rabbitmq;
-p 5672:5672:将容器的 5672 端口映射到宿主机的 5672 端口(这是 RabbitMQ 的默认通信端口,用于客户端连接)。
注意:这个镜像 没有 Web 管理界面,适合仅通过客户端连接使用的场景。
三 推荐:运行带管理界面的 RabbitMQ
RabbitMQ 提供了一个非常实用的 Web 管理插件,可以通过浏览器来管理队列、交换机、用户等,极大地方便了开发和运维。
-
拉取带管理界面的 RabbitMQ 镜像
docker pull rabbitmq:management
这个镜像是官方提供的带有 Web 管理插件 的版本,默认开启管理界面。
-
运行带管理界面的 RabbitMQ 容器
docker run -d \ --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ rabbitmq:management
-p 5672:5672:RabbitMQ 的客户端通信端口;
-p 15672:15672:RabbitMQ 的 Web 管理界面端口。 -
从外部访问管理界面
访问管理界面:在浏览器打开 http://<你的服务器IP>:15672
默认用户名和密码都是:guest(注意:guest 用户默认只能从 localhost 访问,见下文说明)
注意:guest 用户的访问限制
默认情况下,RabbitMQ 的 guest 用户:
用户名:guest
密码:guest
但 guest 用户只能从 localhost(即容器内部)访问管理界面,如果你从外部(比如你的电脑浏览器)访问 http://<服务器IP>:15672,会提示登录失败。解决方法:创建新的管理员用户
为了能从外部访问管理界面,建议创建一个新的管理员用户:
进入 RabbitMQ 容器docker exec -it rabbitmq bash
进入 RabbitMQ 的命令行工具环境
rabbitmqctl add_user admin your_password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin "." "." ".*"将 admin 替换为你想要的用户名;
将 your_password 替换为你想要的密码。
退出容器
exit
现在你可以使用新创建的用户(如 admin)和密码,从浏览器登录管理界面 http://<服务器IP>:15672 了。
四 验证 RabbitMQ 是否运行成功
-
方法一:查看容器状态
docker ps
你应该能看到名为 rabbitmq 的容器正在运行。
-
方法二:测试 RabbitMQ 端口是否监听
sudo netstat -tuln | grep 5672
或者ss -tuln | grep 5672
如果看到 0.0.0.0:5672 或 :::5672 在监听,说明 RabbitMQ 服务正常运行。
-
方法三:访问管理界面
在浏览器打开:
http://<你的服务器IP>:15672
输入你创建的用户名和密码(如 admin / your_password),如果能登录并看到管理界面,说明安装成功!
五 设置 RabbitMQ 开机自启(可选)
如果你希望 RabbitMQ 容器在服务器重启后自动启动,可以为容器设置 --restart 策略:
docker run -d
--name rabbitmq
-p 5672:5672
-p 15672:15672
--restart unless-stopped
rabbitmq:management
--restart unless-stopped:除非手动停止,否则容器总是随 Docker 服务自动启动。
六 总结
操作 命令/说明:
拉取默认镜像 docker pull rabbitmq
拉取带管理界面的镜像 docker pull rabbitmq:management
运行默认容器 docker run -d --name rabbitmq -p 5672:5672 rabbitmq
运行带管理界面的容器 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
创建新用户 进入容器后执行 rabbitmqctl add_user admin password 等命令
访问管理界面 http://<服务器IP>:15672
设置开机自启 添加 --restart unless-stopped 参数
在 Docker 中配置 RabbitMQ 集群
配置 RabbitMQ 集群是实现高可用性、负载均衡和消息冗余的重要方式。RabbitMQ 集群允许多个 RabbitMQ 节点(可以是物理机、虚拟机或 Docker 容器)协同工作,共享元数据(如队列、交换机、绑定关系等),但消息本身默认不会在节点间自动同步(除非使用镜像队列)。
一、RabbitMQ 集群的核心概念
在开始配置之前,先了解几个关键概念:
概念 说明
节点(Node) 一个 RabbitMQ 实例,可以运行在不同的物理机或容器中。
集群(Cluster) 多个 RabbitMQ 节点组成一个逻辑集群,共享元数据(队列、交换机等)。
镜像队列(Mirrored Queues) 将队列中的消息复制到多个节点,实现高可用(消息不丢失)。
元数据(Metadata) 包括队列、交换机、绑定关系等,集群中所有节点共享这些信息。
内存节点 vs 磁盘节点 内存节点只将数据保存在内存中,速度快但不持久;磁盘节点会将数据持久化到磁盘,速度较慢但更安全。集群中至少需要一个磁盘节点来保存元数据。
二、RabbitMQ 集群的配置方式
RabbitMQ 集群可以通过以下方式部署:
物理机/虚拟机部署(传统方式,适合生产环境);
Docker 容器部署(适合开发、测试或轻量级生产环境)。
本文将重点介绍 如何在 Docker 中配置 RabbitMQ 集群,因为这是目前最简单、最适合学习和测试的方式。
三、在 Docker 中配置 RabbitMQ 集群(3 节点示例)
我们将创建 3 个 RabbitMQ 节点(3 个 Docker 容器),并将它们组成一个 RabbitMQ 集群。
🧱 准备工作
1️⃣ 确保已安装 Docker 和 Docker Compose(可选)
如果你使用 Docker Compose,可以更方便地管理多个容器。如果没有安装,可以参考官方文档安装。
🚀 步骤 1:创建 3 个 RabbitMQ 容器
我们将创建 3 个 RabbitMQ 容器,分别命名为:
rabbitmq1
rabbitmq2
rabbitmq3
每个容器都运行 rabbitmq:management 镜像(带管理界面)。
方法一:手动创建容器(适合理解原理)
启动第一个 RabbitMQ 容器(rabbitmq1)
docker run -d
--name rabbitmq1
-p 5672:5672
-p 15672:15672
rabbitmq:management
这个容器将作为集群的第一个节点。
默认情况下,RabbitMQ 节点的名称(nodename)是 rabbit@<主机名>,这里主机名是容器的名称 rabbitmq1。
启动第二个 RabbitMQ 容器(rabbitmq2)
docker run -d
--name rabbitmq2
-p 5673:5672
-p 15673:15672
rabbitmq:management
注意:这里我们将第二个容器的 5672 端口映射到宿主机的 5673 端口,15672 映射到 15673,避免端口冲突。
启动第三个 RabbitMQ 容器(rabbitmq3)
docker run -d
--name rabbitmq3
-p 5674:5672
-p 15674:15672
rabbitmq:management
同样,我们将第三个容器的端口映射到不同的宿主机端口,避免冲突。
方法二:使用 Docker Compose(推荐)
如果你希望更简单地管理多个容器,可以使用 docker-compose.yml 文件。
创建 docker-compose.yml 文件
version: '3.8'
services:
rabbitmq1:
image: rabbitmq:management
container_name: rabbitmq1
hostname: rabbitmq1
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_ERLANG_COOKIE: "cluster_cookie" # 集群通信的密钥,所有节点必须相同
rabbitmq2:
image: rabbitmq:management
container_name: rabbitmq2
hostname: rabbitmq2
ports:
- "5673:5672"
- "15673:15672"
environment:
RABBITMQ_ERLANG_COOKIE: "cluster_cookie" # 必须与 rabbitmq1 一致
depends_on:
- rabbitmq1
rabbitmq3:
image: rabbitmq:management
container_name: rabbitmq3
hostname: rabbitmq3
ports:
- "5674:5672"
- "15674:15672"
environment:
RABBITMQ_ERLANG_COOKIE: "cluster_cookie" # 必须与 rabbitmq1 一致
depends_on:
- rabbitmq1
- rabbitmq2
说明:
-
RABBITMQ_ERLANG_COOKIE 是 RabbitMQ 节点之间通信的密钥,所有节点必须使用相同的值,否则无法加入集群;
-
hostname 是每个节点的名称,在集群中用于标识节点;
-
depends_on 确保容器按顺序启动。
启动容器
在 docker-compose.yml 文件所在目录运行:
docker-compose up -d
这会同时启动 3 个 RabbitMQ 容器。
🧩 步骤 2:将 RabbitMQ 节点加入集群
默认情况下,每个 RabbitMQ 容器启动后都是一个独立节点,我们需要手动将 rabbitmq2 和 rabbitmq3 加入到 rabbitmq1 的集群中。
进入 rabbitmq2 容器
docker exec -it rabbitmq2 bash
停止 RabbitMQ 应用(注意:不是停止容器)
在 RabbitMQ 中,加入集群需要先停止应用层服务,但容器本身仍然运行:
rabbitmqctl stop_app
将 rabbitmq2 加入 rabbitmq1 的集群
rabbitmqctl join_cluster rabbit@rabbitmq1
rabbit@rabbitmq1 表示要加入的集群主节点是 rabbitmq1,其中 rabbit 是节点名称的前缀(默认值),rabbitmq1 是主机名(我们在 docker-compose 中通过 hostname 指定)。
启动 RabbitMQ 应用
rabbitmqctl start_app
验证集群状态
rabbitmqctl cluster_status
你应该能看到类似如下的输出,表明 rabbitmq2 已成功加入集群:
Cluster status of node 'rabbit@rabbitmq2' ...
[{nodes,[{disc,['rabbit@rabbitmq1','rabbit@rabbitmq2']}]},
{running_nodes,['rabbit@rabbitmq1','rabbit@rabbitmq2']}]
...
重复上述步骤,将 rabbitmq3 加入集群
退出 rabbitmq2 容器:
exit
进入 rabbitmq3 容器:
docker exec -it rabbitmq3 bash
执行以下命令:
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmqctl start_app
rabbitmqctl cluster_status
🌐 步骤 3:访问管理界面
在浏览器中打开以下地址,分别查看 3 个节点的管理界面:
http://<宿主机IP>:15672(对应 rabbitmq1)
http://<宿主机IP>:15673(对应 rabbitmq2)
http://<宿主机IP>:15674(对应 rabbitmq3)
登录用户名和密码默认是 guest / guest(注意:guest 用户只能从 localhost 访问,建议创建新用户,参考之前教程)。
在管理界面中,你可以看到:
集群中的节点列表;
队列、交换机等元数据信息;
节点的状态(是否在线)。
⚠️ 注意事项
guest 用户限制
默认的 guest 用户只能从 localhost 访问管理界面。如果你需要从外部访问,建议创建新的管理员用户(参考之前的教程)。
镜像队列(高可用)
默认情况下,队列只会存在于单个节点上。如果该节点宕机,队列中的消息将不可用。
为了解决这个问题,可以启用 镜像队列,将队列复制到多个节点。
在管理界面中,进入「Admin」→「Policies」,添加一个策略,例如:
名称:ha-all
模式:.*(匹配所有队列)
定义:{"ha-mode":"all"}(将队列复制到所有节点)
持久化存储
在 Docker 中,默认情况下 RabbitMQ 的数据是存储在容器内部的。如果容器被删除,数据也会丢失。
为了实现数据持久化,可以使用 Docker 卷(-v 参数)将数据目录挂载到宿主机。例如:
docker run -d \
--name rabbitmq1 \
-p 5672:5672 \
-p 15672:15672 \
-v rabbitmq_data1:/var/lib/rabbitmq \
rabbitmq:management
这样即使容器被删除,数据仍然保留在宿主机上。
四、总结
步骤 操作
创建容器 使用 docker run 或 docker-compose 启动多个 RabbitMQ 容器
设置集群密钥 确保所有节点的 RABBITMQ_ERLANG_COOKIE 相同
加入集群 在每个节点上执行 rabbitmqctl stop_app 和 rabbitmqctl join_cluster
验证集群 使用 rabbitmqctl cluster_status 查看集群状态
管理界面 通过浏览器访问各个节点的管理界面
高可用 启用镜像队列,将队列复制到多个节点
数据持久化 使用 Docker 卷挂载数据目录,避免数据丢失