【零基础教程】基于Docker的RabbitMQ部署方案

RabbitMQ的基本简介

RabbitMQ 是一个基于 AMQP 协议的开源消息代理软件,其核心作用是作为应用程序之间的异步通信中间件。它通过在消息生产者和消费者之间扮演"智能邮局"的角色,实现系统组件的解耦、流量的削峰填谷以及不同服务间的可靠数据传递。

其显著特点在于提供了灵活的路由机制、可靠的消息投递、集群高可用性以及友好的Web管理界面。典型应用场景包括后台任务异步处理、微服务间的事件驱动通信、系统日志聚合等,是构建分布式、高可扩展性现代应用架构的重要基础设施。

RabbitMQ是一款成熟的企业级消息中间件,它最擅长在分布式系统之间进行可靠、灵活且异步的消息传递 。其核心优势在于通过预定义的交换机和队列规则,实现复杂的消息路由、保证投递不丢失,并凭借ACK确认机制、持久化和集群镜像确保事务的可靠性,非常适合需要严格顺序和交付保障的业务场景,如订单处理或金融交易。

然而,它并非全能,其设计侧重于消息的可靠性与复杂性,因此在面对海量日志流式处理 时,其单条消息处理开销和顺序消费模型可能成为瓶颈,性能不及Kafka等专用流平台;同时,在需要极低延迟(微秒级)或简单广播的实时通信场景中,其消息代理架构带来的开销也显得过重,此时ZeroMQ或Redis Pub/Sub可能更为轻量高效。简言之,RabbitMQ是构建复杂、可靠企业异步通信骨干的绝佳选择,但在超高吞吐、流处理或极致低延迟领域并非最优工具。

📝 生产环境下,创建RabbitMQ服务端的完整Docker命令

bash 复制代码
docker run -d \
  --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -v /your/local/data:/var/lib/rabbitmq \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=admin123 \
  -e RABBITMQ_DEFAULT_VHOST=my_vhost \
  rabbitmq:3-management

📊 命令参数详细解释

命令部分/参数 解释与作用 技术细节与说明
docker run Docker引擎的核心命令,用于创建并启动一个新的容器实例。 runcreate(创建) 和 start(启动) 两个操作的结合。
-d 后台运行模式(detached mode)。 容器启动后,终端将释放并返回提示符,容器在后台持续运行。与之对应的是 -it(交互式前台模式)。
--name rabbitmq 为容器指定一个易于识别的名称。 此名称用于后续管理操作(如 docker stop rabbitmq)。若不指定,Docker会随机分配一个名字。
-p 5672:5672 端口映射:将宿主机的5672端口映射到容器的5672端口。 -p <宿主机端口>:<容器端口>5672端口 是RabbitMQ AMQP协议的标准端口,应用程序 通过此端口连接RabbitMQ进行消息收发。 • 若宿主机5672端口已被占用,可更改为 -p 5673:5672
-p 15672:15672 端口映射:将宿主机的15672端口映射到容器的15672端口。 15672端口 是RabbitMQ 管理插件 的Web界面端口。强烈建议 大家把这个Web界面一并安装上,能极大地方便进行消息的查看。 • 启动后可通过浏览器访问 http://<宿主机IP>:15672 来管理RabbitMQ。
-v /your/local/data:/var/lib/rabbitmq 数据卷挂载:实现数据的持久化存储。 -v <宿主机目录>:<容器内目录> • **/your/local/data:这个路径是可以根据你自己的需要自由修改的,是宿主机上的真实目录,用于持久保存数据。 • /var/lib/rabbitmq容器内的固定数据目录 ,存放消息、元数据等。注意,这个路径别换,这个是RabbitMQ容器内部的路径,换了就挂载不上了。 • 作用:容器重启或删除后,重新挂载此目录即可恢复所有队列、消息和配置。
-e RABBITMQ_DEFAULT_USER=admin 环境变量 :设置RabbitMQ服务的默认用户名 • 此变量由RabbitMQ官方镜像定义,用于创建初始用户。 • 如果不设置,镜像会使用默认的 guest 用户(该用户仅限localhost访问,不安全)。
-e RABBITMQ_DEFAULT_PASS=admin123 环境变量:设置上述默认用户的密码。 务必admin123 替换为强密码。 • 这两个 -e 参数共同作用,在容器首次启动时自动创建好具有管理员权限的用户,我们用浏览器来访问Web界面时,就需要用这个用户名与密码登录。
-e RABBITMQ_DEFAULT_VHOST=my_vhost 环境变量(新增) :设置RabbitMQ的默认虚拟主机 Vhost (Virtual Host) :RabbitMQ中用于实现资源隔离与权限划分 的逻辑单元。队列、交换机都属于某个Vhost。 • 默认值 :如果不设置此变量,容器将使用默认的Vhost:/。 • 作用 :此变量会创建一个名为 my_vhost 的虚拟主机,并将上面创建的默认用户 admin 的权限自动关联到该Vhost。应用程序连接时需指定此Vhost名称。
rabbitmq:3-management 指定要使用的Docker镜像及其标签 rabbitmq :官方镜像名称。 • :3-management :标签。3-management 表示此镜像基于RabbitMQ 3.x版本,并预装了管理插件 (包含Web控制台)。若使用 :3 标签,则需手动启用插件。

