我用 Docker 部署 RabbitMQ 踩了 3 个大坑,10 分钟搞定的记录

上周帮公司新同事搭RabbitMQ环境,他手动装Erlang、配依赖,折腾2小时还没跑起来。我当时就说“用Docker啊!”——结果自己上手也踩了3个坑,卡了快1小时才搞定。后来发现轩辕镜像的RabbitMQ文档写得巨清楚,连标签和端口都列得明明白白,早看文档不至于浪费时间。

装Docker时我踩的第一个坑

先交代下环境:我用的是Ubuntu 22.04,新服务器啥都没有。装Docker这步,我纠结了10分钟——用官方脚本还是轩辕的一键脚本?之前试过官方脚本,在某些国产服务器上总报“依赖不兼容”,查日志都查不出问题。后来翻轩辕文档,发现他们的一键脚本适配13种Linux发行版,包括银河麒麟这些,就试了试。

bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
# 我当时跑这条命令,等了2分钟才成功,中间还以为卡了

为啥选轩辕的脚本? 实测下来有俩好处:

    1. 自动配国内加速源(阿里云+腾讯云双节点),后面拉RabbitMQ镜像能快5倍——我上次用官方源拉4.1.5-management-alpine,超时3次,换这个1分钟就拉完了。
    1. 装完直接启动Docker服务,不用手动sudo systemctl start docker,省一步是一步。

避坑提醒:执行前一定要有root权限!我同事用普通用户跑,报错“permission denied”,又折腾10分钟切用户。跑完脚本记得docker --version验证下,看到版本号再往下走。

拉镜像这块有个坑:别用latest!

Docker环境好了,该拉RabbitMQ镜像了。这里我卡了20分钟——一开始直接docker pull rabbitmq,默认拉latest标签,启动后发现没Web管理界面!查日志才看到“management plugin not found”,当时心里骂“操,白拉了”。

后来翻轩辕的tags页面,发现RabbitMQ镜像分好多种:带-management的才预装管理插件,带-alpine的是轻量版。我对比了几个版本:

  • latest:文档说可能对应测试版,体积200多MB,还没管理界面,pass;
  • 4.2.0-management:稳定版但体积180MB,比alpine版大一圈;
  • 4.1.5-management-alpine:轩辕文档标了“推荐稳定版”,体积才92MB,带管理插件,完美。

最后选了4.1.5-management-alpine,拉取命令得用轩辕的加速地址:

docker pull docker.xuanyuan.run/library/library/rabbitmq:4.1.5-management-alpine
# 我当时拉这个等了2分钟,你那边说不定更快

你别急着下一步:记一下这个标签的构成——4.1.5是版本号,management表示带Web管理界面,alpine是轻量系统。漏了management后面访问15672端口会404,我上次就是这么傻了一回。

启动命令我改了5遍才对

镜像拉好了,启动容器。这里是坑最多的地方,我前前后后改了5遍命令才成功。先上最终能用的命令,后面解释每个参数:

docker run -d \--name rabbitmq-server \--hostname rabbitmq-node1 \-p 5672:5672 \-p 15672:15672 \-v /data/rabbitmq:/var/lib/rabbitmq \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin123 \docker.xuanyuan.run/library/library/rabbitmq:4.1.5-management-alpine# 这条命令执行后,等30秒再查状态,RabbitMQ启动有点慢——我上次没等直接docker ps,以为没启动又跑一遍,结果多了个容器

参数解释+踩坑记录:

1. --hostname rabbitmq-node1 必须固定!

一开始我没加这个参数,容器重启后数据全没了。查轩辕文档才知道,RabbitMQ的数据存储路径跟节点名称(hostname)绑定,默认hostname是随机的,重启容器会变,导致数据找不到。我上次没加这个,白跑了半小时测试数据,血的教训。

2. 端口映射漏一个都不行

关键端口是5672(AMQP协议)和15672(Web管理界面),这俩必须映射。我第三次启动时漏了5672,结果应用连不上RabbitMQ,查了20分钟日志才发现“connection refused on port 5672”。轩辕文档里专门标了这俩端口是核心,千万别漏!

3. 数据挂载:-v /data/rabbitmq:/var/lib/rabbitmq

