大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
docker 单容器部署
创建桥接网络,用于容器间通信
$ docker network create mq-network
首先启动 3个 rabbitmq 容器
$ docker run --name rabbit01 \
-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-setcookie COUBJLKLQCIAPKIQZGGJ" \
--hostname rabbit01 --network mq-network \
-p 5672:5672 -p 15672:15672 \
-d rabbitmq:3.9-management
# -e ... 通过环境变量指定 cookie,其格式为:"-setcookie <value>"
$ docker run --hostname rabbit02 --name rabbit02 \
-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-setcookie COUBJLKLQCIAPKIQZGGJ" \
--network mq-network \
-p 5673:5672 -p 15673:15672 \
-d rabbitmq:3.9-management
$ docker run --hostname rabbit03 --name rabbit03 \
-e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-setcookie COUBJLKLQCIAPKIQZGGJ" \
--network mq-network \
-p 5674:5672 -p 15674:15672 \
-d rabbitmq:3.9-management
然后需要复制一份 .erlang.cookie
文件至容器中
# 假设当前目录中已经有.erlang.cookie 文件,内容为:COUBJLKLQCIAPKIQZGGJ
$ docker cp .erlang.cookie rabbit01:/var/lib/rabbitmq/
$ docker cp .erlang.cookie rabbit02:/var/lib/rabbitmq/
$ docker cp .erlang.cookie rabbit03:/var/lib/rabbitmq/
❗️ 注意:环境变量 RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS
和 .erlang.cookie
文件两处都需要修改,否则会使 rabbitmqctl 工具不可用,无法创建集群。
使用 rabbitmqctl 手动创建集群
# 进入容器终端
$ docker exec -it rabbit02 bash
# 简化写法
$ rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@rabbit01 && rabbitmqctl start_app
# rabbit03 同理
Docker Swarm 部署
初始化 docker swarm
docker swarm init
创建 rabbitmq 集群容器间访问的网络
docker network create \
--driver overlay \
rabbitmq_network
使用 docker secrets,创建指定的 erlang cookie
# .eralng.cookie 文件自己创建,或者复制一个 rabbitmq 容器内的
$ cat .erlang.cookie | docker secret create my-erlang-cookie -
使用 docker service
$ docker service create --container-label rabbit --replicas 3 \
--name rabbitmq-cluster \
-p 5672:5672 -p 15672:15672 \
--network rabbitmq-network \
# --hostname="rabbit-{
{.Task.ID}}" \
--secret source=my-erlang-cookie,target=/var/lib/rabbitmq/.erlang.cookie,uid=999,gid=999,mode=0600 \
rabbitmq:3.9-management
# --hostname 指定 hostname,可以通过占位符指定,否则就是随机字符串
# --network 指定网络
# 指定 uid,gid,mode 是为了让rabbitmq 可以正确的读取 .eralng.cookie 文件
# uid,gid 分别是rabbitmq 用户id和用户组id,根据mode指定访问文件权限
通过 rabbitmqctl 手动创建集群
# 显示服务名为 rabbitmq-cluster 的 service 中所有容器
docker service ps rabbitmq-cluster
# 进入容器终端,rabbit1
docker exec -it rabbitmq-cluster.1.rzxlu3oksqchjthknse7mk3b2 bash
# 说明:7bdb16ce5c21 是 rabbit1的主机名(hostname)
# on rabbit2
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@7bdb16ce5c21 --ram
rabbitmqctl start_app
# on rabbit3
同理
简化写法
# 简化写法
rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster rabbit@7bdb16ce5c21
因为在docker服务构建过程中,使用了端口映射,可以从docker节点的物理机ip直接进行访问,http://yourip:16572
设置集群策略后,集群中节点将会同步数据 —> 参考
破坏性测试,关闭其中一个 rabbitmq 节点
# on rabbit2
rabbitmqctl stop_app
Exchanges 和 Queues 不会丢失,通过其他 rabbitmq 节点仍然可以完成工作。
? 参考资料
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/195067.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...