安装rocketmq

你可以通过Docker启动RocketMQ,以下是详细步骤:

1. 获取RocketMQ Docker镜像

首先,从Docker Hub获取官方的RocketMQ镜像:

docker pull apache/rocketmq:4.9.3

你可以根据需要选择不同版本的RocketMQ镜像。

2. 启动NameServer容器

RocketMQ的NameServer负责注册服务,首先启动它:

docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.3 sh mqnamesrv
  • --name rmqnamesrv:为容器命名
  • -p 9876:9876:映射NameServer的端口,外部通过9876访问
  • apache/rocketmq:4.9.3:使用RocketMQ镜像
  • sh mqnamesrv 指定运行的命令。当容器启动时,它会在容器内执行sh mqnamesrv命令,这个命令会启动RocketMQ的NameServer服务。mqnamesrv是RocketMQ NameServer的启动脚本。

3. 启动Broker容器

然后,启动Broker(消息中间件的核心):

docker run -d --name rmqbroker \
  --link rmqnamesrv:namesrv \
  -p 10911:10911 -p 10909:10909 -p 10912:10912 \
  -e "NAMESRV_ADDR=namesrv:9876" \
  -e "JAVA_OPT_EXT=-server -Xms512M -Xmx512M -Xmn256m" \
  apache/rocketmq:4.9.3 sh mqbroker
  • --link rmqnamesrv:namesrv:将NameServer容器连接到Broker容器
  • -p 10911:10911:用于客户端/服务器传输的端口
  • -p 10909:10909:用于外部服务的端口
  • -e "NAMESRV_ADDR=namesrv:9876":指定NameServer的地址
  • -e "JAVA_OPT_EXT=-server -Xms512M -Xmx512M -Xmn256m":设置Java虚拟机参数

4. 验证RocketMQ运行状态

通过以下命令检查容器是否正常运行:

docker ps

5. 访问RocketMQ

如果需要访问RocketMQ的控制台,可以使用一个RocketMQ控制台的Docker镜像:

docker run -d -p 8080:8080 --name rmqconsole \
  --link rmqnamesrv:namesrv \
  -e "NAMESRV_ADDR=namesrv:9876" \
  styletang/rocketmq-console-ng
  • --link rmqnamesrv:namesrv

将当前容器与另一个名为rmqnamesrv的容器进行连接,并且在当前容器内部为这个连接的NameServer容器起一个别名namesrv
这样,在rmqconsole容器内可以通过namesrv来访问NameServer的服务。

  • -e "NAMESRV_ADDR=namesrv:9876"

使用环境变量NAMESRV_ADDR指定NameServer的地址。在当前容器中,namesrv指代的是通过--link链接的NameServer容器,而NameServer的端口是9876。因此,控制台需要通过namesrv:9876与NameServer进行通信。

  • styletang/rocketmq-console-ng

使用styletang/rocketmq-console-ng这个镜像,该镜像是RocketMQ的管理控制台,用于通过Web界面监控、管理RocketMQ的消息队列。

这会启动控制台,可以通过浏览器访问http://<your-server-ip>:8080

这样你就可以通过Docker在Linux上启动并运行RocketMQ了。

我这样安装了之后,rocketmq.access-key和rocketmq.secret-key是什么

我想启动ACL列表,我是按你上面给的docker命令来的,我现在应该怎么补充

如果你是按我之前提供的Docker命令来启动RocketMQ,并且现在想启用access-keysecret-key进行身份验证,步骤如下:

在RocketMQ中,access-keysecret-key 是用于身份验证和授权的访问凭证。这些凭证用于确保客户端在与RocketMQ服务交互时具备适当的权限。这种机制主要在开启了**ACL(访问控制列表)**功能时使用。

默认情况下,RocketMQ不会启用ACL,也就是不需要access-keysecret-key。但如果你希望加强安全性,尤其是在生产环境中,可以通过启用ACL来限制哪些用户可以发布或消费消息。

1. 创建ACL配置文件

由于你是通过Docker启动的RocketMQ,需要在Broker容器中配置ACL。首先,你需要为Broker配置plain_acl.yml文件。

可以按照以下步骤操作:

方法 1: 修改本地文件并挂载到Docker容器中

你可以在宿主机(虚拟机)的某个目录下创建plain_acl.yml文件,并通过Docker挂载这个文件到容器中。

文件内容:

在宿主机上,创建一个目录(例如/path/to/rocketmq/conf),然后在该目录下创建plain_acl.yml文件:

