一、版本说明:
系统:centos 7
docker:18
rabbitmq:3.8.4
二、单机搭建
1、拉取官方镜像
[root@VM_0_6_centos ~]# docker search rabbitmq
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
rabbitmq RabbitMQ is an open source multi-protocol me… 3219 [OK]
bitnami/rabbitmq Bitnami Docker Image for RabbitMQ 48 [OK]
tutum/rabbitmq Base docker image to run a RabbitMQ server 20
kbudde/rabbitmq-exporter rabbitmq_exporter for prometheus 13 [OK]
frodenas/rabbitmq A Docker Image for RabbitMQ 12 [OK]
cyrilix/rabbitmq-mqtt RabbitMQ MQTT Adapter 8 [OK]
arm32v7/rabbitmq RabbitMQ is an open source multi-protocol me… 7
gonkulatorlabs/rabbitmq DEPRECATED: See maryville/rabbitmq 5 [OK]
aweber/rabbitmq-autocluster RabbitMQ with the Autocluster Plugin 5
pivotalrabbitmq/rabbitmq-server-buildenv Image used to build and test RabbitMQ server… 4
arm64v8/rabbitmq RabbitMQ is an open source multi-protocol me… 3
pivotalrabbitmq/rabbitmq-autocluster RabbitMQ with the rabbitmq-autocluster plugi… 3
henrylv206/rabbitmq-autocluster RabbitMQ Cluster 2 [OK]
deadtrickster/rabbitmq_prometheus RabbitMQ + Prometheus RabbitMQ Exporter plug… 2
foxylion/rabbitmq Preconfigured RabbitMQ docker image with sup… 1 [OK]
amd64/rabbitmq RabbitMQ is an open source multi-protocol me… 1
activatedgeek/rabbitmqadmin A rabbitmqadmin docker image for administrat… 1 [OK]
i386/rabbitmq RabbitMQ is an open source multi-protocol me… 1
webhostingcoopteam/rabbitmq-conf RabbitMQ Configurator for Rancher 1 [OK]
ekesken/rabbitmq docker image for rabbitmq that is configurab… 1 [OK]
riftbit/rabbitmq RabbitMQ 3.x Container based on Alpine Linux… 1
s390x/rabbitmq RabbitMQ is an open source multi-protocol me… 0
ppc64le/rabbitmq RabbitMQ is an open source multi-protocol me… 0
pdffiller/rabbitmq Rabbitmq 3.7.3 with delayed_message plugin,c… 0
arm32v6/rabbitmq RabbitMQ is an open source multi-protocol me… 0
[root@VM_0_6_centos ~]# docker pull rabbitmq:management
选择官方镜像,需要注意的是镜像rabbitmq
是不带控制台,所以安装带控制台的镜像需要拉取镜像rabbitmq:management
。
2、创建文件docker-compose.yml、执行文件run.sh以及相关文件夹data
[root@VM_0_6_centos standalone]# ls
data docker-compose.yml run.sh
[root@VM_0_6_centos standalone]# pwd
/opt/rabbitmq/standalone
[root@VM_0_6_centos standalone]#
docker-compose.yml
version: '3'
services:
rabbitmq:
#rabbitmq:management 带有控制台的镜像
image: rabbitmq:management
container_name: rabbitmqStandalone
restart: always
ports:
- "15672:15672"
- "5672:5672"
- "25672:25672"
- "5671:5671"
- "4369:4369"
volumes:
- /opt/rabbitmq/standalone/data:/opt/rabbitmq/data
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
run.sh
#! /bin/sh
docker-compose -f docker-compose.yml up -d
3、可以进入控制台查看。
[root@VM_0_6_centos standalone]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f6d6376c65e6 rabbitmq:management "docker-entrypoint.s…" 2 days ago Up 2 days 0.0.0.0:4369->4369/tcp, 0.0.0.0:5671-5672->5671-5672/tcp, 0.0.0.0:15672->15672/tcp, 0.0.0.0:25672->25672/tcp, 15671/tcp rabbitmqStandalone
web端 http://127.0.0.1:15672
二、集群搭建
1、构建一主二从,三节点,IP配置如下:
服务器ip | hostname | port |
192.168.6.2 | rabbitmq1 | 15673,5673 |
192.168.6.3 | rabbitmq2 | 15674,5674 |
192.168.6.4 | rabbitmq3 | 15675,5675 |
2、搭建准备文件
docker-compose.yml
version: '3'
services:
rabbitmq1:
image: rabbitmq:3.8.3-management
container_name: rabbitmq1
restart: always
hostname: rabbitmq1
ports:
- 15673:15672
- 5673:5672
volumes:
- ./data1:/var/lib/rabbitmq
- ./rabbitmq.sh:/home/rabbitmq.sh
- ./hosts:/etc/hosts
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
networks:
rabbit:
ipv4_address: 192.168.6.2
rabbitmq2:
image: rabbitmq:3.8.3-management
container_name: rabbitmq2
restart: always
hostname: rabbitmq2
ports:
- 15674:15672
- 5674:5672
volumes:
- ./data2:/var/lib/rabbitmq
- ./rabbitmq_ram.sh:/home/rabbitmq.sh
- ./hosts:/etc/hosts
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
networks:
rabbit:
ipv4_address: 192.168.6.3
rabbitmq3:
image: rabbitmq:3.8.3-management
container_name: rabbitmq3
restart: always
hostname: rabbitmq3
ports:
- 15675:15672
- 5675:5672
volumes:
- ./data3:/var/lib/rabbitmq
- ./rabbitmq_ram.sh:/home/rabbitmq.sh
- ./hosts:/etc/hosts
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
- RABBITMQ_ERLANG_COOKIE=CURIOAPPLICATION
networks:
rabbit:
ipv4_address: 192.168.6.4
networks:
rabbit:
external:
name: rabbitmqnet
启动镜像执行文件run.sh
#! /bin/sh
docker-compose -f docker-compose.yml up -d
定义主机名配置文件hosts文件
192.168.6.2 rabbitmq1
192.168.6.3 rabbitmq2
192.168.6.4 rabbitmq3
节点加入集群执行文件:
第一个主机执行文件rabbitmq.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
从节点执行文件分为两种,一种是内存存储rabbitmq_ram.sh,一种硬盘存储rabbitmq_disc.sh
#rabbitmq_disc.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq1
rabbitmqctl start_app
#rabbitmq_ram.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
注意:
1)单节点系统只允许磁盘类型的节点,否则当节点重启以后,所有的配置信息都会丢失。
2)从节点使用rabbitmq_ram.sh还是rabbitmq_disc.sh,可以选择至少配置一个节点为磁盘节点,其余部分配置为内存节点,可以加快响应速度。本次,采用一硬盘两内存为测试。
3)rabbitmqctl join_cluster --ram rabbit@rabbitmq1中的@后为hostname。
4)执行文件执行位置:
- rabbitmq.sh在IP为6.2容器内执行
- abbitmq_ram.sh分别在IP为6.3和6.4容器内执行
5)sh文件位置
[root@VM_0_6_centos cluster]# ls
docker-compose.yml hosts rabbitmq_disc.sh rabbitmq_ram.sh rabbitmq.sh run.sh
[root@VM_0_6_centos cluster]# pwd
/opt/rabbitmq/cluster
6) docker-compose.yml中的data1,data2,data3执行后在cluster中默认创建。
2、创建子网
docker network create --subnet 192.168.6.1/24 rabbitmqnet
查看创建结果:
[root@VM_0_6_centos cluster]# docker network ls
NETWORK ID NAME DRIVER SCOPE
212304919d6c bridge bridge local
99ccb744c7e9 cluster_default bridge local
da73fc92a17a host host local
538302a56c63 none null local
a3ebe1b2e555 rabbitmqnet bridge local
3、执行run.sh,启动三个节点
[root@VM_0_6_centos cluster]# ./run.sh
Creating rabbitmq1 ... done
Creating rabbitmq1 ...
Creating rabbitmq2 ...
[root@VM_0_6_centos cluster]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
630d37d1aef6 rabbitmq:3.8.3-management "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp, 0.0.0.0:15674->15672/tcp rabbitmq2
751e76c8d788 rabbitmq:3.8.3-management "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp rabbitmq1
baf7fb6edbc7 rabbitmq:3.8.3-management "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5675->5672/tcp, 0.0.0.0:15675->15672/tcp rabbitmq3
在未加入节点时,进入任意节点管理界面,可以看到只有一个节点。
4、分别进入三个节点,执行对应home目录下的rabbitmq.sh文件,形成集群。
[root@VM_0_6_centos cluster]# docker exec -it 751e76c8d788 /bin/bash
root@rabbitmq1:/# cat /etc/hosts
192.168.6.2 rabbitmq1
192.168.6.3 rabbitmq2
192.168.6.4 rabbitmq3
root@rabbitmq1:/# cat /home/rabbitmq.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
root@rabbitmq1:/# ./home/rabbitmq.sh
Stopping rabbit application on node rabbit@rabbitmq1 ...
Resetting node rabbit@rabbitmq1 ...
Starting node rabbit@rabbitmq1 ...
completed with 3 plugins.
root@rabbitmq1:/# exit
exit
[root@VM_0_6_centos cluster]# docker exec -it 630d37d1aef6 /bin/bash
root@rabbitmq2:/# cat /etc/hosts
192.168.6.2 rabbitmq1
192.168.6.3 rabbitmq2
192.168.6.4 rabbitmq3
root@rabbitmq2:/# cat /home/rabbitmq.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
root@rabbitmq2:/# ./home/rabbitmq.sh
Stopping rabbit application on node rabbit@rabbitmq2 ...
Resetting node rabbit@rabbitmq2 ...
Clustering node rabbit@rabbitmq2 with rabbit@rabbitmq1
Starting node rabbit@rabbitmq2 ...
completed with 3 plugins.
root@rabbitmq2:/# exit
exit
[root@VM_0_6_centos cluster]# docker exec -it baf7fb6edbc7 /bin/bash
root@rabbitmq3:/# cat /etc/hosts
192.168.6.2 rabbitmq1
192.168.6.3 rabbitmq2
192.168.6.4 rabbitmq3
root@rabbitmq3:/# cat /home/rabbitmq.sh
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
rabbitmqctl start_app
root@rabbitmq3:/# ./home/rabbitmq.sh
Stopping rabbit application on node rabbit@rabbitmq3 ...
Resetting node rabbit@rabbitmq3 ...
Clustering node rabbit@rabbitmq3 with rabbit@rabbitmq1
Starting node rabbit@rabbitmq3 ...
completed with 3 plugins.
root@rabbitmq3:/# exit
exit
进入任意节点查看状态
[root@VM_0_6_centos cluster]# docker exec -it 751e76c8d788 /bin/bash
root@rabbitmq1:/# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbitmq1 ...
Basics
Cluster name: rabbit@rabbitmq1
Disk Nodes
rabbit@rabbitmq1
RAM Nodes
rabbit@rabbitmq2
rabbit@rabbitmq3
Running Nodes
rabbit@rabbitmq1
rabbit@rabbitmq2
rabbit@rabbitmq3
Versions
rabbit@rabbitmq1: RabbitMQ 3.8.3 on Erlang 22.3.4.1
rabbit@rabbitmq2: RabbitMQ 3.8.3 on Erlang 22.3.4.1
rabbit@rabbitmq3: RabbitMQ 3.8.3 on Erlang 22.3.4.1
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@rabbitmq1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@rabbitmq3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@rabbitmq3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@rabbitmq3, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
到现在主从三节点,即搭建完成。
5、镜像集群
进入任意节点,添加策略实例
root@rabbitmq1:/# rabbitmqctl set_policy ha-11 '^11' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "ha-11" for pattern "^11" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
查看策略实例:
root@rabbitmq1:/# rabbitmqctl set_policy ha-11 '^11' '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Setting policy "ha-11" for pattern "^11" to "{"ha-mode":"all","ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...
root@rabbitmq1:/# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost name pattern apply-to definition priority
/ ha-11 ^11 all {"ha-mode":"all","ha-sync-mode":"automatic"} 0
当然策略实例可以在管理UI上添加,包括使用的队列。
到此,则构建完成。
参考博客:
RabbitMQ详解(四):RabbitMQ集群默认模式、使用Docker搭建RabbitMQ集群、镜像队列_hxt的博客-CSDN博客