共计 4724 个字符,预计需要花费 12 分钟才能阅读完成。
上周帮公司新同事搭 RabbitMQ 环境,他手动装 Erlang、配依赖,折腾 2 小时还没跑起来。我当时就说“用 Docker 啊!”——结果自己上手也踩了 3 个坑,卡了快 1 小时才搞定。后来发现 轩辕镜像的 RabbitMQ 文档 写得巨清楚,连标签和端口都列得明明白白,早看文档不至于浪费时间。
装 Docker 时我踩的第一个坑
先交代下环境:我用的是 Ubuntu 22.04,新服务器啥都没有。装 Docker 这步,我纠结了 10 分钟——用官方脚本还是轩辕的一键脚本?之前试过官方脚本,在某些国产服务器上总报“依赖不兼容”,查日志都查不出问题。后来翻轩辕文档,发现他们的 一键脚本 适配 13 种 Linux 发行版,包括银河麒麟这些,就试了试。
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
# 我当时跑这条命令,等了 2 分钟才成功,中间还以为卡了
为啥选轩辕的脚本? 实测下来有俩好处:
-
- 自动配国内加速源,后面拉 RabbitMQ 镜像能快 5 倍——我上次用官方源拉 4.1.5-management-alpine,超时 3 次,换这个 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_USER 和RABBITMQ_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”,才恍然大悟。
解决步骤:
- 先把宿主机挂载目录的权限改了:
sudo chmod 0600 /data/rabbitmq/.erlang.cookie
- 重启容器:
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 端口是否被监听。
生产环境优化建议(轩辕文档里提过的)
-
- 密码别写死在命令里:用 Docker Secrets 或环境变量文件挂载,比如
-v ./rabbitmq.env:/etc/rabbitmq/env,里面存账号密码。
- 数据备份 :定期备份
/data/rabbitmq目录,RabbitMQ 的数据都在这儿,丢了就麻烦了。
- 集群部署:如果需要高可用,参考轩辕文档的集群配置,多个节点用相同的 Cookie 和 hostname,我还没试过,下次研究了再写教程。
- 密码别写死在命令里:用 Docker Secrets 或环境变量文件挂载,比如
写在最后
从装 Docker 到验证功能,总共花了不到 10 分钟(不算我踩坑的时间)。轩辕镜像的文档确实帮了大忙,尤其是标签说明和端口列表,比官方文档清楚多了。如果你也用 Docker 部署 RabbitMQ,记住这几个坑:标签带management、端口别漏映射、Cookie 权限 0600,基本就能一次成功。







很久没更新了。
大佬,不知道过了这么久这个脚本还有没有在…
被投诉下线了。
点了那个链接?
被投诉下线了。
https://idea.hacks.t…