Windows10 使用docker部署RocketMQ,以及内存问题

  1. 创建一个新的网络连接

    docker network create rocketmq-net
    
  2. 拉取镜像

    docker pull apache/rocketmq:5.1.4
    
  3. 创建rocketmq-namesrv容器

    docker run -d --name rocketmq-namesrv --network rocketmq-net -e "JAVA_OPTS=-Drocketmq.namesrv.bindIP=0.0.0.0" -p 9876:9876 apache/rocketmq:5.1.4 sh mqnamesrv
    
  4. 启动状态:docker logs -f rocketmq-namesrv,出现以下就是成功的
    . 在这里插入图片描述

  5. 添加需要映射的文件broker.conf,修改brokerIP1为你电脑IP

    # 所属集群名字
    brokerClusterName=DefaultCluster
    
    # broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
    # 在 broker-b.properties 使用: broker-b
    brokerName=broker-a
    
    # 0 表示 Master,> 0 表示 Slave
    brokerId=0
    
    # nameServer地址,分号分割
    # namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
    
    # 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
    # 解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP
    brokerIP1=192.168.100.105
    
    # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
    defaultTopicQueueNums=4
    
    # 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
    autoCreateTopicEnable=true
    
    # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
    autoCreateSubscriptionGroup=true
    
    # Broker 对外服务的监听端口
    listenPort=10911
    
    # 删除文件时间点,默认凌晨4点
    deleteWhen=04
    
    # 文件保留时间,默认48小时
    fileReservedTime=120
    
    # commitLog 每个文件的大小默认1G
    mapedFileSizeCommitLog=1073741824
    
    # ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
    mapedFileSizeConsumeQueue=300000
    
    # destroyMapedFileIntervalForcibly=120000
    # redeleteHangedFileInterval=120000
    # 检测物理文件磁盘空间
    diskMaxUsedSpaceRatio=88
    # 存储路径
    # storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
    # commitLog 存储路径
    # storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
    # 消费队列存储
    # storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
    # 消息索引存储路径
    # storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
    # checkpoint 文件存储路径
    # storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
    # abort 文件存储路径
    # abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
    # 限制的消息大小
    maxMessageSize=65536
    
    # flushCommitLogLeastPages=4
    # flushConsumeQueueLeastPages=2
    # flushCommitLogThoroughInterval=10000
    # flushConsumeQueueThoroughInterval=60000
    
    # Broker 的角色
    # - ASYNC_MASTER 异步复制Master
    # - SYNC_MASTER 同步双写Master
    # - SLAVE
    brokerRole=ASYNC_MASTER
    
    # 刷盘方式
    # - ASYNC_FLUSH 异步刷盘
    # - SYNC_FLUSH 同步刷盘
    flushDiskType=ASYNC_FLUSH
    
    # 发消息线程池数量
    # sendMessageThreadPoolNums=128
    # 拉消息线程池数量
    # pullMessageThreadPoolNums=128
    
    
  6. 启动broker
    正常启动:

    docker run -d --name rocketmq-broker --network rocketmq-net -p 10911:10911 -p 10909:10909  -e "NAMESRV_ADDR=rmqnamesrv:9876" -v D:\\environment\docker\rocketMQ\broker.conf:/home/rocketmq/rocketmq-5.1.4/conf/broker.conf apache/rocketmq:5.1.4 sh mqbroker
    

    D:\\environment\docker\rocketMQ\broker.conf 是宿主机的路径,即Windows电脑里的路径
    /home/rocketmq/rocketmq-5.1.4/conf/broker.conf 这是docker里的路径

    • 若出现/bin/runbroker.sh: line 90: 25991 Killed $JAVA ${JAVA_OPT} $@,则是内存问题,需要修改内存
    docker run -d --name rocketmq-broker --network rocketmq-net -p 10911:10911 -p 10909:10909  -e "NAMESRV_ADDR=rmqnamesrv:9876" -e "JAVA_OPT_EXT=-Xms128m -Xmx128m -Xmn128m" -e "MAX_POSSIBLE_HEAP=200000000" -v D:\\environment\docker\rocketMQ\broker.conf:/home/rocketmq/rocketmq-5.1.4/conf/broker.conf apache/rocketmq:5.1.4 sh mqbroker
    
    • 修改后,如果发现docker使用出现500的问题,大概率是docker内存溢出
    1. 查看Windows查看docker信息,docker info,我这个已经是8G的,之前是2G,看自己电脑内存改。
      在这里插入图片描述

    2. 修改方式:windows路径栏输入:%UserProfile%,找到.wslconfig文件,没有的话自己加一下,修改内存大小
      在这里插入图片描述

      # 设置在wsl2上运行
      [wsl2]
      # 设置分配给WSL VM 的内存大小(默认是1/2的电脑内存)
      memory=8GB
      # 设置要分配给 WSL 2 VM 的逻辑处理器数(默认和Windows 上相同数量的逻辑处理器)
      processors=10 
      ```
      
      
      
      
      
<think>我们正在使用Docker部署RocketMQ5.0,并需要配置外网访问、磁盘空间限制和内存限制。以下是步骤:1.**拉取RocketMQ5.0镜像**:从DockerHub获取RocketMQ5.0的官方镜像。2.**创建网络**:为了方便容器间通信,创建一个Docker网络。 3. **准备配置文件**:创建broker配置文件,并设置外网访问相关的参数,特别是`brokerIP1`设置为宿主机的公网IP或域名。4.**运行NameServer容器**:启动NameServer,并设置内存限制。5.**运行Broker容器**:启动Broker容器,挂载数据卷以持久化数据,并设置磁盘空间限制(通过挂载卷的大小控制)和内存限制。同时,将配置文件挂载到容器内。 6. **运行Dashboard容器(可选)**:用于监控RocketMQ集群。注意:磁盘空间限制在Docker中通常通过挂载的卷所在分区的空间或使用存储驱动限制,但Docker本身不直接提供挂载卷的大小限制(除非使用特定存储驱动或文件系统配额)。因此,我们通常通过控制宿主机上挂载目录的磁盘空间来间接限制。内存限制则可以通过`-m`参数设置。 ###详细步骤####1.拉取镜像```bashdocker pullapache/rocketmq:5.0.0``` ####2.创建Docker网络```bashdocker networkcreate rocketmq-net```####3.准备Broker配置文件创建一个配置文件`broker.conf`,内容如下:```ini#集群名称brokerClusterName= DefaultCluster# broker名称brokerName =broker-a#broker id,0表示master,非0表示slavebrokerId =0#删除文件时间点,默认凌晨4点deleteWhen =04#文件保留时间,默认48小时fileReservedTime =48#broker角色brokerRole= ASYNC_MASTER#刷盘方式flushDiskType =ASYNC_FLUSH# NameServer地址namesrvAddr= namesrv:9876#设置brokerIP1为宿主机的公网IP(外网访问的IP) brokerIP1 =your_public_ip#自动创建topicautoCreateTopicEnable=true```注意:将`your_public_ip`替换为宿主机的公网IP地址。####4.启动NameServer容器```bashdocker run-d--namermqnamesrv--networkrocketmq-net -p9876:9876 -e "JAVA_OPT_EXT=-Xms512m-Xmx512m"apache/rocketmq:5.0.0 shmqnamesrv```这里通过`-e "JAVA_OPT_EXT=-Xms512m-Xmx512m"`设置了NameServer的内存限制为512MB。####5.启动Broker容器首先,创建数据存储目录(用于挂载): ```bashmkdir -p /home/rocketmq/data/broker/logs /home/rocketmq/data/broker/store/home/rocketmq/conf``` 将前面创建的`broker.conf`放到`/home/rocketmq/conf`目录下。 然后启动Broker容器: ```bashdocker run-d--namermqbroker--networkrocketmq-net --link rmqnamesrv:namesrv-p10911:10911-p10909:10909\ -v/home/rocketmq/data/broker/logs:/home/rocketmq/logs\ -v/home/rocketmq/data/broker/store:/home/rocketmq/store\ -v/home/rocketmq/conf/broker.conf:/home/rocketmq/rocketmq-5.0.0/conf/broker.conf\ -e"JAVA_OPT_EXT=-Xms1g -Xmx1g" \apache/rocketmq:5.0.0sh mqbroker -c /home/rocketmq/rocketmq-5.0.0/conf/broker.conf``` 解释: -`-v`挂载了日志和数据目录,以及配置文件。 -`-e "JAVA_OPT_EXT=-Xms1g -Xmx1g"`设置了Broker的内存限制为1GB。 -磁盘空间限制:由于Docker容器本身不直接限制挂载卷的大小,因此需要确保挂载的宿主机目录(即`/home/rocketmq/data/broker`)所在的分区有足够的空间,或者通过文件系统配额来限制。如果需要限制磁盘使用,可以考虑使用`--storage-opt`参数(需要Docker支持且文件系统支持),但通常在生产环境中,我们通过监控和运维手段来确保磁盘空间。 ####6. (可选)启动Dashboard```bashdocker run-d--namermq-dashboard-p8080:8080 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=your_public_ip:9876"apacherocketmq/rocketmq-dashboard:latest``` 将`your_public_ip`替换为宿主机的公网IP,这样Dashboard才能通过外网访问。 ###验证-通过外网IP和端口访问NameServer(9876)和Broker(10911)进行生产消费测试。-访问Dashboard(8080端口)查看集群状态。 ###注意事项1.外网访问安全:暴露到外网需要设置防火墙规则,只允许可信IP访问端口(9876,10911,10909,8080)。2.磁盘空间监控:需要监控宿主机挂载目录的磁盘使用情况,避免写满。3.内存限制:通过`JAVA_OPT_EXT`设置JVM内存,但注意容器本身的内存限制(使用`-m`参数)也是必要的。例如,可以添加`-m2g`来限制容器内存为2GB(包括JVM和非堆内存)。但上述命令中我们只设置了JVM堆内存容器内存没有设置,建议加上:```bash#对于Broker,设置容器内存限制为2GB,JVM堆内存为1GBdocker run... -m2g-e "JAVA_OPT_EXT=-Xms1g -Xmx1g" ...```###完整Broker启动命令(包含容器内存限制) ```bashdocker run-d--namermqbroker--networkrocketmq-net --link rmqnamesrv:namesrv-p10911:10911-p10909:10909\ -v/home/rocketmq/data/broker/logs:/home/rocketmq/logs\ -v/home/rocketmq/data/broker/store:/home/rocketmq/store\ -v/home/rocketmq/conf/broker.conf:/home/rocketmq/rocketmq-5.0.0/conf/broker.conf \-m2g--memory-swap=2g -e "JAVA_OPT_EXT=-Xms1g -Xmx1g" \apache/rocketmq:5.0.0sh mqbroker -c /home/rocketmq/rocketmq-5.0.0/conf/broker.conf``` 这里`-m2g`设置容器可用内存为2GB,`--memory-swap=2g`表示交换分区也为2GB(即禁用交换分区,因为交换分区会影响Java应用性能)。###总结通过以上步骤,我们使用Docker部署RocketMQ5.0,配置了外网访问(通过设置brokerIP1和暴露端口),并通过挂载目录控制数据存储位置(间接控制磁盘空间),同时设置了内存限制(容器内存和JVM堆内存)。 §§相关问题§§1. RocketMQ的NameServer和Broker分别有什么作用?2.如何配置RocketMQ的持久化策略? 3. RocketMQ集群部署的最佳实践有哪些? 4.如何监控RocketMQ的运行状态?</think>### Docker 部署 RocketMQ 5.0 配置指南 以下是配置 RocketMQ 5.0 支持外网访问、磁盘空间限制和内存限制的完整方案: #### 1. **创建自定义网络** ```bash docker network create rocketmq-net ``` #### 2. **启动 NameServer 容器(带内存限制)** ```bash docker run -d \ --name rmqnamesrv \ --network rocketmq-net \ -p 9876:9876 \ -e "JAVA_OPT_EXT=-Xms512m -Xmx512m" \ # 限制内存为512MB apache/rocketmq:5.0.0 \ sh mqnamesrv ``` #### 3. **准备 Broker 配置文件 (`broker.conf`)** ```ini # 基础配置 brokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH namesrvAddr = rmqnamesrv:9876 # 外网访问关键配置 brokerIP1 = 你的公网IP # 替换为服务器公网IP listenPort = 10911 ``` #### 4. **启动 Broker 容器(带磁盘+内存限制)** ```bash docker run -d \ --name rmqbroker \ --network rocketmq-net \ --link rmqnamesrv \ -p 10911:10911 \ -p 10909:10909 \ -v /自定义路径/conf/broker.conf:/home/rocketmq/rocketmq-5.0.0/conf/broker.conf \ -v /自定义路径/store:/home/rocketmq/store \ -v /自定义路径/logs:/home/rocketmq/logs \ -e "JAVA_OPT_EXT=-Xms2g -Xmx2g" \ # 限制JVM内存为2GB --memory="3g" \ # 容器内存限制 --storage-opt size=50GB \ # 磁盘空间限制(需文件系统支持) apache/rocketmq:5.0.0 \ sh mqbroker -c /home/rocketmq/rocketmq-5.0.0/conf/broker.conf ``` #### 5. **启动控制台(可选)** ```bash docker run -d \ --name rocketmq-dashboard \ -p 8080:8080 \ -e "JAVA_OPTS=-Drocketmq.namesrv.addr=你的公网IP:9876" \ apacherocketmq/rocketmq-dashboard:latest ``` #### 🔧 关键配置说明 1. **外网访问**: - `brokerIP1` 必须设置为服务器公网 IP - 安全组需开放端口:9876(NameServer), 10911(Broker), 8080(控制台) 2. **磁盘限制**: - 通过 `--storage-opt size=50GB` 限制容器磁盘空间 - 通过挂载卷 `-v` 指定数据存储路径 3. **内存限制**: - `JAVA_OPT_EXT` 控制 JVM 堆内存 - `--memory` 限制容器内存 - 建议比例:JVM 堆内存容器内存的 70% #### ✅ 验证部署 ```bash # 查看容器状态 docker ps -a --filter "name=rmq" # 测试消息发送(在容器内执行) docker exec -it rmqbroker sh tools.sh org.apache.rocketmq.example.quickstart.Producer ``` #### ⚠️ 注意事项 1. 生产环境建议启用 TLS 加密通信 2. 磁盘限制需要 Docker 存储驱动支持(如 overlay2) 3. Windows 环境需替换路径分隔符为 `C:\path\to\config` 4. 高可用部署需配置多节点集群[^1][^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值