Docker 搭建 RabbitMQ的详细过程

 更新时间:2025年04月18日 10:11:48   作者:代码怪兽大作战  
在现代微服务与分布式架构中,RabbitMQ 是一款成熟的开源消息队列中间件,提供了可靠的消息投递、丰富的路由策略和管理插件,本文将详细介绍Docker 搭建 RabbitMQ的过程,感兴趣的朋友一起看看吧

前言

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

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

一、准备工作

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

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

  • Docker自动化安装
  • Docker手动安装

可以根据该文章的步骤进行安装:https://www.jb51.net/server/339879ek2.htm

二、设置目录结构

为了持久化存储日志、数据和配置,需要在宿主机上创建对应目录,并赋予 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> 替换为希望启用的插件名称。

到此这篇关于Docker 搭建 RabbitMQ的详细过程的文章就介绍到这了,更多相关Docker 搭建 RabbitMQ内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker容器与宿主机相互访问更方便的方法

    Docker容器与宿主机相互访问更方便的方法

    Docker是当今使用范围最广的开源容器技术之一,具有高效易用的优点,然而如果使用Docker时采取不当安全策略,则可能导致系统面临安全威胁,这篇文章主要给大家介绍了关于Docker容器与宿主机相互访问更方便的方法,需要的朋友可以参考下
    2023-05-05
  • docker安装目录迁移的两种常用方法

    docker安装目录迁移的两种常用方法

    docker目录的迁移其实非常简单,今天小编给大家分享两种方法帮助大家解决docker安装目录迁移问题,感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • 虚拟机如何安装指定版本的Docker举例详解

    虚拟机如何安装指定版本的Docker举例详解

    这篇文章主要介绍了虚拟机如何安装指定版本的Docker的相关资料,包括配置yum源、查看可用版本、安装指定版本、卸载旧版本、解决冲突、再次安装以及最后验证安装,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • docker-compose安装jenkins全过程

    docker-compose安装jenkins全过程

    本文详细介绍了如何在服务器上通过Docker安装和配置Jenkins,包括环境准备、安装JDK和Maven、配置环境变量、修改Maven设置、配置docker-compose.yml文件以及如何解决访问403错误等步骤,此外,还涵盖了如何新建流水线任务并配置pipeline脚本
    2024-09-09
  • Docker buildx构建多平台镜像并推送到私有仓库的方法

    Docker buildx构建多平台镜像并推送到私有仓库的方法

    这篇文章主要介绍了Docker buildx构建多平台镜像并推送到私有仓库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 解决Docker删除镜像报错:Error response from daemon:conflict:unable to delete xxx (cannot be forced)

    解决Docker删除镜像报错:Error response from daemon:con

    删除Docker镜像时遇到冲突,因为镜像正在被一个运行中的容器使用,解决方法是先停止并删除该容器,然后再尝试删除镜像,此外,还可以选择强制删除镜像,但这可能会导致数据丢失
    2024-11-11
  • ps命令在docker容器不存在的问题

    ps命令在docker容器不存在的问题

    这篇文章主要介绍了ps命令在docker容器不存在的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 使用docker compose部署emqx集群的示例

    使用docker compose部署emqx集群的示例

    这篇文章主要介绍了使用docker compose部署emqx集群,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • docker-compose容器互相连接的实现

    docker-compose容器互相连接的实现

    本文主要介绍了docker-compose容器互相连接的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Docker与DevOps的结合使用

    Docker与DevOps的结合使用

    结合Docker和DevOps文化的实践,可以帮助团队实现自动化、监控和日志管理等方面的最佳实践,本文将介绍如何将Docker与DevOps文化相结合使用,并详细阐述如何使用Docker进行DevOps自动化、监控和日志管理等方面的实践,需要的朋友参考下吧
    2023-08-08

最新评论