Docker 搭建 RabbitMQ
- 前言
- 一、准备工作
- 二、设置目录结构
- 三、编写启动脚本
- 四、Host 网络模式 vs Port 映射模式
- 1. Host 网络模式
- 2. Port 映射模式
- 五、端口配置对比
- 六、配置示例
- 七、查看与管理
- 八、扩展与高可用
- 九、常用命令
前言
在现代微服务与分布式架构中,RabbitMQ 是一款成熟的开源消息队列中间件,提供了可靠的消息投递、丰富的路由策略和管理插件。通过 Docker 部署 RabbitMQ,可以快速搭建、轻松扩展,并与容器化平台无缝集成。
本文将指导你通过 Docker 快速搭建一个 RabbitMQ 环境,讲解目录结构、启动脚本编写、参数详解,以及两种网络模式(Host 网络模式 vs Port 映射模式)的部署示例与对比。
一、准备工作
首先,确保你的系统上已经安装了 Docker。
Linux上进行Docker安装有两种方式:
- Docker自动化安装
- Docker手动安装
可以根据该文章的步骤进行安装:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502
二、设置目录结构
为了持久化存储日志、数据和配置,需要在宿主机上创建对应目录,并赋予 RabbitMQ 容器内部用户(UID 999)的写权限。
# 创建日志、数据和配置目录
mkdir -p "$DIR/rabbitmq/log"
mkdir -p "$DIR/rabbitmq/data"
mkdir -p "$DIR/rabbitmq/conf"# 设置目录权限为容器内 rabbitmq 用户(UID 999)
sudo chown -R 999:999 \"$DIR/rabbitmq/log" \"$DIR/rabbitmq/data" \"$DIR/rabbitmq/conf"
-
log
:存放 RabbitMQ 日志 -
data
:存放 Mnesia 数据库文件 -
conf
:存放自定义配置(如 rabbitmq.conf、advanced.config、enabled_plugins)
三、编写启动脚本
将目录准备工作与容器运行命令整合到脚本 rabbitmq_install.sh
中,方便一键部署与更新。
#!/bin/bash# 安装路径与容器名称
DIR="/opt/docker/demo"
DOCKER_NAME="docker-rabbitmq"# 创建目录并设置权限
mkdir -p "$DIR/rabbitmq/log"
mkdir -p "$DIR/rabbitmq/data"
mkdir -p "$DIR/rabbitmq/conf"sudo chown -R 999:999 "$DIR/rabbitmq/log" \"$DIR/rabbitmq/data" \"$DIR/rabbitmq/conf"# 运行 RabbitMQ 容器(Host 网络模式)
docker run -d \--restart=always \ # 容器重启策略--name "$DOCKER_NAME" \ # 容器名称--network host \ # 主机网络模式-v "$DIR/rabbitmq/log:/var/log/rabbitmq" \ # 日志挂载-v "$DIR/rabbitmq/data:/var/lib/rabbitmq/mnesia" \ # 数据挂载-v "$DIR/rabbitmq/conf:/etc/rabbitmq" \ # 配置挂载-e RABBITMQ_DEFAULT_USER=admin \ # 默认用户名-e RABBITMQ_DEFAULT_PASS=admin123456 \ # 默认密码-e RABBITMQ_ENABLED_PLUGINS="rabbitmq_management" \ # 启用管理插件rabbitmq:management # 官方管理版镜像
保存后,赋予执行权限并运行:
chmod +x run_rabbitmq.sh
./run_rabbitmq.sh
解释各个参数:
-d
:后台运行容器。--restart=always
:重启策略:当容器退出或 Docker 重启时,总是自动重启该容器。--name "$DOCKER_NAME"
:容器的名称为docker-rabbitmq
。--network host
:使用主机网络模式(Host networking),容器与宿主机共享网络栈。-v "$DIR/rabbitmq/log:/var/log/rabbitmq"
:日志挂载-v "$DIR/rabbitmq/data:/var/lib/rabbitmq/mnesia"
: 数据挂载。-v "$DIR/rabbitmq/conf:/etc/rabbitmq"
:配置挂载。-e RABBITMQ_DEFAULT_USER=…
:环境变量,设置 RabbitMQ 默认用户名(第一次启动时生效)。-e RABBITMQ_DEFAULT_PASS=…
:环境变量,设置 RabbitMQ 默认密码。-e RABBITMQ_ENABLED_PLUGINS=…
:环境变量,启用指定插件(以逗号分隔),此处开启管理控制台插件。rabbitmq:management
:指定镜像及标签,management
版本内置了管理插件与 Web 控制台。
四、Host 网络模式 vs Port 映射模式
1. Host 网络模式
-
命令示例
docker run -d \--restart=always \--name "$DOCKER_NAME" \--network host \-v "$DIR/rabbitmq/log:/var/log/rabbitmq" \-v "$DIR/rabbitmq/data:/var/lib/rabbitmq/mnesia" \-v "$DIR/rabbitmq/conf:/etc/rabbitmq" \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin123456 \-e RABBITMQ_ENABLED_PLUGINS="rabbitmq_management" \rabbitmq:management
-
特点
-
容器直接使用宿主机的网络栈,RabbitMQ 内部监听的端口(默认 5672、15672)会直接映射到宿主机相同端口。
-
网络性能最佳,无额外的 NAT 转发开销。
-
-
优点
-
简化网络配置,无需额外的 -p 端口映射。
-
延迟更低,吞吐更高。
-
-
缺点
-
与宿主机完全共享端口,若宿主机已有同端口服务运行,会冲突。
-
安全隔离较弱,容器网络直接暴露给宿主机。
-
2. Port 映射模式
-
命令示例
docker run -d \--restart=always \--name "$DOCKER_NAME" \-p 5673:5672 \-p 15673:15672 \-v "$DIR/rabbitmq/log:/var/log/rabbitmq" \-v "$DIR/rabbitmq/data:/var/lib/rabbitmq/mnesia" \-v "$DIR/rabbitmq/conf:/etc/rabbitmq" \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=admin123456 \-e RABBITMQ_ENABLED_PLUGINS="rabbitmq_management" \rabbitmq:management
-
含义
-
-p 5673:5672:将宿主机的 5673 端口映射到容器内的 5672(AMQP)端口。
-
-p 15673:15672:将宿主机的 15673 端口映射到容器内的 15672(管理控制台)端口。
-
-
优点
-
灵活指定宿主机端口,避免与其他服务冲突。
-
容器网络与宿主机隔离更好,安全性更高。
-
-
缺点
-
相比 Host 模式,略有端口转发开销。
-
需手动管理多端口映射配置。
-
五、端口配置对比
特性 | Host 网络模式 | Port 映射模式 |
---|---|---|
配置命令 | --network host | -p host:container |
网络性能 | 最佳,无 NAT 转发开销 | 有少量转发开销 |
端口冲突风险 | 高,容器直接占用宿主机端口 | 低,可自定义宿主机端口 |
安全隔离 | 较弱 | 较强 |
多容器端口复用 | 不支持 | 支持,不同容器映射到不同端口 |
配置复杂度 | 简单 | 需要显式映射 |
六、配置示例
-
rabbitmq.conf(放置于 $DIR/rabbitmq/conf/rabbitmq.conf)
# 修改 AMQP 端口 listeners.tcp.default = 5673 # 修改为你想要的端口# 修改 RabbitMQ 管理界面端口 management.listener.port = 15673 # 修改为你想要的端口# 允许非本地访问 guest 用户 loopback_users.guest = false
-
enabled_plugins(放置于 $DIR/rabbitmq/conf/enabled_plugins)
[rabbitmq_management,rabbitmq_peer_discovery_classic_config].
七、查看与管理
-
查看容器状态
docker ps | grep "$DOCKER_NAME"
-
查看日志
tail -f "$DIR/rabbitmq/log/rabbit@$(hostname).log"或docker logs -f $DOCKER_NAME
-
访问管理控制台
浏览器访问
http://<宿主机IP>:15672
,使用admin/admin123456
登录。
八、扩展与高可用
-
集群部署
-
在多台主机上运行相同脚本,调整容器名称与配置
-
使用
rabbitmq_peer_discovery_classic_config
或 Kubernetes 插件实现自动发现与集群组网
-
-
镜像队列与策略
- 在管理控制台或配置文件中设置队列镜像策略,确保消息持久化与高可用
-
监控与告警
- 接入 Prometheus、Grafana 等监控体系,利用 RabbitMQ Exporter 采集指标
九、常用命令
-
修改默认密码
如果需要修改 RabbitMQ 的默认密码,可以使用以下命令:
docker exec -it "$DOCKER_NAME" rabbitmqctl change_password admin newpassword
请将
newpassword
替换为希望设置的新密码。 -
启用其他插件
如果需要启用其他 RabbitMQ 插件,可以使用以下命令:
docker exec -it "$DOCKER_NAME" rabbitmq-plugins enable <plugin_name>
请将
<plugin_name>
替换为希望启用的插件名称。