挂载数据卷必须指向 /var/lib/rabbitmq,因RabbitMQ的Mnesia数据库、节点元数据及持久化队列均存储于此;挂错路径(如/etc/rabbitmq)会导致容器重启后数据全丢;推荐使用命名卷并确保属主为UID 999。
/var/lib/rabbitmq
挂错路径是容器重启后消息/队列丢失的最常见原因。RabbitMQ 的 Mnesia 数据库、节点元数据、持久化队列都存在 /var/lib/rabbitmq 下,不是 /etc/rabbitmq 或 /var/log/rabbitmq。挂载其他路径等于没挂——容器删了,数据全丢。
实际操作中建议优先用命名卷(更安全、可迁移),而非宿主机绝对路径(权限、路径硬编码、跨平台问题多):
docker volume create rabbitmq_data 创建命名卷docker run -d --name rabbitmq -v rabbitmq_data:/var/lib/rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management如果坚持用宿主机目录,务必提前创建并确保属主匹配(RabbitMQ 容器内以 UID 999 运行):mkdir -p /opt/rabbitmq/data && chown -R 999:999 /opt/rabbitmq/data。直接 chmod 777 是危险操作,不推荐。
RABBITMQ_DEFAULT_USER 和 RABBITMQ_DEFAULT_PASS 必须在首次启动时设置这两个环境变量只在容器第一次初始化时生效,用于创建初始用户和密码。如果容器已运行过、数据卷里已有 Mnesia 数据库,再改环境变量也不会更新账号——它只会被忽略。
所以正确顺序是:清空数据卷 → 启动带 -e RABBITMQ_DEFAULT_USER=xxx 的容器 → 登录确认。误操作后想重置,得连数据卷一起删掉再重来。
另外注意:RABBITMQ_DEFAULT_VHOST 可选,但设了之后默认 / vhost 就不可用了,所有客户端连接必须显式指定该 vhost,否则报 ACCESS_REFUSED 错误。
15672 端口映射 + 插件已启用官方 rabbitmq:3.13-management 镜像默认启用了 rabbitmq_management 插件,但如果你用的是 rabbitmq:3.13(无后缀),插件是关闭的,15672 映射了也打不开页面。
验证方式很简单:docker logs rabbitmq | grep "management plugin",看到 enabled 才算成功。如果没启用,别进容器手动执行 rabbitmq-plugins enable——这会破坏镜像设计逻辑,且下次重建容器又得重做。
稳妥做法只有两个:
– 拉取带 -management 后缀的镜像;
– 或在 docker-compose.yml 中加 command: rabbitmq-server -detached && rabbitmq-plugins enable rabbitmq_management(不推荐,复杂且易出错)。
docker-compose 管理比裸 run 更可靠单条 docker run 命令容易漏参数(比如 --restart=always、ulimits),而且无法声明依赖、健康检查、资源限制。生产环境几乎没人靠记忆敲长命令维护 RabbitMQ。
一个最小可用的 docker-compose.yml 应包含:
volumes: 用命名卷(如 rabbitmq_data:),而不是 ./data:/var/lib/rabbitmq
environment: 显式写全 RABBITMQ_DEFAULT_USER、RABBITMQ_DEFAULT_PASS、TZ
healthcheck: 用 curl -f http://localhost:15672/api/whoami 检测管理接口是否就绪ulimits: nofile: 65536,避免高并发下文件描述符耗尽真正容易被忽略的是:容器启动后,/var/lib/rabbitmq 目录下的文件属主必须是 999:999(即 rabbits 用户)。如果宿主机挂载目录权限不对,RabbitMQ 直接拒绝启动,日志里只有一句 Permission denied,查起来很隐蔽。