草稿状态:本文仅保存到 CSDN 草稿箱,待人工检查和实测后再决定是否发布。

摘要

本文使用 RabbitMQ 官方文档推荐的 Docker 镜像标签 rabbitmq:4-management,在 Docker Desktop 或 Docker Engine 中启动带 Web 管理后台的 RabbitMQ,完成端口映射、账号密码、命名卷持久化、健康检查、管理后台登录和队列数据验证。原始教程中的 RabbitMQ 3.8.8 已调整为当前文档推荐的 4-management 标签;如果项目必须兼容旧版本,应单独锁定经过验证的旧镜像标签。

一、RabbitMQ 的两个端口

  • 5672:AMQP 客户端连接端口,Java、Spring Boot 等程序使用。
  • 15672:Management UI 和 HTTP API 端口,浏览器访问使用。

本教程使用以下资源:

项目
镜像rabbitmq:4-management
容器名rabbitmq
数据卷rabbitmq_data
日志卷rabbitmq_log
管理用户appuser
管理密码启动命令中的自定义密码

二、前置准备

docker version
docker info

确认 Docker 已启动,并确认主机 5672、15672 端口没有被其他服务占用。机器上已有 RabbitMQ 时,不要直接复用容器名和数据卷,先备份并查看现有资源。

三、拉取镜像

docker pull rabbitmq:4-management
docker image inspect rabbitmq:4-management

management 标签已经包含 RabbitMQ 管理插件和 Web 管理后台,不需要另外安装 rabbitmq_management 插件。

四、创建数据卷

docker volume create rabbitmq_data
docker volume create rabbitmq_log
docker volume inspect rabbitmq_data
docker volume inspect rabbitmq_log

RabbitMQ 数据挂载到 /var/lib/rabbitmq,日志挂载到 /var/log/rabbitmq。命名卷独立于容器,但卷不是备份,重要消息和配置仍需制定备份策略。

五、启动 RabbitMQ

先替换示例密码,再执行一行命令:

docker run -d --name rabbitmq --hostname rabbitmq-host -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=appuser -e RABBITMQ_DEFAULT_PASS=ChangeMe_123456 -e TZ=Asia/Shanghai -v rabbitmq_data:/var/lib/rabbitmq -v rabbitmq_log:/var/log/rabbitmq --health-cmd="rabbitmq-diagnostics -q ping" --health-interval=30s --health-timeout=10s --health-retries=5 --restart unless-stopped rabbitmq:4-management

ChangeMe_123456 只是示例密码,不能用于生产环境。RABBITMQ_DEFAULT_USER 和 RABBITMQ_DEFAULT_PASS 只在空数据目录首次初始化时创建用户;复用已有数据卷时,修改环境变量不会自动修改现有用户密码。

六、确认容器和健康状态

docker ps --filter "name=rabbitmq"
docker inspect --format "{{.State.Health.Status}}" rabbitmq
docker logs --tail 100 rabbitmq

健康状态变为 healthy 后再登录管理后台。如果还在 starting,先等待几秒;如果变为 unhealthy,优先查看日志。

七、登录管理后台

浏览器打开:

http://localhost:15672

填写启动命令中的 appuser 和密码。不要把默认账号 guest 用作远程客户端账号;RabbitMQ 对 guest 账号的远程访问有限制,教程使用自定义用户更适合本地开发。

八、创建队列并验证持久化

进入管理后台,在 Queues and Streams 中创建队列:

  • 名称:demo.queue
  • Durability:Durable
  • Auto delete:关闭

Durable 队列只表示队列元数据可以持久化,消息是否在重启后保留还取决于消息发布时是否设置 persistent,以及消费者确认策略。不要只创建一个 Durable 队列就断言所有消息都不会丢。

也可以查看 RabbitMQ 状态:

docker exec rabbitmq rabbitmq-diagnostics -q ping
docker exec rabbitmq rabbitmqctl list_queues name durable messages

九、重启验证

docker restart rabbitmq
docker inspect --format "{{.State.Health.Status}}" rabbitmq
docker exec rabbitmq rabbitmqctl list_queues name durable messages

如果只是重启容器,命名卷中的 RabbitMQ 数据应继续可用。删除容器时不要误删 rabbitmq_data。

十、常用命令

docker start rabbitmq
docker stop rabbitmq
docker restart rabbitmq
docker logs -f rabbitmq
docker exec -it rabbitmq bash
docker rm -f rabbitmq

只删除容器、保留数据:

docker rm -f rabbitmq

重新创建容器时继续挂载 rabbitmq_data 和 rabbitmq_log。确认数据不再需要后,才执行:

docker volume rm rabbitmq_data
docker volume rm rabbitmq_log

十一、常见问题

1. 浏览器打不开 15672

检查容器端口映射、健康状态和日志。若主机端口被占用,可将映射改为 15673:15672,浏览器访问 15673。

2. 修改密码没有生效

这是因为数据卷已经初始化。进入容器执行:

docker exec -it rabbitmq rabbitmqctl change_password appuser NewStrongPassword_2026

3. 消息重启后消失

检查队列是否 Durable、消息是否设置 persistent、生产者是否等待确认、消费者是否正确 ack。RabbitMQ 的容器持久化不能替代消息投递确认。

十二、官方资料

总结

本教程完成了镜像拉取、命名卷挂载、管理后台访问、健康检查和队列持久化验证。原始教程中的固定弱密码和 RabbitMQ 3.8.8 版本没有直接照搬;实际部署仍应根据项目兼容性锁定镜像版本,并人工核对端口、密码、备份和消息确认策略。

更多推荐