别再手动编译了:Docker Compose 容器化部署 RabbitMQ

告别繁琐配置:Docker Compose 让 RabbitMQ 在 openEuler 上“一键起飞”

作者: ShunWah
公众号: "shunwah星辰数智社"主理人。

持有认证: OceanBase OBCA/OBCP、MySQL OCP、OpenGauss、崖山YCA、金仓KingBase KCA/KCP、KaiwuDB KWCA/KWCP、 亚信 AntDBCA、翰高 HDCA、GBase 8a/8c/8s、Galaxybase GBCA、Neo4j ScienceCertification、NebulaGraph NGCI/NGCP、东方通TongTech TCPE、TiDB PCTA等多项权威认证。

获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星 ,担任 OceanBase 社区版主及布道师。曾在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat Premium × 金仓数据库征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。

  • CSDN_ID: shunwahma
  • 墨天轮_ID:shunwah
  • ITPUB_ID: shunwah
  • IFClub_ID:shunwah

生成特定主题图片 2.jpg

前言

在微服务架构日益流行的今天,消息队列已经成为系统中不可或缺的一环。RabbitMQ 凭借其健壮性、灵活的路由机制以及易于管理的特点,成为了众多开发者的首选。然而,传统的 RabbitMQ 安装方式依赖 Erlang 环境,配置复杂,版本兼容性问题也常常让人头疼不已。

作为一名深耕云原生的运维开发者,笔者最近在  openEuler 22.03 (LTS-SP4) 系统上进行了一次彻底的 RabbitMQ 部署实践。通过 Docker 容器化技术,我们不仅能实现“一次构建,到处运行”,更能利用  docker-compose 将配置、存储、网络一键编排,彻底将 RabbitMQ 从繁杂的系统依赖中解耦出来。

本文将基于实际操作命令,手把手带你完成这一过程。文章不仅包含详细的步骤,还融入了实战中的踩坑与填坑经验,希望能帮你少走弯路。

一、环境概览与部署前准备

在正式动手之前,我们先来审视一下当前的“战场”环境,系统参数如下:

  • 操作系统:openEuler release 22.03 (LTS-SP4)
  • 内核版本:5.10.0-294.0.0.197.oe2203sp4.x86_64
  • 部署目录/data/rabbitmq
  • 编排工具:docker-compose version 1.28.6

openEuler 作为华为主导的开源操作系统,与 CentOS 高度兼容,但在软件源的细节上略有不同。我们在部署过程中需要特别注意 Docker 及 Docker Compose 的版本适配问题。

1.1 创建项目骨架

良好的目录结构是运维管理的基础。我们将遵循业界通用的习惯,将数据、配置和代码分离。

# 进入数据盘目录(根据你的规划)# 创建 RabbitMQ 项目目录[root@openeuler-server ~]# cd /data/[root@openeuler-server data]# mkdir -p rabbitmq/{data,config,logs}[root@openeuler-server data]#

image.png

# 进入项目目录[root@openeuler-server data]# cd rabbitmq/[root@openeuler-server rabbitmq]# lsconfig  data  logs
[root@openeuler-server rabbitmq]#

image.png

此时,目录结构如下:

[root@openeuler-server rabbitmq]# tree.
├── config
├── data
└── logs
3 directories, 0 files
[root@openeuler-server rabbitmq]#

image.png

目录说明:

/data/rabbitmq/
├── data        # 存放 RabbitMQ 的持久化数据(队列、消息)
├── config      # 存放自定义配置文件
└── logs        # 存放日志

1.2 审视 Docker 环境

虽然已安装 Docker Compose,但 openEuler 默认源中的 Docker 版本可能较旧。为了确保生产环境的稳定性,建议确认 Docker CE 的版本。