持久化配置(说白了就是数据存到宿主机,容器删了数据不丢)。我一开始用默认的匿名卷,后来容器删了想恢复数据,找不到卷在哪了,又花10分钟查docker volume ls。建议直接挂载到/data/rabbitmq这种明显的路径,后续维护方便。

4. 环境变量:默认用户名密码

RABBITMQ_DEFAULT_USERRABBITMQ_DEFAULT_PASS设管理员账号,默认的guest/guest只能本地登录,远程访问会报“user can only connect via localhost”。我第一次没设,用guest账号在浏览器登录管理界面,卡了15分钟才意识到是账号问题。

卡了40分钟的Cookie权限问题

启动命令跑完,docker ps一看,容器秒退!当时慌了,赶紧查日志:

docker logs rabbitmq-server
# 报错信息:Error: cookie file /var/lib/rabbitmq/.erlang.cookie has wrong permissions (777)

Cookie文件权限太开放了?我当时一脸懵逼,网上搜了半天,有的说改755,有的说改644,试了都不行。后来在轩辕文档的“特殊配置”里看到一句:“Erlang Cookie权限必须0600”,才恍然大悟。

解决步骤:

  1. 先把宿主机挂载目录的权限改了:
sudo chmod 0600 /data/rabbitmq/.erlang.cookie
  1. 重启容器:
docker restart rabbitmq-server

改完再docker ps,容器终于跑起来了。这40分钟真的…差点放弃用Docker部署。后来才知道,RabbitMQ的Erlang Cookie是集群通信用的,权限必须严格0600,多一点少一点都不行,这坑太隐蔽了。

测试验证:Web界面+AMQP连接都得测

容器跑起来不算完,得验证功能正常。分两步:

1. Web管理界面访问

浏览器打开 http://服务器IP:15672,用刚才设的admin/admin123登录。能看到Dashboard页面就说明管理插件没问题。
有人会问:打不开怎么办?先查docker ps看容器是不是真的在运行,再查服务器防火墙有没有开放15672端口,我上次就是忘了开防火墙,白刷新10分钟页面。

2. AMQP协议连接测试

用命令行工具rabbitmqadmin测试(管理界面自带这个工具,也可以用Python客户端):

# 先安装rabbitmqadmin(如果本地没有)
wget http://服务器IP:15672/cli/rabbitmqadmin -O /usr/local/bin/rabbitmqadmin
chmod +x /usr/local/bin/rabbitmqadmin# 创建一个测试队列
rabbitmqadmin -u admin -p admin123 -H 服务器IP declare queue name=test_queue durable=true

执行完没报错,去Web界面的“Queues”页面,能看到test_queue就说明AMQP协议(5672端口)正常。我当时执行这步报错“connection failed”,查了发现是5672端口没映射,又回去重新启动容器,亏大了。

经验沉淀:极简脚本+避坑指南

极简复现脚本(我整合时删了文档里3行没用的命令)

把上面的步骤整合成一个脚本,下次部署直接跑:

# 安装Docker(轩辕一键脚本)
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)# 拉取镜像
docker pull docker.xuanyuan.run/library/library/rabbitmq:4.1.5-management-alpine# 创建数据目录并设置权限
mkdir -p /data/rabbitmq
sudo chmod 777 /data/rabbitmq  # 先给777,后面容器会生成Cookie文件再改0600# 启动容器
docker run -d \--name rabbitmq-server \--hostname rabbitmq-node1 \-p 5672:5672 \-p 15672:15672 \-v /data/rabbitmq:/var/lib/rabbitmq \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin123 \docker.xuanyuan.run/library/library/rabbitmq:4.1.5-management-alpine# 等待30秒后修复Cookie权限(关键!)
sleep 30 && sudo chmod 0600 /data/rabbitmq/.erlang.cookie && docker restart rabbitmq-server

高频问题排查(我遇到的3个坑)

1. 容器启动后秒退

  • 错误日志cookie file permissions are too open (777)
  • 排查过程:先docker logs rabbitmq-server看日志,发现Cookie权限问题,再翻轩辕文档找到“权限必须0600”,改/data/rabbitmq/.erlang.cookie权限为0600,重启容器。

