ubuntu24使用docker搭建rabbitmq

目录

    • [一、场景 & 服务器配置建议](#一、场景 & 服务器配置建议)
      • [1. 业务量:每天 5000 万任务](#1. 业务量:每天 5000 万任务)
    • [二、镜像版本解释:`rabbitmq:management` vs `rabbitmq:4-management`](#二、镜像版本解释:rabbitmq:management vs rabbitmq:4-management)
    • [三、最终推荐的 `docker-compose.yml`(去掉 vm_memory_high_watermark)](#三、最终推荐的 docker-compose.yml(去掉 vm_memory_high_watermark))
    • [四、healthcheck 是干嘛的?](#四、healthcheck 是干嘛的?)
    • [五、docker-compose 文件放哪里、怎么运行?](#五、docker-compose 文件放哪里、怎么运行?)
    • [六、如何卸载 / 重装 RabbitMQ(Docker 版)](#六、如何卸载 / 重装 RabbitMQ(Docker 版))
    • [七、docker compose 看日志(跟 docker 一样吗)](#七、docker compose 看日志(跟 docker 一样吗))
    • [八、遇到的报错:`RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated`](#八、遇到的报错:RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated)

一、场景 & 服务器配置建议

1. 业务量:每天 5000 万任务

假设情况:

  • 每条任务作为一条消息进入 MQ;
  • 消费能力跟得上(不会长时间堆积几亿条);
  • 消息体不极大(几百字以内 JSON)。

综合经验 + 官方建议,大概这样配置比较合适:

CPU
  • 8 核起步(物理核)

  • MQ 本身 CPU 压力不大,但你还有:

    • 连接数管理
    • 消息路由
    • ack/confirm
    • 管理界面 / metrics

你现在常用 8 核 16G 的机子,拿一台专门跑 MQ 问题不大。

内存
  • 16 GB 比较舒服

  • 只给 MQ 用的话,设置个粗暴经验:

    • RabbitMQ 内部会自己根据物理内存算内存 watermark;
    • 我们这次就 不主动改内存 watermark 了,避免你遇到的报错。
磁盘容量

关键是:是否会堆积很多"未消费的持久化消息"

  • 如果只是任务很快消费,队列里不会长期积压几千万:

    • MQ 本身持久化 + 元数据用不了太多(几十 GB 内)

    • 建议:系统盘 + 数据盘

      • 系统盘:40--80 GB
      • 数据盘(挂载到 /data/rabbitmq):200 GB--500 GB,足够你观察一段时间
  • 如果存在:

    • 夜间批量写入,白天消费
    • 或者某些异常可能短期堆积几亿条消息
      那就建议把数据盘再拉大,比如 1 TB 级别

一句话总结:

你这种"每天 5000w 任务",实际用下来,200--500 GB 的 SSD/NVMe 数据盘,90% 场景够用,后面不够再扩容。

磁盘 IO 要求

RabbitMQ 属于"高 IOPS + 小块写入"的应用:

  • 强烈建议:SSD / NVMe 独立挂载一块盘,比如:

    • nvme0n1 → 挂载到 /data
    • RabbitMQ 数据目录指到 /data/rabbitmq
  • 大概指标印象:

    • IOPS:几千级就够用(云盘一般轻松满足)
    • 延迟:单次读写 <1ms 越好

如果你在同一块机械盘上又跑 DB 又跑 MQ,又跑爬虫日志,那就可能出现磁盘队头排队,吞吐掉下去。


二、镜像版本解释:rabbitmq:management vs rabbitmq:4-management

  • rabbitmq:management

    • 通常是 "当前默认稳定大版本 + management 插件"
    • 比如之前常见的是 3.13.x-management
  • rabbitmq:4-management

    • 明确指定:4.x 大版本 + management 插件

    • 好处:

      • 你现在用的是 4.x 系列(更"新",接口/配置也有变化,比如你遇到的 env 弃用)
      • 将来 RabbitMQ 出 5.x 时,rabbitmq:management 可能自动升级到 5.x;
        rabbitmq:4-management 依然在 4.x,不会突然大升级。

你的偏好:"用最新稳定版"

  • 如果你 想尝鲜 + 不怕大版本升级 :用 rabbitmq:management
  • 如果你想 锁定在 4.x 系列 (推荐生产这样搞):用 rabbitmq:4-management

你现在这个写法是 OK 的:

yaml 复制代码
image: rabbitmq:4-management

三、最终推荐的 docker-compose.yml(去掉 vm_memory_high_watermark)

下面这个版本已经删掉 了会导致报错的 RABBITMQ_VM_MEMORY_HIGH_WATERMARK,只保留常用 & 安全配置。

yaml 复制代码
version: "3.8"

services:
  rabbitmq:
    image: rabbitmq:4-management
    container_name: rabbitmq
    restart: always
    hostname: rabbitmq-1

    ports:
      - "5672:5672"    # 应用连接用的 AMQP 端口
      - "15672:15672"  # Web 管理界面

    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: your_strong_password_here
      # 注意:不要再加 RABBITMQ_VM_MEMORY_HIGH_WATERMARK 相关变量,4.x 已不推荐用 env 改

    volumes:
      - /data/rabbitmq/data:/var/lib/rabbitmq
      - /data/rabbitmq/log:/var/log/rabbitmq

    ulimits:
      nofile:
        soft: 1000000
        hard: 1000000

    # 生产环境可以加健康检查(可选)
    # healthcheck:
    #   test: ["CMD", "rabbitmq-diagnostics", "ping"]
    #   interval: 30s
    #   timeout: 5s
    #   retries: 5

说明要点

  1. 账号密码是否通用?

    • RABBITMQ_DEFAULT_USER / PASS 是 MQ 的用户:

      • 使用 5672 端口 的应用连接,需要这个账号密码(AMQP 协议)
      • 使用 15672 管理界面 登录,也可以用这个账号密码
    • 所以你可以理解为:两个端口都是这个账号密码在用,只是协议不同(一个 AMQP,一个 HTTP)。

  2. ulimits 参数解释

    yaml 复制代码
    ulimits:
      nofile:
        soft: 1000000
        hard: 1000000
    • nofile = 单进程最大打开文件数(套接字也算文件)
    • soft = 运行时默认限制
    • hard = 上限,soft 不能超过 hard

    MQ 连接多、队列多、文件句柄多,所以要放大。

    是不是越大越好?

    • 不是。

    • 太大可能会:

      • 超出内核或系统允许范围(比如你没改 /etc/security/limits.conf,容器里配 1000000 也没用)
      • 在极端情况下放大内核内存占用(文件描述符表)

    一般推荐:

    • 生产 MQ:至少 100,000--200,000

    • 你改成 1,000,000 也可以,只要:

      • 宿主机 ulimit -n 也调大
      • /etc/security/limits.conf 和 Docker daemon 没有限制住
  3. 系统级 ulimit 如何调整

    以 Ubuntu 为例,步骤大概是:

    1. 编辑 /etc/security/limits.conf

      bash 复制代码
      sudo vim /etc/security/limits.conf

      追加:

      text 复制代码
      * soft nofile 1000000
      * hard nofile 1000000

      如果你有专门的运行用户(比如 dockerubuntu),也可以写成:

      text 复制代码
      ubuntu soft nofile 1000000
      ubuntu hard nofile 1000000
    2. 编辑 /etc/pam.d/common-session/etc/pam.d/common-session-noninteractive,保证有这一行(Ubuntu 一般默认有):

      text 复制代码
      session required pam_limits.so
    3. 重新登录 SSH(非常关键),然后执行:

      bash 复制代码
      ulimit -n

      确认已经变大。

    4. Docker 容器里你已经在 docker-compose.yml 里用 ulimits 放大了,就能继承宿主机的上限。


四、healthcheck 是干嘛的?

yaml 复制代码
# healthcheck:
#   test: ["CMD", "rabbitmq-diagnostics", "ping"]
#   interval: 30s
#   timeout: 5s
#   retries: 5
  • 这块是 Docker 的健康检查配置(被我注释掉了,可按需打开):

    • 每隔 interval(30s)执行一次 rabbitmq-diagnostics ping
    • 超过 timeout(5s)视为失败
    • 连续失败 retries 次,容器健康状态变为 unhealthy

用途:

  • 方便你在:

    • docker psdocker compose ps 看到容器健康状态
    • 结合 Swarm/K8s 等编排时,进行自动重启 / 剔除

不影响 MQ 正常跑,只是监控和编排更友好。


五、docker-compose 文件放哪里、怎么运行?

  1. 随便建一个目录,比如:

    bash 复制代码
    mkdir -p /opt/rabbitmq-docker
    cd /opt/rabbitmq-docker
  2. 创建 docker-compose.yml 文件:

    bash 复制代码
    vim docker-compose.yml
    # 把前面的 compose 内容粘进去,保存
  3. 启动:

    bash 复制代码
    docker compose up -d

(旧版本 docker 可能是 docker-compose up -d

  1. 查看容器状态:

    bash 复制代码
    docker compose ps
  2. 访问管理界面:

    • 浏览器打开:http://服务器IP:15672
    • 账号密码:RABBITMQ_DEFAULT_USER / PASS 对应的值。

六、如何卸载 / 重装 RabbitMQ(Docker 版)

Docker 的"卸载"本质上是:停止容器 + 删容器 + 删数据卷目录。

  1. 先停容器:

    bash 复制代码
    cd /opt/rabbitmq-docker
    docker compose down
    • 这一步只会关掉容器,不会删你挂载的 /data/rabbitmq/... 目录。
  2. 如果你打算 彻底干净重装(包括删除所有队列数据)

    bash 复制代码
    rm -rf /data/rabbitmq/data
    rm -rf /data/rabbitmq/log
  3. 再次启动(相当于全新安装):

    bash 复制代码
    docker compose up -d
  4. 如果只是想换配置(比如改账号、改端口),一般只需要:

    • docker-compose.yml

    • 然后:

      bash 复制代码
      docker compose down
      docker compose up -d

    不删 /data 就不会丢消息。


七、docker compose 看日志(跟 docker 一样吗)

基本一样:

  • 当前目录是 docker-compose.yml 所在目录时:

    bash 复制代码
    # 看所有服务的日志
    docker compose logs -f
    
    # 只看 rabbitmq 这个服务
    docker compose logs -f rabbitmq
    
    # 查看最近 100 行
    docker compose logs --tail=100 rabbitmq
  • 单纯 docker 也类似:

    bash 复制代码
    docker logs -f rabbitmq

两者差异:

  • docker compose logs 会按 compose 里的 service 名称来过滤;
  • docker logs 用的是容器名或 ID。

八、遇到的报错:RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated

这个是 RabbitMQ 4.x 的新行为:

  • 以前 3.x 可以通过环境变量 RABBITMQ_VM_MEMORY_HIGH_WATERMARK 来配置;
  • 现在 4.x 提示:
    这个环境变量已经弃用,建议用配置文件方式
  • 你日志里这个错误不断刷,就是因为容器启动脚本看到这个 env,就一直报错。
相关推荐
todoitbo32 分钟前
openEuler 云原生实战:使用 Docker Compose 快速部署企业应用
docker·云原生·容器·openeuler
java_logo43 分钟前
Jenkins Docker 容器化部署指南
java·运维·servlet·docker·容器·jdk·jenkins
❀͜͡傀儡师3 小时前
docker部署mariadb 12.1.2版本,支持arm架构
运维·docker·容器·mariadb
回忆是昨天里的海12 小时前
docker存储-目录挂载
运维·docker·容器
用什么都重名13 小时前
Docker 镜像源配置指南
运维·docker·容器
忙里偷闲学python13 小时前
containerd_buildkitd构建镜像,告别docker构建
运维·docker·容器
哈哈哈笑什么15 小时前
分布式事务实战:订单服务 + 库存服务(基于本地消息表组件)
分布式·后端·rabbitmq
阿拉斯攀登15 小时前
Docker 全面解析:从核心概念到实践应用
docker·云原生·容器·架构
哈哈哈笑什么15 小时前
完整分布式事务解决方案(本地消息表 + RabbitMQ)
分布式·后端·rabbitmq