# 查看 Docker 版本[root@openeuler-server rabbitmq]# docker versionClient:
 Version:           20.10.24
 API version:       1.41
 Go version:        go1.19.7
 Git commit:        297e128
 Built:             Tue Apr  4 18:17:06 2023
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      trueServer: Docker Engine - Community
 Engine:
  Version:          20.10.24
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.19.7
  Git commit:       5d6db84
  Built:            Tue Apr  4 18:23:02 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.6.20
  GitCommit:        2806fc1057397dbaeefbea0e4e17bddfbd388f38
 runc:
  Version:          1.1.5
  GitCommit:        v1.1.5-0-gf19387a6
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
[root@openeuler-server rabbitmq]#

image.png

# 查看 Docker Compose 版本[root@openeuler-server rabbitmq]# docker-compose versiondocker-compose version 1.28.6, build 5db8d86f
docker-py version: 4.4.4
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
[root@openeuler-server rabbitmq]#

image.png

小贴士:如果  docker version 显示的版本低于 20.10,建议参考 openEuler 社区的文档或 Docker 官方文档进行升级。较新的版本对资源限制和网络管理更友好。

二、构建 Docker Compose 编排文件

docker-compose.yml 是整个部署的核心。它将定义 RabbitMQ 容器的生命周期、网络、端口和存储。

2.1 编写基础编排文件

在项目根目录  /data/rabbitmq/ 下创建  docker-compose.yml 文件:

[root@openeuler-server rabbitmq]# vim docker-compose.yml
version: '3.8'services:
  rabbitmq:
    # 选择带有 management 插件的版本,方便通过 Web 管理
    image: rabbitmq:3.13-management-alpine
    container_name: rabbitmq-server
    restart: unless-stopped
    # 设置主机名,这对 RabbitMQ 集群和持久化很重要
    hostname: rabbitmq-node-1
    ports:
      # AMQP 协议端口,供客户端(如 Python、Java 程序)连接
      - "5672:5672"
      # Web 管理界面端口
      - "15672:15672"
    environment:
      # 时区设置
      TZ: Asia/Shanghai
      # 默认管理员账号(生产环境建议通过文件或密钥管理密码)
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: your_strong_password
      # 配置内存高水位线,设置为物理内存的 40%
      RABBITMQ_VM_MEMORY_HIGH_WATERMARK: 0.4
    volumes:
      # 挂载数据目录,防止容器删除后数据丢失
      - ./data:/var/lib/rabbitmq
      # 挂载日志目录
      - ./logs:/var/log/rabbitmq
      # 如果需要自定义配置,可以挂载配置文件
      - ./config/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf:ro
    ulimits:
      # 增加文件描述符限制,应对高并发场景
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "ping"]      interval: 30s
      timeout: 10s
      retries: 5# 定义网络(默认会创建 bridge 网络,这里显式声明便于后续扩展)networks:
  default:
    name: rabbitmq_network
    driver: bridge

image.png

2.2 配置参数深度解析

在这个配置文件中,有几点需要特别关注:

  1. 数据持久化 ( volumes):这是容器化部署的生命线。如果没有将  /var/lib/rabbitmq 挂载出来,一旦容器重启或崩溃,所有队列和消息都会消失。
  2. 资源限制 ( ulimits):RabbitMQ 依赖操作系统管理文件句柄。在高并发下,默认的 1024 很容易耗尽,导致连接被拒绝。这里我们将其硬性提升到 65536。
  3. 内存水位线 ( RABBITMQ_VM_MEMORY_HIGH_WATERMARK):这个参数设置得非常巧妙。它告诉 RabbitMQ,当内存使用达到系统内存的 40% 时,开始阻塞消息发布者,防止内存溢出导致进程崩溃。
  4. 健康检查 ( healthcheck):这个配置对于 Kubernetes 或服务编排非常有用,可以让上层应用知道 RabbitMQ 是否真正“活”着。

三、实战部署与启动

文件准备好后,我们开始真正的部署。

3.1 启动容器

# 确保我们在 /data/rabbitmq 目录下[root@openeuler-server rabbitmq]# pwd/data/rabbitmq
[root@openeuler-server rabbitmq]# lsconfig  data  docker-compose.yml  logs
[root@openeuler-server rabbitmq]#