📊 关于vhost的详细解释

其他几个参数,对大家而言应该都问题不大,都是符合我们基本认知的参数。但有个参数比较奇怪,如果之前没有接触过类似容器的可能不太了解,那就是这个虚拟主机。
Vhost就像在同一个邮局(即RabbitMQ服务器)里,为不同公司设立完全独立的、带锁的专属分拣室。 考虑一个场景:我们的程序中,有一个订单系统,还有一个日志系统。一个最直观的想法是,我的订单系统的数据,和我日志系统的数据,不要混在一起,否则乱糟糟的一团,会带来数据管理的混乱的。那这种情况下,我们就可以设置vhost了。

我们可以看下下面的示意图:
消息中间件(传输枢纽)
业务应用(消息生产者/消费者)
虚拟主机 Vhost: log_vhost
虚拟主机 Vhost: order_vhost
发送订单消息
路由消息
从订单队列

取消息处理
发送日志消息
路由消息
从日志队列

取消息处理
电商订单系统

(Java/Python/Go等)
后台日志系统

(Java/Python/Go等)
RabbitMQ服务器
订单交换机
订单队列
日志交换机
日志队列

通过设定不同的vhost,将不同的系统的数据隔离开。

所以,-e RABBITMQ_DEFAULT_VHOST 参数,就是在你建立这个RabbitMQ服务时,决定是否为你的默认应用预先开设一个专属区域,并让管理员只管理这个区域。它创建的Vhost会成为默认用户的"主工作区",从而避免使用那个众所周知的、不安全的默认 "/" 作为vhost。

但到这里,又有人会疑惑了。那后台日志系统与电商订单系统都使用了RabbitMQ服务器,难道要建立两个RabbitMQ的容器吗?并不需要,我们可以手动为其设置vhost。

而两个应用通过连接不同RabbitMQ的Vhost与之交互的关系图如下所示:
一台服务器
一个RabbitMQ容器
连接端口 5672

指定Vhost: order_vhost
连接端口 5672

指定Vhost: log_vhost
RabbitMQ服务进程
Vhost: order_vhost
Vhost: log_vhost
订单系统应用
日志系统应用

🛠️ 具体操作步骤

假设你已经在服务器上部署了一个RabbitMQ容器(使用我们之前讨论的命令),以下是为你提到的两个应用进行配置的完整流程:

第1步:启动一个RabbitMQ容器

bash 复制代码
docker run -d \
  --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -v /opt/rabbitmq_data:/var/lib/rabbitmq \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=admin123! \
  rabbitmq:3-management

这里我们也可以不设置DEFAULT_VHOST,不设置时默认使用"/"作为Vhost。

第2步:为电商订单系统创建专属Vhost和用户

直接在宿主机用 docker exec,创建专属的Vhost:

bash 复制代码
  # 创建名为 order_vhost 的虚拟主机
  docker exec rabbitmq rabbitmqctl add_vhost order_vhost
  # 为该应用创建一个专属用户,而非使用最高权限的管理员
  docker exec rabbitmq rabbitmqctl add_user order_user OrderUserPass123!
  # 授予该用户对其 order_vhost 的配置、写、读全部权限
  docker exec rabbitmq rabbitmqctl set_permissions -p order_vhost order_user ".*" ".*" ".*"

第3步:为后台日志系统创建专属Vhost和用户

bash 复制代码
# 创建名为 log_vhost 的虚拟主机
docker exec rabbitmq rabbitmqctl add_vhost log_vhost
# 创建专属用户
docker exec rabbitmq rabbitmqctl add_user log_user LogUserPass123!
# 授权
docker exec rabbitmq rabbitmqctl set_permissions -p log_vhost log_user ".*" ".*" ".*"

第4步:应用程序连接配置

