Docker 搭建 RabbitMQ

Docker 搭建 RabbitMQ


前言

在现代微服务与分布式架构中,RabbitMQ 是一款成熟的开源消息队列中间件,提供了可靠的消息投递、丰富的路由策略和管理插件。通过 Docker 部署 RabbitMQ,可以快速搭建、轻松扩展,并与容器化平台无缝集成。

本文将指导你通过 Docker 快速搭建一个 RabbitMQ 环境,讲解目录结构、启动脚本编写、参数详解,以及两种网络模式(Host 网络模式 vs Port 映射模式)的部署示例与对比。


一、准备工作

首先,确保你的系统上已经安装了 Docker。

Linux上进行Docker安装有两种方式:

  1. Docker自动化安装
  2. Docker手动安装

可以根据该文章的步骤进行安装:https://blog.csdn.net/weixin_44876263/article/details/136714078?spm=1001.2014.3001.5502

二、设置目录结构

为了持久化存储日志、数据和配置,需要在宿主机上创建对应目录,并赋予 RabbitMQ 容器内部用户(UID 999)的写权限。

bash 复制代码
# 创建日志、数据和配置目录
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 中,方便一键部署与更新。

bash 复制代码
#!/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                         # 官方管理版镜像

保存后,赋予执行权限并运行:

bash 复制代码
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 网络模式

  • 命令示例

    bash 复制代码
    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 映射模式

  • 命令示例

    bash 复制代码
    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 转发开销 有少量转发开销
端口冲突风险 高,容器直接占用宿主机端口 低,可自定义宿主机端口
安全隔离 较弱 较强
多容器端口复用 不支持 支持,不同容器映射到不同端口
配置复杂度 简单 需要显式映射

六、配置示例

  1. rabbitmq.conf(放置于 $DIR/rabbitmq/conf/rabbitmq.conf)

    bash 复制代码
    # 修改 AMQP 端口
    listeners.tcp.default = 5673  # 修改为你想要的端口
    
    # 修改 RabbitMQ 管理界面端口
    management.listener.port = 15673  # 修改为你想要的端口
    
    # 允许非本地访问 guest 用户
    loopback_users.guest = false
  2. enabled_plugins(放置于 $DIR/rabbitmq/conf/enabled_plugins)

    bash 复制代码
    [rabbitmq_management,rabbitmq_peer_discovery_classic_config].

七、查看与管理

  • 查看容器状态

    bash 复制代码
    docker ps | grep "$DOCKER_NAME"
  • 查看日志

    bash 复制代码
    tail -f "$DIR/rabbitmq/log/rabbit@$(hostname).log"
    
    或
    
    docker logs -f $DOCKER_NAME
  • 访问管理控制台

    浏览器访问 http://<宿主机IP>:15672,使用 admin/admin123456 登录。

八、扩展与高可用

  1. 集群部署

    • 在多台主机上运行相同脚本,调整容器名称与配置

    • 使用 rabbitmq_peer_discovery_classic_config 或 Kubernetes 插件实现自动发现与集群组网

  2. 镜像队列与策略

    • 在管理控制台或配置文件中设置队列镜像策略,确保消息持久化与高可用
  3. 监控与告警

    • 接入 Prometheus、Grafana 等监控体系,利用 RabbitMQ Exporter 采集指标

九、常用命令

  • 修改默认密码

    如果需要修改 RabbitMQ 的默认密码,可以使用以下命令:

    bash 复制代码
    docker exec -it "$DOCKER_NAME" rabbitmqctl change_password admin newpassword

    请将 newpassword 替换为希望设置的新密码。

  • 启用其他插件

    如果需要启用其他 RabbitMQ 插件,可以使用以下命令:

    bash 复制代码
    docker exec -it "$DOCKER_NAME" rabbitmq-plugins enable <plugin_name>

    请将 <plugin_name> 替换为希望启用的插件名称。

相关推荐
jingshaoqi_ccc8 小时前
ubuntu 24下面安装docker
ubuntu·docker·eureka
关关长语9 小时前
Vue本地部署包快速构建为Docker镜像
前端·vue.js·docker
水滴与鱼10 小时前
DOCKER制作ROS运行的镜像文件
运维·docker·容器
洒家肉山大魔王12 小时前
Kubernetes中Pod 处于 CrashLoopBackOff 状态(生产环境)
linux·容器·kubernetes·pod·pod循环重启
杨浦老苏13 小时前
安全的消息传递和协作工具Virola Messenger
docker·即时通讯·群晖·im
Lynnxiaowen13 小时前
今天我们学习kubernetes内容Ingress资源对象
学习·容器·kubernetes
jason成都14 小时前
emqx的docker部署
运维·docker·容器
mixboot15 小时前
docker 国内镜像源
docker·镜像源
谷粒.15 小时前
云原生时代的测试策略:Kubernetes环境下的测试实践
运维·网络·云原生·容器·kubernetes
java_logo16 小时前
Milvus GUI ATTU Docker 容器化部署指南
运维·数据库·docker·容器·eureka·milvus