image.png

# 后台启动所有服务[root@openeuler-server rabbitmq]# docker-compose up -dCreating network "rabbitmq_network" with driver "bridge"Pulling rabbitmq (rabbitmq:3.13-management-alpine)...
3.13-management-alpine: Pulling from library/rabbitmq
2d35ebdb57d9: Pull complete
7f4fe0a74327: Pull complete
fe0979840307: Pull complete
5541f4a1e9a3: Pull complete
f7900ae6286e: Pull complete
64a815d19254: Pull complete
5a8ebb2679b2: Pull complete
3fdf1da6c087: Pull complete
3c428bdb4834: Pull complete
9ab46c560811: Pull complete
Digest: sha256:606d8c0d6b3c18d1da9afc53bc7cdb2a8d5486df91b5a9830e9e07626c9ae281
Status: Downloaded newer image for rabbitmq:3.13-management-alpine
Creating rabbitmq-server ... done[root@openeuler-server rabbitmq]#

image.png

3.2 验证运行状态

启动完成后,检查容器运行状态:

# 查看容器列表[root@openeuler-server rabbitmq]# docker-compose ps
     Name                    Command                 State      Ports
---------------------------------------------------------------------
rabbitmq-server   docker-entrypoint.sh rabbi ...   Restarting        
[root@openeuler-server rabbitmq]# docker-compose logs -fAttaching to rabbitmq-server
rabbitmq-server | error: RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated
rabbitmq-server | error: deprecated environment variables detected
rabbitmq-server | 
rabbitmq-server | Please use a configuration file instead; visit https://www.rabbitmq.com/configure.html to learn more
rabbitmq-server | 
rabbitmq-server | error: RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated
rabbitmq-server | error: deprecated environment variables detected
rabbitmq-server |

容器启动失败,原因是  rabbitmq:3.13-management-alpine 镜像 已弃用通过环境变量  RABBITMQ_VM_MEMORY_HIGH_WATERMARK 设置内存高水位的方式。新版本强制要求通过配置文件管理高级参数,这是 RabbitMQ 官方为统一配置管理做出的变更。

3.3 快速修复步骤

3.3.1 停止并清理当前失败容器

# 在 /data/rabbitmq 目录下执行docker-compose down

3.3.2 创建配置文件

在  config 目录下新建  rabbitmq.conf 文件:

[root@openeuler-server rabbitmq]# vim config/rabbitmq.conf

写入内存水位设置:

vm_memory_high_watermark.absolute = 2GB

image.png

3.3.3 修改 docker-compose.yml

打开  docker-compose.yml删除  environment 块中的  RABBITMQ_VM_MEMORY_HIGH_WATERMARK 这一行。修改后的  environment 部分:

environment:
  TZ: Asia/Shanghai
  RABBITMQ_DEFAULT_USER: admin
  RABBITMQ_DEFAULT_PASS: your_strong_password
  # 注意:下面这行已删除
  # RABBITMQ_VM_MEMORY_HIGH_WATERMARK: 0.4

image.png

3.3.4 重新启动

[root@openeuler-server rabbitmq]# docker-compose up -dCreating network "rabbitmq_network" with driver "bridge"Creating rabbitmq-server ... done[root@openeuler-server rabbitmq]#

image.png

3.3.5 检查状态

[root@openeuler-server rabbitmq]# docker-compose ps
     Name                 Command              State                Ports         
----------------------------------------------------------------------------------
rabbitmq-server   docker-entrypoint.sh      Up (healthy)   15671/tcp, 0.0.0.0:1567
                  rabbi ...                                2->15672/tcp,:::15672->
                                                           15672/tcp, 15691/tcp,  
                                                           15692/tcp, 25672/tcp,  
                                                           4369/tcp, 5671/tcp, 0.0
                                                           .0:5672->5672/tcp,:::
                                                           5672->5672/tcp         
