Docker初识:RabbitMq服务的搭建(单机+集群)

一、版本说明:

系统: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配置如下:

服务器iphostnameport
192.168.6.2rabbitmq115673,5673
192.168.6.3rabbitmq215674,5674
192.168.6.4rabbitmq315675,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博客

docker-compose安装rabbitmq集群(主从集群---》镜像集群) - 她的开呀 - 博客园

RabbitMQ高可用之镜像队列和实战应用篇_lmx1989219的专栏-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值