跳到主要内容

Docker 部署 RabbitMQ

本页提供一个与具体应用无关的 RabbitMQ 单节点部署基线,适合本地开发、集成测试和受控内网环境。生产高可用需要单独设计集群、Quorum Queue、监控、容量和故障恢复,不能通过复制几个容器简单替代。

准备配置

示例跟踪 RabbitMQ 4.3 的 Management 镜像。上线前应结合客户端兼容性测试固定补丁版本或镜像摘要,并阅读目标版本的升级说明。

生成随机密码:

openssl rand -base64 32

将结果写入不受版本控制的 .env

.env
RABBITMQ_VERSION=4.3-management
RABBITMQ_USER=app_admin
RABBITMQ_PASSWORD=replace-with-a-long-random-password
RABBITMQ_VHOST=app

.env 会包含管理凭据,应限制文件权限并加入忽略列表。生产环境优先由部署平台的 Secret 管理系统注入这些变量。

Docker Compose

compose.yaml
services:
rabbitmq:
image: rabbitmq:${RABBITMQ_VERSION}
hostname: rabbitmq
restart: unless-stopped
ports:
- "127.0.0.1:5672:5672"
- "127.0.0.1:15672:15672"
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:?set RABBITMQ_USER in .env}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:?set RABBITMQ_PASSWORD in .env}
RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_VHOST:-app}
volumes:
- rabbitmq-data:/var/lib/rabbitmq
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
interval: 10s
timeout: 5s
retries: 12
start_period: 20s

volumes:
rabbitmq-data:

固定 hostname 可避免容器重建后节点名变化,RabbitMQ 的数据目录会保存在命名卷 rabbitmq-data。如果只有同一 Compose 网络内的应用需要连接,可以删除 ports,通过服务名 rabbitmq:5672 访问。

启动与验证

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail=200 rabbitmq

检查节点和告警:

docker compose exec rabbitmq rabbitmq-diagnostics -q check_running
docker compose exec rabbitmq rabbitmq-diagnostics -q check_local_alarms
docker compose exec rabbitmq rabbitmqctl list_vhosts
docker compose exec rabbitmq rabbitmqctl list_queues name messages consumers

管理界面位于 http://127.0.0.1:15672,AMQP 端口为 5672。示例只绑定回环地址;不要把管理界面和未加密的 AMQP 端口直接开放到公网。

配置与插件

复杂配置应写入 rabbitmq.conf,再只读挂载到 /etc/rabbitmq/rabbitmq.conf。需要额外插件时,建议构建可复现的派生镜像,而不是进入运行中的容器临时修改:

Dockerfile
FROM rabbitmq:4.3-management
RUN rabbitmq-plugins enable --offline rabbitmq_prometheus

启用插件前应确认它与 RabbitMQ/Erlang 版本兼容,并评估新增端口和权限。集群节点还需要统一 Erlang cookie、稳定节点名、节点发现和网络策略,这些不属于本页的单机示例。

定义备份与消息恢复

导出用户、vhost、权限、交换机、队列和绑定等定义:

mkdir -p backups
chmod 700 backups

docker compose exec rabbitmq \
rabbitmqctl export_definitions /tmp/definitions.json

docker compose cp \
rabbitmq:/tmp/definitions.json \
./backups/definitions.json

定义文件可能含用户密码哈希和权限信息,应按敏感数据保护。它不包含队列中的消息;消息恢复要依靠持久化消息、适当的队列类型、发布确认、消费幂等以及经过验证的节点/卷备份方案。

升级或复制数据卷前应停止写入并按 RabbitMQ 官方备份指南操作。不要在节点运行时直接复制 Mnesia 目录并假设一定可恢复。

停止与清理

docker compose stop
docker compose down

docker compose down 默认保留 rabbitmq-datadocker compose down -v 会永久删除节点元数据和仍在队列中的消息,只能在确认目标实例、备份与影响范围后执行。

官方资料