[root@openeuler-server rabbitmq]#

image.png

# 查看日志,确认无 deprecated 错误docker-compose logs

原因说明:RabbitMQ 从 3.9 版本开始逐步淘汰通过环境变量设置内存/磁盘限制的方式,推荐统一使用  rabbitmq.conf 配置文件。

四、管理与功能验证

部署完成后,验证服务可用性是关键。

4.1 Web 管理界面访问

打开浏览器,访问  http://你的服务器IP:15672

http://127.0.0.1:15672/#/

image.png

登录凭证:

  • Usernameadmin (docker-compose.yml 中设置的用户)
  • Passwordyour_strong_password

登录成功后,可看到 RabbitMQ 概览页面,监控连接数、消息速率、内存和磁盘使用情况:
image.png

4.2 创建测试队列

  1. 点击上方的  “Queues” 选项卡:
    image.png

  2. 在 “Add a new queue” 区域,填写 Name 为  test_queue
    image.png

  3. 其他选项保持默认,点击 “Add queue”:
    image.png

  4. 创建成功后,列表中会显示  test_queue,Features 列显示  D(Durable,持久化):
    image.png

4.3 命令行快速测试

利用 RabbitMQ 自带命令行工具测试收发消息:

4.3.1 进入容器内部

# 进入容器[root@openeuler-server rabbitmq]# docker exec -it rabbitmq-server /bin/bashrabbitmq-node-1:/#

image.png

4.3.2 声明队列

# 在宿主机执行,声明持久化队列[root@openeuler-server rabbitmq]# docker exec -it rabbitmq-server rabbitmqadmin \>   -u admin \
>   -p 'Us&SmMNl@5H6' \
>   declare queue name=test_queue durable=truequeue declared
[root@openeuler-server rabbitmq]#

image.png

4.3.3 发布消息

# 发布测试消息到队列[root@openeuler-server rabbitmq]# docker exec -it rabbitmq-server rabbitmqadmin \>   -u admin \
>   -p 'Us&SmMNl@5H6' \
>   publish exchange=amq.default routing_key=test_queue payload="Hello openEuler"Message published
[root@openeuler-server rabbitmq]#

image.png

4.3.4 消费消息

# 获取并确认消息[root@openeuler-server rabbitmq]# docker exec -it rabbitmq-server rabbitmqadmin \>   -u admin \
>   -p 'Us&SmMNl@5H6' \
>   get queue=test_queue ackmode=ack_requeue_false
+-------------+----------+---------------+-----------------+---------------+------------------+------------+-------------+
| routing_key | exchange | message_count |     payload     | payload_bytes | payload_encoding | properties | redelivered |
+-------------+----------+---------------+-----------------+---------------+------------------+------------+-------------+
| test_queue  |          | 0             | Hello openEuler | 15            | string           |            | False       |
+-------------+----------+---------------+-----------------+---------------+------------------+------------+-------------+
[root@openeuler-server rabbitmq]#

image.png

此时应该会显示一条包含 Hello openEuler 的消息记录,表明消息已成功存入并被取出。

Web 管理界面可以访问了,成功在 openEuler 上通过 Docker Compose 部署了 RabbitMQ!? 从你提供的截图看,RabbitMQ 3.13.7 运行正常,内存占用约 166 MiB,磁盘空间充足,节点已运行 25 分钟,所有指标都很健康。

4.4 当前部署成果

  • RabbitMQ 版本:3.13.7 (Erlang 26.2.5.16)
  • Web 管理地址http://127.0.0.1:15672(内网可访问)
  • 登录凭证:admin / Us&SmMNl@5H6(请在安全操作后尽快修改)
  • 已创建队列test_queue(持久化)
  • 消息收发测试:已成功发布并消费一条测试消息,队列功能正常

4.5 安全加固与端口扩展

4.5.1 修改管理员密码