accounts:
  - accessKey: myAccessKey
    secretKey: mySecretKey
    whiteRemoteAddress: "192.168.*.*"
    admin: false
    defaultTopicPerm: DENY
    defaultGroupPerm: DENY
    topicPerms:
      - topicA=PUB|SUB
    groupPerms:
      - groupA=PUB|SUB
  • accessKey:用户的访问凭证,类似于用户名。
  • secretKey:用户的安全密钥,类似于密码。
  • whiteRemoteAddress:允许的IP地址范围。
  • topicPerms:指定该用户对哪些Topic有发布(PUB)或订阅(SUB)的权限。
  • groupPerms:指定该用户对哪些消费组(Group)有权限。
修改Docker命令挂载配置文件:

在启动RocketMQ Broker时,增加挂载本地ACL配置文件的参数。

你可以重新启动RocketMQ Broker容器并挂载配置文件:

docker run -d --name rmqbroker \
  --link rmqnamesrv:namesrv \
  -p 10911:10911 -p 10909:10909 -p 10912:10912 \
  -e "NAMESRV_ADDR=namesrv:9876" \
  -e "JAVA_OPT_EXT=-server -Xms512M -Xmx512M -Xmn256m" \
  -v /path/to/rocketmq/conf/plain_acl.yml:/opt/rocketmq-4.9.3/conf/plain_acl.yml \
  apache/rocketmq:4.9.3 sh mqbroker

在这条命令中:

  • -v /path/to/rocketmq/conf/plain_acl.yml:/opt/rocketmq-4.9.3/conf/plain_acl.yml:将宿主机上的plain_acl.yml文件挂载到Docker容器中。
方法 2: 进入容器内修改配置文件

你也可以进入Docker容器内,直接修改RocketMQ的plain_acl.yml文件。

进入Broker容器:
docker exec -it rmqbroker /bin/bash
创建并编辑plain_acl.yml文件:

在容器内,创建或修改配置文件(通常位于/opt/rocketmq-4.9.3/conf/plain_acl.yml):

cd /opt/rocketmq-4.9.3/conf
vi plain_acl.yml

按照上面提供的格式进行编辑保存。

2. 修改控制台配置

你需要让RocketMQ的控制台也使用access-keysecret-key来进行访问。

重新启动RocketMQ控制台容器时,设置环境变量来指定身份验证信息:

docker run -d -p 8080:8080 --name rmqconsole \
  --link rmqnamesrv:namesrv \
  -e "NAMESRV_ADDR=namesrv:9876" \
  -e "rocketmq.config.accessKey=myAccessKey" \
  -e "rocketmq.config.secretKey=mySecretKey" \
  styletang/rocketmq-console-ng

3. 客户端配置

你的客户端(生产者或消费者)在连接RocketMQ时需要指定access-keysecret-key。例如,在Java代码中使用:

DefaultMQProducer producer = new DefaultMQProducer("producerGroup");
producer.setNamesrvAddr("localhost:9876");
producer.setAccessKey("myAccessKey");
producer.setSecretKey("mySecretKey");
producer.start();

4. 验证ACL

确保你已经正确启用了ACL功能,客户端提供正确的access-keysecret-key后,才能发布和消费消息。

这样你就可以在Docker环境下启用RocketMQ的access-keysecret-key进行身份验证了。

  • 如果你没有特别配置ACL,那么RocketMQ不会强制要求access-keysecret-key
  • 如果你开启了ACL,access-keysecret-key需要手动在ACL配置文件中定义。

如果你刚安装了RocketMQ,且没有显式启用ACL,那么你不需要关心access-keysecret-key

linux关机后再开机,需要重新启动

当你已经创建并运行了容器之后,如果只是停止了这些容器(例如关闭虚拟机),你不需要再次使用docker run来启动它们。因为docker run的作用是创建并启动新的容器,而你已经有了这些容器。

要再次启动已经创建的容器,应该使用docker start命令。

启动已经存在的容器

使用 docker start 启动已存在的容器(包括你之前创建的NameServer、Broker和Console容器):

启动NameServer容器
docker start rmqnamesrv
启动Broker容器
docker start rmqbroker
启动Console容器
docker start rmqconsole

检查容器状态

你可以使用以下命令查看Docker中所有容器的状态,包括正在运行的和已停止的:

docker ps -a
  • 如果容器处于Exited状态,说明它已经停止,可以使用docker start来重新启动。
  • 如果容器处于Up状态,说明它已经在运行。

docker run vs docker start

  • docker run:用于创建并启动一个新的容器。当你使用docker run时,它会创建一个全新的容器实例,甚至如果容器名重复,会报错说该名字已存在。
  • docker start:用于启动已经创建的容器,这个容器可能是因为虚拟机关闭、手动停止等原因退出的。

因此,如果你已经创建了RocketMQ的容器,那么下次你只需要使用docker start <容器名>来重新启动,而不必重新使用docker run来创建新容器。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