2. 管理界面打不开

  • 可能原因:① 没映射15672端口;② 镜像标签没带-management;③ 防火墙没开放端口。
  • 解决docker inspect rabbitmq-server看端口映射是否有15672:15672,标签是否是management-alpine,服务器执行sudo ufw allow 15672开放端口。

3. AMQP连接报“connection refused”

  • 可能原因:5672端口没映射,或容器没启动。
  • 解决docker ps确认容器运行中,netstat -tuln看宿主机5672端口是否被监听。

生产环境优化建议(轩辕文档里提过的)

    1. 密码别写死在命令里:用Docker Secrets或环境变量文件挂载,比如-v ./rabbitmq.env:/etc/rabbitmq/env,里面存账号密码。
    1. 数据备份:定期备份/data/rabbitmq目录,RabbitMQ的数据都在这儿,丢了就麻烦了。
    1. 集群部署:如果需要高可用,参考轩辕文档的集群配置,多个节点用相同的Cookie和hostname,我还没试过,下次研究了再写教程。

写在最后

从装Docker到验证功能,总共花了不到10分钟(不算我踩坑的时间)。轩辕镜像的文档确实帮了大忙,尤其是标签说明和端口列表,比官方文档清楚多了。如果你也用Docker部署RabbitMQ,记住这几个坑:标签带management、端口别漏映射、Cookie权限0600,基本就能一次成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 24.04.2 LTS 中修改远程桌面(xrdp)的默认端口

要在 Ubuntu 24.04.2 LTS 中修改远程桌面(xrdp)的默认端口 3389 为 53389,可按以下步骤操作: 1. 修改 xrdp 配置文件 sudo nano /etc/xrdp/xrdp.ini 在文件中找到包含port=3389的行(通常在[Globals]部分),将其修…

在远程 Ubuntu 24.04.2 LTS 上安装并运行图形界面

1. 安装桌面环境 首先更新系统并安装一个轻量级桌面环境(推荐 Xfce,资源占用低,适合远程使用): # 更新系统包 sudo apt update && sudo apt upgrade -y# 安装Xfce桌面环境 sudo apt install -y xfce4 xfc…

2025年安全检测检验公司排行榜单前十名推荐

摘要 随着矿山安全生产要求的不断提高,安全检测检验行业在2025年迎来快速发展,行业内公司竞争激烈。本榜单基于市场调研、用户评价和技术实力综合排名,旨在为矿山企业提供可靠参考。表单数据来源于行业报告和用户反…

2025年安全检测检验公司排行榜单权威发布

摘要 随着矿业安全生产要求的不断提高,安全检测检验行业在2025年迎来快速发展,市场规模预计年增长10%以上(引用自《中国矿业安全发展报告2025》)。本排名基于市场调研、客户评价和技术实力综合评估,为矿山企业选择…

常见的命名规范

程序开发中的命名规范是确保代码可读性、可维护性和一致性的重要因素。虽然没有一个“最终方案”适用于所有项目,但有一些广泛接受的命名规范和最佳实践。以下是常见的命名规范和一些工具支持: 常见的命名规范命名风…

2025年边坡防护网优质厂家权威推荐榜单:主动防护网/被动防护网/绞索网源头厂家精选

随着基础设施建设与地质灾害防治需求的持续增长,边坡防护网作为边坡稳定的关键材料,其市场需求显著上升。边坡防护网以其柔性承载、高防腐蚀与便于安装的特性,在公路边坡、矿山复绿及工程建设等场景中发挥重要作用。…

2025年冷链食品冷库供货厂家权威推荐榜单:食品级冷库/食品速冻冷库/保鲜食品冷库源头厂家精选

在食品安全与冷链物流标准不断提升的背景下,冷链食品冷库作为保障食品品质的关键环节,其温控精度与能效水平直接影响食品保鲜效果与运营成本。根据冷链行业数据显示,2025年我国冷链物流市场规模预计突破7000亿元,其…

【触想智能】工控一体机在智慧农业应用领域具有巨大的潜力和发展空间