通过 Web 界面修改密码,避免命令行暴露的安全风险:

  • 点击右上角 “admin” → “Change password”
  • 输入新密码(避免特殊字符如  &,或后续使用配置文件管理)
    image.png

4.5.2 暴露 metrics 端口(可选)

如需在外部访问监控指标,需添加端口映射:

  1. 编辑  docker-compose.yml,在  ports 部分增加:
ports:
  - "5672:5672"
  - "15672:15672"
  - "15692:15692"   # 新增 metrics 端口映射

image.png

  1. 重新启动容器:
[root@openeuler-server rabbitmq]# vim docker-compose.yml [root@openeuler-server rabbitmq]# docker-compose up -dCreating network "rabbitmq_network" with driver "bridge"Creating rabbitmq-server ... done[root@openeuler-server rabbitmq]#

image.png

  1. 检查端口监听:
[root@openeuler-server rabbitmq]# ss -tlnp | grep 15692LISTEN 0      1024         0.0.0.0:15692      0.0.0.0:*    users:(("docker-proxy",pid=1429024,fd=4))
LISTEN 0      1024            [::]:15692         [::]:*    users:(("docker-proxy",pid=1429032,fd=4))
[root@openeuler-server rabbitmq]#

image.png

  1. 测试 metrics 访问:
[root@openeuler-server rabbitmq]# curl http://127.0.0.1:15692/metrics# TYPE erlang_mnesia_held_locks gauge# HELP erlang_mnesia_held_locks Number of held locks.erlang_mnesia_held_locks 0# TYPE erlang_mnesia_lock_queue gauge# HELP erlang_mnesia_lock_queue Number of transactions waiting for a lock.erlang_mnesia_lock_queue 0# TYPE erlang_mnesia_transaction_participants gauge# HELP erlang_mnesia_transaction_participants Number of participant transactions.erlang_mnesia_transaction_participants 0# TYPE erlang_mnesia_transaction_coordinators gauge# HELP erlang_mnesia_transaction_coordinators Number of coordinator transactions.erlang_mnesia_transaction_coordinators 0# TYPE erlang_mnesia_failed_transactions counter

image.png

总结

通过本文的实战,在 openEuler 22.03 上成功部署了 RabbitMQ,更重要的是掌握了一套云原生时代的软件交付思路。

回顾整个过程,利用 Docker Compose 将复杂的环境依赖封装在容器内,通过短短几十行 YAML 代码,定义了端口、资源限制、数据卷和健康检查。这种方式不仅适用于 RabbitMQ,同样可以推广到 Nacos、Redis、MySQL 等中间件的部署上。

核心要点总结:

  1. 版本适配:RabbitMQ 3.13 版本弃用了部分环境变量配置,需通过  rabbitmq.conf 管理内存等高阶参数,部署时需关注版本特性变更;
  2. 容器化优势:Docker Compose 实现了 RabbitMQ 与系统环境解耦,数据卷挂载保证了消息持久化,避免容器重启导致数据丢失;
  3. 运维规范:部署后需及时修改默认密码、扩展监控端口,同时定期备份数据卷,确保生产环境的安全性和可观测性。

作者注

—— 本文所有操作及测试均基于  openEuler 22.03 (LTS-SP4) 操作系统,Docker 版本 20.10.24,Docker Compose 版本 1.28.6,RabbitMQ 镜像版本为  rabbitmq:3.13-management-alpine,在  x86_64 架构环境下完成,核心围绕  Docker Compose 编排部署与基础功能验证实战 展开。请注意,RabbitMQ 及相关容器镜像版本处于持续迭代中,部分配置方式与特性表现可能随版本更新发生变化,请以  RabbitMQ 官方文档 最新内容为准。

—— 以上仅为个人实战经验总结,不代表行业普遍观点。所有操作均需在具备足够权限的环境下执行,涉及生产环境时请提前做好数据备份与灰度测试,避免影响业务稳定性。文中案例与实操思路仅供参考,若与实际项目场景巧合,纯属无意。


请使用浏览器的分享功能分享到微信等