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> 替换为希望启用的插件名称。

相关推荐
AmazingKO12 分钟前
制作像素风《饥荒》类游戏的整体蓝图和流程
人工智能·python·游戏·docker·visual studio code·竹相左边
慧一居士3 小时前
Kubernetes(K8S)内部功能总结
云原生·容器·kubernetes
rider1893 小时前
【4】k8s集群管理系列--harbor镜像仓库本地化搭建
云原生·容器·kubernetes
m0_731187884 小时前
docker compose搭建博客wordpress
docker·容器·eureka
jessezappy4 小时前
记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径
docker·dify·anythingllm·ollama·本地知识库·ragflow·deepseek
锋丷4 小时前
Docker安装 (centos)
docker·容器·centos
程序设计实验室5 小时前
Traefik,想说爱你不容易:一场动态反向代理的心累之旅
linux·docker·devops·traefik·caddy
KubeSphere 云原生7 小时前
云原生周刊:K8s 中的 GPU 共享
云原生·容器·kubernetes
M-bao7 小时前
RabbitMQ demo案例
分布式·rabbitmq