现在,两个应用系统使用不同的连接参数 连接到同一个RabbitMQ服务(同一IP和端口)

  • 订单系统配置

    复制代码
    地址: amqp://order_user:OrderUserPass123!@<服务器IP>:5672/order_vhost
  • 日志系统配置

    复制代码
    地址: amqp://log_user:LogUserPass123!@<服务器IP>:5672/log_vhost

第5步:在管理界面查看

登录Web管理界面 (http://<服务器IP>:15672)。在顶部导航栏的下拉框中,你可以自由切换查看 order_vhostlog_vhost 内的所有队列、交换机等资源,实现集中监控。

上述命令的一个简单解释

对上面的命令解释一下,方便大家理解。

bash 复制代码
# 创建名为 order_vhost 的虚拟主机
docker exec rabbitmq rabbitmqctl add_vhost order_vhost

解释 :这条命令在名为rabbitmq的Docker容器内,通过RabbitMQ的管理工具rabbitmqctl,创建一个名为order_vhost的虚拟主机。

bash 复制代码
# 为该应用创建一个专属用户,而非使用最高权限的管理员
docker exec rabbitmq rabbitmqctl add_user order_user OrderUserPass123!

解释 :这条命令创建了一个名为order_user的新用户,密码为OrderUserPass123!。这个用户是专门为某个特定应用创建的,遵循最小权限原则,避免直接使用拥有所有权限的管理员账户,从而提高系统安全性。

bash 复制代码
# 授予该用户对其 order_vhost 的配置、写、读全部权限
docker exec rabbitmq rabbitmqctl set_permissions -p order_vhost order_user ".*" ".*" ".*"

解释 :这条命令为order_user用户在order_vhost虚拟主机上设置了完整的权限。".*" ".*" ".*"分别对应:

  • 配置权限:允许创建和删除交换机、队列等
  • 写权限:允许发布消息
  • 读权限:允许消费消息

其中".*是正则表达式,表示能够匹配任何数量的任何字符的含义,我们如果修改为"^order.*",那就只能匹配以 "order" 开头的字符串,用户可以操作 order_queueorder.exchange.fanout,但不能操作 log_queue

📊 命令结构与执行流程

命令部分 作用 详细说明
docker exec 在运行中的容器内执行命令 让你不必进入容器就能执行管理操作
rabbitmq 目标容器名称 你之前启动RabbitMQ容器时指定的名称
rabbitmqctl RabbitMQ管理命令行工具 用于管理RabbitMQ的各个方面
add_vhost 创建虚拟主机 为不同应用创建隔离的消息环境
add_user 创建用户账户 每个应用应有专属账户,避免混用
set_permissions 设置权限 确保用户只能在授权范围内操作

运行结果展示

在http://IP:15672这个地址输入地址栏,然后会出现如下界面。我们之前设定的用户名为admin,密码为admin123,将这两个填写上。

如果连接不上,请检查自己的防火墙是不是打开。这个属于基础知识,不过第一次用这个的很多同学估计不太清楚。云服务器,是有端口过滤功能的,包括前面的5672端口以及现在的15672端口,都需要在云平台的防火墙一栏中进行设置。

进入了RabbitMQ的管理页面。我们刚刚创建的my_vhost在虚拟host列表中出现了。

当我创建一个order_vhost后,这个管理界面会变成如下样子了。

好了,到这里,整个基于Docker的RabbitMQ部署就完成了。

相关推荐
星哥说事1 小时前
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台
运维·服务器·docker
oMcLin1 小时前
如何在 RHEL 7 上通过配置 Apache Kafka 集群的分区机制,提升消息传递系统的吞吐量与数据流处理能力?
分布式·kafka·apache
lpfasd1232 小时前
Nacos 实战指南:构建安全、高可用的微服务注册与配置中心
安全·微服务·架构
红队it2 小时前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark
前端世界2 小时前
鸿蒙系统中的分布式任务依赖是如何处理的?原理、方案与实践
分布式·华为·harmonyos
小雨下雨的雨2 小时前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:分布式联动与多端状态同步
分布式·flutter·华为·交互·harmonyos·鸿蒙系统
刘一说2 小时前
微服务配置中心:从痛点到实践——Nacos深度应用指南
spring boot·spring cloud·微服务·云原生·架构
DeepFlow 零侵扰全栈可观测2 小时前
DeepFlow 实践:利用 eBPF 实现覆盖从网关到数据库的全栈分布式追踪
网络·分布式·云原生·云计算
你好龙卷风!!!2 小时前
MQ相关的概念,ActiveMQ、RabbitMQ、Kafka、RocketMQ对比
rabbitmq