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 拉取并运行。

  1. 拉取 RabbitMQ 官方镜像

      docker pull rabbitmq
    

    这个镜像是 不带管理界面 的版本,仅包含 RabbitMQ 核心功能。
    如果你想使用 带 Web 管理界面 的版本,应该拉取 rabbitmq:management 镜像(推荐)。

  2. 运行 RabbitMQ 容器(不带管理界面)

    docker run -d \
      --name rabbitmq \
      -p 5672:5672 \
      rabbitmq
    

    -d:后台运行容器;

    --name rabbitmq:给容器命名为 rabbitmq;

    -p 5672:5672:将容器的 5672 端口映射到宿主机的 5672 端口(这是 RabbitMQ 的默认通信端口,用于客户端连接)。

    注意:这个镜像 没有 Web 管理界面,适合仅通过客户端连接使用的场景。

三 推荐:运行带管理界面的 RabbitMQ

RabbitMQ 提供了一个非常实用的 Web 管理插件,可以通过浏览器来管理队列、交换机、用户等,极大地方便了开发和运维。

  1. 拉取带管理界面的 RabbitMQ 镜像

    docker pull rabbitmq:management

    这个镜像是官方提供的带有 Web 管理插件 的版本,默认开启管理界面。

  2. 运行带管理界面的 RabbitMQ 容器

        docker run -d \
          --name rabbitmq \
          -p 5672:5672 \
          -p 15672:15672 \
          rabbitmq:management
    

    -p 5672:5672:RabbitMQ 的客户端通信端口;
    -p 15672:15672:RabbitMQ 的 Web 管理界面端口。

  3. 从外部访问管理界面

    访问管理界面:在浏览器打开 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 卷挂载数据目录,避免数据丢失

posted @ 2025-06-13 20:00  抒写  阅读(443)  评论(0)    收藏  举报