随着科技的发展和农业的推进,智慧农业已经成为农业领域的新热点。在智慧农业中,工控一体机起着至关重要的作用。触想工控一体机TPC-W5系列下面,触想智能将和大家一起来探讨工控一体机在智慧农业应用领域的发展。工控…

Day31-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Regex-正则表达式+爬虫

正则表达式package Basic.src.com.Regex;public class RegexDemo1 {public static void main(String[] args) {/*校验QQ号是否正确* 规则:6位及20位之内,0不能在开头,必须全部是数字* 先使用目前所学的知识完成校验…

在 Ubuntu 中创建一个拥有 root 权限的 mjroot 用户并禁用root用户

在 Ubuntu 24.04.2 LTS 中创建一个拥有 root 权限的 mjroot 用户并禁用原始 root 用户,可按以下步骤操作: 1. 创建 mjroot 用户 # 创建 mjroot 用户 sudo adduser mjroot 执行后会提示设置密码和用户信息(可按回车留…

Mac微信4.0版本多开(暂不支持防撤回)

这次4.0的升级引入了保护机制,数据库、函数名等都不一样了 版本适用:Mac 端,微信 4.0 以上版本GitHub:https://github.com/LiJunYi2/WeChat-Split

2025年低烟无卤电缆加工厂权威推荐榜单:屏蔽电缆/计算机电缆/智能电缆源头厂家精选

随着社会对公共安全与环保要求的不断提高,低烟无卤电缆作为新一代安全线缆,其市场需求显著增长。这类电缆以其出色的阻燃特性、低烟密度与无卤环保配方,在火灾情况下能有效抑制烟雾产生和有毒气体释放,广泛应用于高…

2025年度三维扫描系统品牌推荐,结构光与非接触式三维扫描仪企业全解析

在工业检测、文物保护、逆向工程等领域,三维扫描技术正成为数字化转型的核心驱动力。面对市场上纷繁复杂的三维扫描设备与服务商,如何选择适配自身需求的三维扫描系统?本文聚焦[关键词](三维扫描系统、结构光三维扫…

2025 年 11 月立式车床,双主轴立车车床,双主轴双刀塔车铣复合车床厂家最新推荐,技术实力与市场口碑深度解析!

引言 随着高端制造领域对精密加工设备需求的持续攀升,立式车床、双主轴立车车床及双主轴双刀塔车铣复合车床的性能与品质愈发受到关注。为助力企业精准筛选优质设备供应商,专业机床协会联合第三方检测机构开展了 202…

CF1272F Two Bracket Sequences

考虑设 \(f_{i, j, k}\) 表示在 \(s\) 中匹配到 \(i\),在 \(t\) 中匹配到 \(j\),有 \(k\) 个左括号没有匹配。 然后用 BFS 进行匹配,能保证长度时最小的。

低功耗LCD段码液晶驱动 VKL144A/B LCD驱动厂家

VKL144A/B是一个点阵式存储映射的LCD驱动器,可支持最大144点(36SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示进入省电模式。其高抗干扰,低功耗的特性适用…

在Delphi中使用连接池连接MSSQL数据库和不使用连接池连接数据库的有什么区别

以下是完整的Delphi数据库连接池实现代码,包含初始化、连接获取和使用示例:1. 连接池初始化单元 (uDBPool.pas)unit uDBPool;interfaceusesFireDAC.Comp.Client, FireDAC.Stan.Def;procedure InitConnectionPool; fu…

Go红队开发—图形化界面

Go红队开发—Gui图形化界面(Fyne库)目录GUi 图形化配置第一个GUI常用 widget 组件Layout 布局绝对布局dialog弹框注意事项类别案例demo所有代码 好久没做golang开发了,之前的文章一直在做cli的安全工具开发,这里了解…

使用FireDAC的TFDManager和TFDConnection组件实现运行时动态数据库连接

以下是一个通用的数据库连接方案,使用FireDAC的TFDManager和TFDConnection组件实现运行时动态数据库连接。支持多种数据库类型,采用面向对象封装:unit DatabaseManager;interfaceusesSystem.SysUtils, System.Class…

laas paas saas 架构说明

--------------------------------------------------------------------------------------------------------------------------- 在 Java 开发领域,IaaS、PaaS、SaaS 分别对应基础设施、平台、软件三个层级的服务…