I've been doing a bit of reading up about setting up a dockerized RabbitMQ cluster and google turns up all sorts of results for doing so on the same machine.
I am trying to set up a RabbitMQ cluster across multiple machines.
I have three machines with the names dockerswarmmodemaster1
, dockerswarmmodemaster2
and dockerswarmmodemaster3
On the first machine (dockerswarmmodemaster1), I issue the following command:
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
Now this starts up a rabbitMQ just fine, and I can go to the admin page on 15672 and see that it is working as expected.
I then SSH to my second machine (dockerswarmmodemaster2) and this is the bit I am stuck on. I have been trying variations on the following command:
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
No matter what I try, the web page on both RabbitMQ machines says that there is no cluster under the 'cluster links' section. I haven't tried involving the third machine yet.
So - some more info:
1. The machine names are resolvable by DNS.
2. I have tried using the --net=host switch in the docuker run command on both machines; no change.
3. I am not using docker swarm or swarm mode.
4. I do not have docker compose installed. I'd prefer not to use it if possible.
Is there any way of doing this from the docker run command or will I have to download the rabbit admin cli and manually join to the cluster?
The official container seems to not support environment variables
CLUSTERED
andCLUSTER_WITH
. It supports only a list variables that are specified in RabbitMQ Configuration. According to official Clustering Guide, one of possible solutions is via configuration file. Thus, you can just provide your own configuration to the container. Modified default configuration in your case will look like:Save this snippet to, for example,
/home/user/rmq/rabbitmq.config
. Hint: If you want to see node in management console, you need to add another file/home/user/rmq/enabled_plugins
with only stringafter that, your command will look like
PS You may also need to consider setting environment variable RABBITMQ_USE_LONGNAME.
You can use this plugin https://github.com/aweber/rabbitmq-autocluster to create a RabbitMQ docker cluster.
The plugin uses
etcd2
orconsul
as service discovery, in this way you don't need to use therabbitmqctl
command line.I used it with docker swarm, but it is not necessary.
Here is the result
In order to create a cluster all rabbitmq nodes that are to form up a cluster must be accessible (each one by others) by node name (hostname). You need to specify a hostname for each docker container with
--hostname
option and to add /etc/host entries for all the other containers, this you can do with--add-host
option or by manually edditing /etc/hosts file. So, here is the example for a 3 rabbitmq nodes cluster with docker containers (rabbitmq:3-management image):First create a network so that you can assign IPs:
docker network create --subnet=172.18.0.0/16 mynet1
. We are going to have the following:Spin up the first one
second one
last one
Than in contaner rab2con do
and the same in rab3con and that's it.