我如何设置一个简单的dockerized RabbitMQ集群?

我一直在做一些关于设置一个dockerized RabbitMQ集群的书籍,谷歌在同一台机器上发布了各种各样的结果。

我试图在多台机器上设置一个RabbitMQ集群。

我有三台名为dockerswarmmodemaster1dockerswarmmodemaster2dockerswarmmodemaster3

在第一台机器上(dockerswarmmodemaster1),我发出以下命令:

 docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 \ -p 25672:25672 --hostname dockerswarmmodemaster1 --name roger_rabbit \ -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management 

现在这个启动一个rabbitMQ就好了,我可以去15672的pipe理页面看看它是否按预期工作。

然后,我SSH到我的第二台机器(dockerswarmmodemaster2),这是我坚持的一点。 我一直在尝试以下命令的变体:

 docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 \ -p 15672:15672 -p 25672:25672 --name jessica_rabbit -e CLUSTERED=true \ -e CLUSTER_WITH=rabbit@dockerswarmmodemaster1 \ -e RABBITMQ_ERLANG_COOKIE='secret cookie here' \ rabbitmq:3-management 

无论我尝试什么,RabbitMQ机器上的网页都说“集群链接”部分没有集群。 我还没有尝试涉及第三台机器。

所以 – 一些更多的信息:
1.机器名称可以通过DNSparsing。
2.我试过在两台机器的docuker run命令中使用–net = host开关; 不用找了。
3.我没有使用docker群或群模式。
4.我没有docker安装。 如果可能,我宁愿不要使用它。

有没有办法从docker运行命令做到这一点,或者我将不得不下载兔子pipe理cli和手动join群集?

你可以使用这个插件https://github.com/aweber/rabbitmq-autocluster创build一个RabbitMQ docker集群。

该插件使用etcd2consul作为服务发现,这样就不需要使用rabbitmqctl命令行。

我用docker swarm,但没有必要。

结果如下

官方的容器似乎不支持环境variablesCLUSTEREDCLUSTER_WITH 。 它仅支持在RabbitMQconfiguration中指定的列表variables。 根据官方的Clustering Guide ,可能的解决scheme之一是通过configuration文件。 因此,您可以将自己的configuration提供给容器。 您的情况下修改后的默认configuration将如下所示:

 [ { rabbit, [ { loopback_users, [ ] }, { cluster_nodes, {['rabbit@dockerswarmmodemaster1'], disc }} ]} ]. 

将此片段保存到/home/user/rmq/rabbitmq.config 。 提示:如果要在pipe理控制台中查看节点,则需要添加另一个文件/home/user/rmq/enabled_plugins ,仅包含string

 [rabbitmq_management]. 

之后,你的命令将如下所示

 docker run -d -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 \ -p 15672:15672 -p 25672:25672 --name jessica_rabbit \ -v /home/user/rmq:/etc/rabbmitmq \ -e RABBITMQ_ERLANG_COOKIE='secret cookie here' \ rabbitmq:3-management 

PS您可能还需要考虑设置环境variablesRABBITMQ_USE_LONGNAME。

为了创build一个集群,所有要组成集群的rabbitmq节点必须可以通过节点名(主机名)访问(每个节点)。 您需要使用--hostname选项指定每个--hostname容器的主机名,并为所有其他容器添加/ etc / host条目,您可以使用--add-host选项或通过手动编辑/ etc / hosts文件来执行此操作。 所以,下面是一个带有docker容器的3个rabbitmq节点集群的示例(rabbitmq:3-management image):

首先创build一个networking,以便您可以分配IP: docker network create --subnet=172.18.0.0/16 mynet1 。 我们将会有以下几点:

  • 3个docker集装箱名为rab1con,rab2con和rab3con
  • IP分别为172.18.0.11,-12和-13
  • 他们每个将分别有主机名rab1,rab2和rab3
  • 所有的必须共享相同的erlang cookie

旋转第一个

 docker run -d --net mynet1 --ip 172.18.0.11 --hostname rab1 --add-host rab2:172.18.0.12 --add-host rab3:172.18.0.13 --name rab1con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management 

第二个

 docker run -d --net mynet1 --ip 172.18.0.12 --hostname rab2 --add-host rab1:172.18.0.11 --add-host rab3:172.18.0.13 --name rab2con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management 

最后一个

 docker run -d --net mynet1 --ip 172.18.0.13 --hostname rab3 --add-host rab2:172.18.0.12 --add-host rab1:172.18.0.11 --name rab3con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management 

比在conta2 rab2con做

 rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@rab1 rabbitmqctl start_app 

和rab3con一样,就是这样。