docker部署RabbitMQ集群

拉取镜像

[root@localhost ~]# docker pull rabbitmq:3.6.15-management
3.6.15-management: Pulling from library/rabbitmq
f2aa67a397c4: Pull complete
f062288ad968: Pull complete
8b9469379b84: Pull complete
5b66af38c756: Pull complete
2349eb3352c4: Pull complete
d7fb0dd6e32f: Pull complete
869ba3a0a942: Pull complete
b7ac6c7140d2: Pull complete
dc5d9eda274c: Pull complete
4b48a2eebbeb: Pull complete
8a009b580bbb: Pull complete
f3a07993c96e: Pull complete
86345f9dc620: Pull complete
Digest: sha256:f367442fb88ff82ca5b102ccbf8bb5eafe7bb14c31abf57b0cee1576dca8d75c
Status: Downloaded newer image for rabbitmq:3.6.15-management
docker.io/library/rabbitmq:3.6.15-management

启动三个容器

[root@localhost ~]# docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
47611d79ad0e9277f1e0a7097ec3ef8949ad5bbea4dfbd47ca4bcc7da8918d9d
[root@localhost ~]# docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
5b823c0c7e9985d8890c5072126a13e111fc16e7cd8138698ef77d640dabcbae
[root@localhost ~]# docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
891236c2c42efa4b3a1c652afbe1878c870f70679ddb826a9b7fd7c25e444c42

查看容器

[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
891236c2c42e rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp myrabbit3
5b823c0c7e99 rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp myrabbit2
47611d79ad0e rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp myrabbit1

主要参数:
-p 15672:15672 management 界面管理访问端口
-p 5672:5672 amqp 访问端口
--link 容器之间连接
Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。

3、加入节点到集群

[root@localhost ~]# docker exec -it myrabbit1 bash
root@rabbit1:/# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit1
root@rabbit1:/# rabbitmqctl reset
Resetting node rabbit@rabbit1
root@rabbit1:/# rabbitmqctl start_app
Starting node rabbit@rabbit1
root@rabbit1:/# exit
exit
[root@localhost ~]# docker exec -it myrabbit2 bash
root@rabbit2:/# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit2
root@rabbit2:/# rabbitmqctl reset
Resetting node rabbit@rabbit2
root@rabbit2:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
Clustering node rabbit@rabbit2 with rabbit@rabbit1
root@rabbit2:/# rabbitmqctl start_app
Starting node rabbit@rabbit2
root@rabbit2:/# exit
exit
[root@localhost ~]# docker exec -it myrabbit3 bash
root@rabbit3:/# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rabbit3
root@rabbit3:/# rabbitmqctl reset
Resetting node rabbit@rabbit3
root@rabbit3:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
Clustering node rabbit@rabbit3 with rabbit@rabbit1
root@rabbit3:/# rabbitmqctl start_app
Starting node rabbit@rabbit3
eroot@rabbit3:/# exit
exit

设置好之后,使用http://物理机ip:15672 进行访问了,默认账号密码是guest/guest,效果如下图:

 docker部署RabbitMQ集群

 

 启动了3个节点,1个磁盘节点和2个内存节点。

有些特殊的情况,比如已经运行了一段时间的几个单个物理机,我们在之前没有设置过相同的Erlang Cookie值,现在我们要把单个的物理机部署成集群,实现我们需要同步Erlang的Cookie值。

1.为什么要配置相同的erlang cookie?

因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。

2.Erlang Cookie的位置

要想知道Erlang Cookie位置,首先要取得RabbitMQ启动日志里面的home dir路径,作为根路径。使用:“docker logs 容器名称”查看,如下图

docker部署RabbitMQ集群

 

 

所以Erlang Cookie的全部路径就是“/var/lib/rabbitmq/.erlang.cookie”。

注意:每个人的erlang cookie位置可能不同,一定要查看自己的home dir路径。

3.复制Erlang Cookie到其他RabbitMQ节点

获取到第一个RabbitMQ的Erlang Cookie之后,只需要把这个文件复制到其他RabbitMQ节点即可。

物理机和容器之间复制命令如下:

  • 容器复制文件到物理机:docker cp 容器名称:容器目录 物理机目录
  • 物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录

设置Erlang Cookie文件权限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。

参考资料

https://blog.csdn.net/xiaoping0915/article/details/75094857

https://blog.csdn.net/luosai19910103/article/details/78604692

https://blog.csdn.net/bolg_hero/article/details/50267103

http://ivivisoft.com/2017/03/06/rabbitmq-cluster/

上一篇:RabbitMQ管理


下一篇:【RabbitMQ】存储&告警&流控&镜像队列