告别繁琐配置: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

在微服务架构日益流行的今天,消息队列已经成为系统中不可或缺的一环。RabbitMQ 凭借其健壮性、灵活的路由机制以及易于管理的特点,成为了众多开发者的首选。然而,传统的 RabbitMQ 安装方式依赖 Erlang 环境,配置复杂,版本兼容性问题也常常让人头疼不已。
作为一名深耕云原生的运维开发者,笔者最近在
openEuler 22.03 (LTS-SP4) 系统上进行了一次彻底的 RabbitMQ 部署实践。通过 Docker 容器化技术,我们不仅能实现“一次构建,到处运行”,更能利用
docker-compose 将配置、存储、网络一键编排,彻底将 RabbitMQ 从繁杂的系统依赖中解耦出来。
本文将基于实际操作命令,手把手带你完成这一过程。文章不仅包含详细的步骤,还融入了实战中的踩坑与填坑经验,希望能帮你少走弯路。
在正式动手之前,我们先来审视一下当前的“战场”环境,系统参数如下:
/data/rabbitmqopenEuler 作为华为主导的开源操作系统,与 CentOS 高度兼容,但在软件源的细节上略有不同。我们在部署过程中需要特别注意 Docker 及 Docker Compose 的版本适配问题。
良好的目录结构是运维管理的基础。我们将遵循业界通用的习惯,将数据、配置和代码分离。
# 进入数据盘目录(根据你的规划)# 创建 RabbitMQ 项目目录[root@openeuler-server ~]# cd /data/[root@openeuler-server data]# mkdir -p rabbitmq/{data,config,logs}[root@openeuler-server data]#

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

此时,目录结构如下:
[root@openeuler-server rabbitmq]# tree. ├── config ├── data └── logs 3 directories, 0 files [root@openeuler-server rabbitmq]#

目录说明:
/data/rabbitmq/ ├── data # 存放 RabbitMQ 的持久化数据(队列、消息) ├── config # 存放自定义配置文件 └── logs # 存放日志
虽然已安装 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]#

# 查看 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]#

小贴士:如果
docker version 显示的版本低于 20.10,建议参考 openEuler 社区的文档或 Docker 官方文档进行升级。较新的版本对资源限制和网络管理更友好。
docker-compose.yml 是整个部署的核心。它将定义 RabbitMQ 容器的生命周期、网络、端口和存储。
在项目根目录
/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

在这个配置文件中,有几点需要特别关注:
volumes):这是容器化部署的生命线。如果没有将
/var/lib/rabbitmq 挂载出来,一旦容器重启或崩溃,所有队列和消息都会消失。ulimits):RabbitMQ 依赖操作系统管理文件句柄。在高并发下,默认的 1024 很容易耗尽,导致连接被拒绝。这里我们将其硬性提升到 65536。RABBITMQ_VM_MEMORY_HIGH_WATERMARK):这个参数设置得非常巧妙。它告诉 RabbitMQ,当内存使用达到系统内存的 40% 时,开始阻塞消息发布者,防止内存溢出导致进程崩溃。healthcheck):这个配置对于 Kubernetes 或服务编排非常有用,可以让上层应用知道 RabbitMQ 是否真正“活”着。文件准备好后,我们开始真正的部署。
# 确保我们在 /data/rabbitmq 目录下[root@openeuler-server rabbitmq]# pwd/data/rabbitmq [root@openeuler-server rabbitmq]# lsconfig data docker-compose.yml logs [root@openeuler-server rabbitmq]#

# 后台启动所有服务[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]#

启动完成后,检查容器运行状态:
# 查看容器列表[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 官方为统一配置管理做出的变更。
# 在 /data/rabbitmq 目录下执行docker-compose down
在
config 目录下新建
rabbitmq.conf 文件:
[root@openeuler-server rabbitmq]# vim config/rabbitmq.conf
写入内存水位设置:
vm_memory_high_watermark.absolute = 2GB

打开
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

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

[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]#

# 查看日志,确认无 deprecated 错误docker-compose logs
原因说明:RabbitMQ 从 3.9 版本开始逐步淘汰通过环境变量设置内存/磁盘限制的方式,推荐统一使用
rabbitmq.conf 配置文件。
部署完成后,验证服务可用性是关键。
打开浏览器,访问
http://你的服务器IP:15672:
http://127.0.0.1:15672/#/

登录凭证:
admin (docker-compose.yml 中设置的用户)your_strong_password登录成功后,可看到 RabbitMQ 概览页面,监控连接数、消息速率、内存和磁盘使用情况:

点击上方的
“Queues” 选项卡:

在 “Add a new queue” 区域,填写 Name 为
test_queue:

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

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

利用 RabbitMQ 自带命令行工具测试收发消息:
# 进入容器[root@openeuler-server rabbitmq]# docker exec -it rabbitmq-server /bin/bashrabbitmq-node-1:/#

# 在宿主机执行,声明持久化队列[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]#

# 发布测试消息到队列[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]#

# 获取并确认消息[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]#

此时应该会显示一条包含 Hello openEuler 的消息记录,表明消息已成功存入并被取出。
Web 管理界面可以访问了,成功在 openEuler 上通过 Docker Compose 部署了 RabbitMQ!🎉 从你提供的截图看,RabbitMQ 3.13.7 运行正常,内存占用约 166 MiB,磁盘空间充足,节点已运行 25 分钟,所有指标都很健康。
http://127.0.0.1:15672(内网可访问)test_queue(持久化)通过 Web 界面修改密码,避免命令行暴露的安全风险:
&,或后续使用配置文件管理)

如需在外部访问监控指标,需添加端口映射:
docker-compose.yml,在
ports 部分增加:ports: - "5672:5672" - "15672:15672" - "15692:15692" # 新增 metrics 端口映射

[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]#

[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]#

[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

通过本文的实战,在 openEuler 22.03 上成功部署了 RabbitMQ,更重要的是掌握了一套云原生时代的软件交付思路。
回顾整个过程,利用 Docker Compose 将复杂的环境依赖封装在容器内,通过短短几十行 YAML 代码,定义了端口、资源限制、数据卷和健康检查。这种方式不仅适用于 RabbitMQ,同样可以推广到 Nacos、Redis、MySQL 等中间件的部署上。
核心要点总结:
rabbitmq.conf 管理内存等高阶参数,部署时需关注版本特性变更;作者注:
—— 本文所有操作及测试均基于 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 官方文档 最新内容为准。
—— 以上仅为个人实战经验总结,不代表行业普遍观点。所有操作均需在具备足够权限的环境下执行,涉及生产环境时请提前做好数据备份与灰度测试,避免影响业务稳定性。文中案例与实操思路仅供参考,若与实际项目场景巧合,纯属无意。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70042915/viewspace-3113751/ ,如需转载,请注明出处,否则将追究法律责任。