Docker Desktop的RocketMQ的搭建和使用
RocketMQ是阿里巴巴开源的分布式消息中间件,在微服务架构中扮演着重要角色。本文将详细介绍如何在Windows系统中使用Docker来搭建和使用RocketMQ环境。
环境准备
Docker安装
访问Docker官网下载Docker Desktop for Windows
安装完成后,确保Docker服务正常运行
打开PowerShell,运行以下命令验证安装:
1
docker --version
RocketMQ部署
拉取镜像
1 | # 拉取nameserver镜像 |
第二个之前拉过了,步骤和上面一样的
报错
Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
翻译:错误响应来自守护程序:在等待连接时取消请求”https://registry-1.docker.io/v2/":net/http:在等待标头时超过客户端超时
更改源可以解决报错问题
站内参考 我的文章 Docker Desktop 配置国内镜像源教程
创建挂载目录
在本地创建以下目录用于数据持久化:
1 | mkdir rocketmq |
在d盘打开PowerShell
配置Broker
在conf目录下创建broker.conf文件,内容如下:
1 | brokerClusterName = DefaultCluster |
参数名称 | 参数值 | 含义 | 作用 | 备注 |
---|---|---|---|---|
brokerClusterName | DefaultCluster | 指定 Broker 所属的集群名称 | 在分布式消息系统中,通过集群名称区分不同的集群。 | 该 Broker 属于名为“DefaultCluster”的集群。 |
brokerName | broker-a | 指定 Broker 的名称 | 在集群中标识不同的 Broker 实例。 | 该 Broker 的名称为“broker-a”。 |
brokerId | 0 | 指定 Broker 的 ID | 在集群中区分不同的 Broker 实例。 | 主 Broker 的 ID 为 0,表示该 Broker 是主 Broker。 |
deleteWhen | 04 | 指定删除文件的时间 | 设置每天删除过期文件的时间点。 | 每天 4 点删除过期文件。 |
fileReservedTime | 48 | 指定文件保留的时间 | 设置文件在磁盘上保留的时长(单位:小时)。 | 文件在磁盘上保留 48 小时,超过该时间的文件将被删除。 |
brokerRole | ASYNC_MASTER | 指定 Broker 的角色 | 在主从复制模式下,定义 Broker 是主节点还是从节点。 | 表示该 Broker 是异步主节点,消息异步复制到从节点。 |
flushDiskType | ASYNC_FLUSH | 指定磁盘刷新类型 | 设置消息写入磁盘的方式。 | 采用异步刷新磁盘的方式,消息先写入内存,再异步刷新到磁盘,性能较高。 |
brokerIP1 | {your_host_ip} | 指定 Broker 的 IP 地址 | 设置 Broker 所在服务器的 IP 地址。 | 默认可能绑定到 127.0.0.1(仅限本机访问),需替换为实际服务器 IP 地址。 |
启动NameServer
1 | docker run -d --name rmqnamesrv \ |
在 Docker 命令中,{your_path}
是 你本地宿主机的自定义目录路径,用于将 RocketMQ 的日志和存储数据持久化到宿主机(而非容器内部)。你需要根据操作系统和实际需求替换成具体的路径。
windows 下
– 在 PowerShell 中并不是一个标准的参数前缀,因此解析器会将其误解为一元运算符。上面代码会报错
在rocketmq创建一个startNameServer.bat
1 | docker run -d --name rmqnamesrv -p 9876:9876 -v d:/rocketmq/data/namesrv/logs:/home/rocketmq/logs -v d:/rocketmq/data/namesrv/store:/home/rocketmq/store --memory "512m" apache/rocketmq:4.9.4 sh mqnamesrv |
保存通过PowerShell运行
1 | ./startNameServer |
参数说明
参数 | 含义 | 作用 |
---|---|---|
docker run |
运行容器 | 命令用于启动一个新的容器。 |
-d |
后台运行 | 表示容器在后台运行,不占用当前终端。 |
--name rmqnamesrv |
指定容器名称 | 将容器命名为“rmqnamesrv”,便于管理和识别。 |
-p 9876:9876 |
端口映射 | 将宿主机的 9876 端口映射到容器的 9876 端口,使外部可以通过该端口访问容器内的服务。 |
-v {your_path}/data/namesrv/logs:/home/rocketmq/logs |
挂载日志目录 | 将宿主机的指定路径挂载到容器内的 /home/rocketmq/logs 目录,用于存储日志文件。 |
-v {your_path}/data/namesrv/store:/home/rocketmq/store |
挂载存储目录 | 将宿主机的指定路径挂载到容器内的 /home/rocketmq/store 目录,用于存储相关数据。 |
--memory "512m" |
限制容器内存 | 设置容器可用内存为 512MB,防止容器占用过多内存资源。 |
apache/rocketmq:4.9.4 |
指定镜像及版本 | 使用 Apache RocketMQ 的 4.9.4 版本镜像来创建容器。 |
sh mqnamesrv |
启动命令 | 在容器启动后执行 sh mqnamesrv 命令,用于启动 RocketMQ 的 NameServer 服务。 |
作用说明
-v {your_path}/data/namesrv/logs:/home/rocketmq/logs
将容器内的日志目录/home/rocketmq/logs
挂载到宿主机的{your_path}/data/namesrv/logs
目录。-v {your_path}/data/namesrv/store:/home/rocketmq/store
将容器内的存储目录/home/rocketmq/store
挂载到宿主机的{your_path}/data/namesrv/store
目录。
参数 | 替换内容 | 示例路径(宿主机) |
---|---|---|
{your_path} |
你本地实际的根目录路径 | /home/user/rocketmq (Linux)C:\rocketmq (Windows) |
logs 和 store |
RocketMQ 的日志和持久化数据 | 自动关联到容器内对应目录 |
通过指定 {your_path}
,你可以确保 RocketMQ 的数据不会因容器删除而丢失。
启动Broker
1 | docker run -d --name rmqbroker \ |
同上
window下创建startBroker并运行
1 | docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 -v d:/rocketmq/data/broker/logs:/home/rocketmq/logs -v d:/rocketmq/data/broker/store:/home/rocketmq/store -v d:/rocketmq/conf/broker.conf:/home/rocketmq/broker.conf --memory 1g --link rmqnamesrv:namesrv apache/rocketmq:4.9.4 sh mqbroker -c /home/rocketmq/broker.conf |
注意:在Windows环境下,Docker挂载路径必须使用绝对路径,且使用正斜杠(/)而不是反斜杠()。请确保d:/rocketmq目录下已经创建了相应的文件夹结构。
参数说明
参数 | 含义 | 作用 |
---|---|---|
docker run |
运行容器 | 命令用于启动一个新的容器。 |
-d |
后台运行 | 表示容器在后台运行,不占用当前终端。 |
--name rmqbroker |
指定容器名称 | 将容器命名为“rmqbroker”,便于管理和识别。 |
-p 10911:10911 -p 10909:10909 |
端口映射 | 将宿主机的 10911 和 10909 端口分别映射到容器的对应端口,使外部可以通过这些端口访问容器内的服务。 |
-v {your_path}/data/broker/logs:/home/rocketmq/logs |
挂载日志目录 | 将宿主机的指定路径挂载到容器内的 /home/rocketmq/logs 目录,用于存储日志文件。 |
-v {your_path}/data/broker/store:/home/rocketmq/store |
挂载存储目录 | 将宿主机的指定路径挂载到容器内的 /home/rocketmq/store 目录,用于存储相关数据。 |
-v {your_path}/conf/broker.conf:/home/rocketmq/broker.conf |
挂载配置文件 | 将宿主机的指定配置文件挂载到容器内的 /home/rocketmq/broker.conf 路径,用于自定义 Broker 的配置。 |
--memory 1g |
限制容器内存 | 设置容器可用内存为 1GB,防止容器占用过多内存资源。 |
--link rmqnamesrv:namesrv |
容器间链接 | 将当前容器与名为“rmqnamesrv”的容器链接,并将“namesrv”作为别名解析到目标容器。 |
apache/rocketmq:4.9.4 |
指定镜像及版本 | 使用 Apache RocketMQ 的 4.9.4 版本镜像来创建容器。 |
sh mqbroker -c /conf/broker.conf |
启动命令 | 在容器启动后执行 sh mqbroker -c /conf/broker.conf 命令,用于启动 RocketMQ 的 Broker 服务,并指定配置文件路径。 |
启动管理控制台
1 | docker run -d --name rmqdashboard \ |
windows下创建 startrmqdashboard.bat
1 | docker run -d --name rmqdashboard -p 8080:8080 -e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876" --link rmqnamesrv:rmqnamesrv apacherocketmq/rocketmq-dashboard:latest |
参数说明
参数 | 含义 | 作用 |
---|---|---|
docker run |
运行容器 | 命令用于启动一个新的容器。 |
-d |
后台运行 | 表示容器在后台运行,不占用当前终端。 |
--name rmqdashboard |
指定容器名称 | 将容器命名为“rmqdashboard”,便于管理和识别。 |
-p 8080:8080 |
端口映射 | 将宿主机的 8080 端口映射到容器的 8080 端口,使外部可以通过该端口访问容器内的服务。 |
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876" |
设置环境变量 | 设置 Java 应用的环境变量,指定 RocketMQ NameServer 的地址为 rmqnamesrv:9876 。 |
--link rmqnamesrv:rmqnamesrv |
容器间链接 | 将当前容器与名为“rmqnamesrv”的容器链接,并将“rmqnamesrv”作为别名解析到目标容器。 |
apacherocketmq/rocketmq-dashboard:latest |
指定镜像及版本 | 使用 Apache RocketMQ Dashboard 的最新版本镜像来创建容器。 |
验证部署
访问控制台:http://localhost:8080
查看集群信息和broker状态
使用控制台发送测试消息
常见问题解决
问题 | 解决办法 |
---|---|
内存不足 | 适当调整容器内存限制,修改JVM参数 |
连接超时 | 检查端口映射,确认防火墙设置,验证broker.conf中的IP配置 |
数据持久化 | 确保挂载目录权限正确,定期清理日志文件 |
性能优化建议 | 合理配置系统参数:调整commitLog大小,优化刷盘策略;监控指标:消息堆积、磁盘使用率、TPS/延迟 |