Docker 一键搭建 RabbitMQ 消息队列:从入门到生产

概述

RabbitMQ 是目前最流行的开源消息队列中间件之一。它支持 AMQP、MQTT 等多种协议,适合做异步任务处理、服务解耦、流量削峰。

很多人第一次接触消息队列,直接 ssh 到服务器上装 Erlang 再装 RabbitMQ,折腾半天还报版本不兼容。用 Docker 跑,一条命令搞定,还能随时销毁重建。

这篇教程教你用 Docker Compose 在任意 VPS 上搭建一套带 Web 管理面板的 RabbitMQ 环境。

准备工作

你需要这些:

  • 一台 Linux 服务器(Ubuntu 20.04+ 或 Debian 11+),2核2G起步
  • Docker 和 Docker Compose 已安装
  • 开放防火墙端口 5672(AMQP通信)和 15672(管理面板)
  • 一个域名可选配,用于反代访问管理面板

先确认 Docker 状态:

docker --version
docker compose version

如果没装 Docker,跑这条:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

步骤

第1步:创建项目目录

mkdir -p ~/rabbitmq && cd ~/rabbitmq

第2步:编写 Docker Compose 文件

新建 docker-compose.yml

services:
  rabbitmq:
    image: rabbitmq:3.13-management
    container_name: rabbitmq
    restart: unless-stopped
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: Rbmq@2026!Secure
      RABBITMQ_DEFAULT_VHOST: /
    volumes:
      - ./rabbitmq-data:/var/lib/rabbitmq
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

这里用了 rabbitmq:3.13-management 镜像,自带 Web 管理界面。数据挂载到本地目录,容器删了数据也不会丢。

默认账号是 admin,密码是 Rbmq@2026!Secure。生产环境记得改。

第3步:启动服务

docker compose up -d

等个十几秒,看日志确认启动正常:

docker compose logs -f rabbitmq

看到 Server startup complete; 3 plugins started. 就说明好了。

第4步:配置防火墙

如果你的服务器有 UFW 或安全组规则,需要放行端口:

sudo ufw allow 5672/tcp
sudo ufw allow 15672/tcp
sudo ufw reload

云服务器的话,去控制台的安全组里加两条入站规则。

第5步:创建专用应用账号

别直接用 admin 账号让业务连。创建一个小一点的专用账号:

docker exec -it rabbitmq rabbitmqctl add_user myapp MyStr0ngP@ss
docker exec -it rabbitmq rabbitmqctl set_permissions myapp ".*" ".*" ".*"
docker exec -it rabbitmq rabbitmqctl set_user_tags myapp administrator

这样你的应用就用 myapp 连接,admin 只用来管理。

第6步:配置消息持久化(可选但推荐)

RabbitMQ 默认消息不持久化,服务挂了消息就没了。加个策略让消息落盘:

docker exec -it rabbitmq rabbitmqctl set_policy ha-all ".*" '{"message-ttl":86400000}' --apply-to queues

这会让所有队列的消息存活24小时,即使 Broker 重启也能恢复。

验证

方法1:访问管理面板

浏览器打开 http://你的IP:15672,用 admin / Rbmq@2026!Secure 登录。

看到 Dashboard 页面,Connections 和 Channels 都是0,说明服务正常运行。

方法2:命令行测试

发一条消息再取出来:

# 发消息
docker exec -it rabbitmq rabbitmqadmin publish routing_key=test body="hello world"

# 收消息
docker exec -it rabbitmq rabbitmqadmin get queue=test count=1

收到 hello world 就证明消息队列跑得没问题。

方法3:Python 快速验证

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/',
    pika.PlainCredentials('myapp', 'MyStr0ngP@ss')))
channel = connection.channel()
channel.queue_declare(queue='test_queue')
channel.basic_publish(exchange='', routing_key='test_queue', body='test message')
print("消息发送成功")
connection.close()

装依赖 pip install pika,运行不报错就说明连接通了。

常见问题

Q: 管理面板打不开?

先看端口对不对。15672 是管理面板端口,不是 5672。检查防火墙和安全组有没有放行。

Q: 容器启动后一直重启?

通常是内存不够。RabbitMQ 最少需要 512MB,建议 1G 以上。看日志:docker compose logs rabbitmq

Q: 怎么修改默认密码?

docker exec -it rabbitmq rabbitmqctl change_password admin NewP@ssw0rd

Q: 磁盘空间满了怎么办?

RabbitMQ 有个磁盘水位线,默认 50MB 就暂停写入。清理旧数据:

docker exec -it rabbitmq rabbitmqctl purge_queue 队列名

或者调高限制:

docker exec -it rabbitmq rabbitmqctl set_disk_free_limit memory 2GB

Q: 远程连不上 5672 端口?

RabbitMQ 默认监听 0.0.0.0,Docker 端口映射后应该能连。如果不行,进容器检查:

docker exec -it rabbitmq netstat -tlnp | grep 5672

能看到 0.0.0.0:5672 就对了。


搭好 RabbitMQ 之后,搭配之前写的 N8N 自动化部署 或者 Caddy 反向代理 一起用,效果更佳。

你的业务场景里打算用消息队列解决什么问题?评论区聊聊。

这篇文章对你有帮助吗?