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,效果如下图:

 

 

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

配置相同Erlang Cookie

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

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

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

2.Erlang Cookie的位置

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

 

 

所以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/

posted @   星火撩原  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-12-16 搭建LAMP环境示例
2019-12-16 httpd网页身份认证
2019-12-16 apache httpd反向代理的用法
2019-12-16 httpd路径映射和重定向
2019-12-16 httpd htpasswd命令
2019-12-16 httpd添加新模块
2019-12-16 编译httpd细节
点击右上角即可分享
微信分享提示

目录导航