1.环境准备 :

1.1 安装好的docker

查看 docker 是否安装 :

  1. docker --version

image.png

1.2 物理机目录

新建docker 总目录,注意这里将来放一些关于docker的数据目录,名字随便取。

  1. mkdir docker

image.png

1.3 拉取 rabbitmq 3.8.5 镜像

  1. docker pull rabbitmq:3.8.5-management

image.png

1.4 拉取 haproxy 2.2.0 镜像

docker pull haproxy:2.2.0

image.png

2.创建相关文件&文件夹

2.1 创建 rabbitmq总文件目录

rabbitmq该目录是总目录

 mkdir -p /docker/rabbitmq

image.png

2.2 模板配置文件

虽然是三个节点的配置,但是他们的配置参数较为相近,所有通过模板自动生成配置即可。
vi rabbitmq-cluster.tmpl
https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.conf.example

# 可以写自己的配置,这里保留

2.3 创建 rabbitmq 三个节点的目录文件

分别创建 rq01 rq02 rq03 三个节点的文件夹,用来存储配置文件、日志文件 、已经数据文件。
for 循环创建 文件夹,文件。

cd  /docker/rabbitmq
for number in `seq 1 3`; do \
mkdir -p ./rq0${number}/log \
&& mkdir -p ./rq0${number}/etc \
&& NUM=${number} envsubst < ./rabbitmq-cluster.tmpl > \
./rq0${number}/etc/rabbitmq.conf \
&& mkdir -p ./rq0${number}/lib; \
done

image.png rabbitmq
查看创建结果

2.4 创建 haproxy 配置文件及目录

2.4.1 创建haproxy 模板文件

vi haproxy-cluster.tmpl

#logging options
global
    maxconn 10000                   #默认最大连接数
    log 127.0.0.1 local0            #[err warning info debug]
    chroot /usr/local/sbin            #chroot运行的路径
    daemon                          #以后台形式运行haproxy
    pidfile /var/run/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
defaults
    log 127.0.0.1 local3
    mode http                       #所处理的类别 (#7层 http;4层tcp  )
    maxconn 10000                   #最大连接数
    option dontlognull              #不记录健康检查的日志信息
    option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器
    retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置
    balance roundrobin              #默认的负载均衡的方式,轮询方式(roundrobin),source类似nginx的ip_hash,leastconn最小连接
    timeout connect 5000                 #连接超时
    timeout client 50000                #客户端超时
    timeout server 50000                #服务器超时

#配置haproxy web监控,查看统计信息
listen stats
    bind 0.0.0.0:810${NUM}
    mode http
    option httplog
    stats enable
    #设置haproxy监控地址为http://localhost:8100/rabbitmq-stats
    stats uri /rabbitmq-stats
    stats refresh 5s
    stats auth admin:admin
#监听8000端口转发到rabbitmq的客户端
listen rabbitmq_admin 
    bind 0.0.0.0:800${NUM}
    server rq01 172.31.0.2:15672 check inter 5000 rise 2 fall 2
    server rq02 172.31.0.3:15672 check inter 5000 rise 2 fall 2
    server rq03 172.31.0.4:15672 check inter 5000 rise 2 fall 2
listen rabbitmq_cluster
    bind 0.0.0.0:5677
    #配置TCP模式
    mode tcp
    #简单的轮询
    balance roundrobin
    #rabbitmq集群节点配置 
    server rq01 172.31.0.2:5672 check inter 5000 rise 2 fall 2
    server rq02 172.31.0.3:5672 check inter 5000 rise 2 fall 2
    server rq03 172.31.0.4:5672 check inter 5000 rise 2 fall 2

2.4.2 生成 haproxy 文件

生成 hy01 hy02 两个文件夹

cd  /docker/rabbitmq
for number in `seq 1 2`; do \
mkdir -p ./hy0${number}/etc \
&& NUM=${number-1}  envsubst  < ./haproxy-cluster.tmpl > \
./hy0${number}/etc/haproxy.cfg; \
done

修改配置

cd  /docker/rabbitmq/hy02/etc
vi haproxy.cfg
#把这个端口改下即可
5677=>5678

对应的端口号为 5677 8001 8101 、5678 8002 8102

2.5 文件夹授权

es 文件目录授权

cd /docker 
chmod 777 rabbitmq -R

image.png

3.编排RabbitMQ节点容器

通常docker集群部署我们都会编写编排脚本,这个相对于单独一个一个run,出错率低且高效。
vi docker-compose.yml

version: '3'
services:
  rq01:
    image: rabbitmq:3.8.5-management
    container_name: rq01
    privileged: true
    hostname: rq01
    environment:
      - RABBITMQ_NODENAME=rq01
      - RABBITMQ_ERLANG_COOKIE=yanyulou
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    volumes:
      - ./rq01/etc:/var/etc/rabbitmq
      - ./rq01/lib:/var/lib/rabbitmq
      - ./rq01/log:/var/log/rabbitmq 
    ports:
      - 5672:5672
      - 15672:15672
    restart: always
    networks:
      rq-net:
            ipv4_address: 172.31.0.2
  rq02:
    image: rabbitmq:3.8.5-management
    container_name: rq02
    privileged: true
    hostname: rq02
    environment:
      - RABBITMQ_NODENAME=rq02
      - RABBITMQ_ERLANG_COOKIE=yanyulou
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    volumes:
      - ./rq02/etc:/var/etc/rabbitmq
      - ./rq02/lib:/var/lib/rabbitmq
      - ./rq02/log:/var/log/rabbitmq 
    ports:
      - 5673:5672
      - 15673:15672
    restart: always
    networks:
      rq-net:
            ipv4_address: 172.31.0.3
  rq03:
    image: rabbitmq:3.8.5-management
    container_name: rq03
    privileged: true
    hostname: rq03
    environment:
      - RABBITMQ_NODENAME=rq03
      - RABBITMQ_ERLANG_COOKIE=yanyulou
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin
    volumes:
      - ./rq03/etc:/var/etc/rabbitmq
      - ./rq03/lib:/var/lib/rabbitmq
      - ./rq03/log:/var/log/rabbitmq 
    ports:
      - 5674:5672
      - 15674:15672
    restart: always
    networks:
      rq-net:
            ipv4_address: 172.31.0.4
  hy01:
    image: haproxy:2.2.0
    container_name: hy01
    privileged: true
    ports:
      - 8101:8101
      - 8001:8001
    volumes:
      - ./hy01/etc/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    restart: always
    links:
    - rq01
    - rq02
    - rq03
    networks:
      rq-net:
            ipv4_address: 172.31.0.5
  hy02:
    image: haproxy:2.2.0
    container_name: hy02
    privileged: true
    ports:
      - 8102:8102
      - 8002:8002
    volumes:
      - ./hy02/etc/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    restart: always
    links:
    - rq01
    - rq02
    - rq03
    networks:
      rq-net:
            ipv4_address: 172.31.0.6

networks:
   rq-net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.31.0.1/24

image.png

4.启动容器

4.1 启动容器

docker-compose up -d

4.2 启动集群服务

docker exec -it rq01  bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

docker exec -it rq02  bash
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rq01@rq01
rabbitmqctl start_app
exit

docker exec -it rq03  bash
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rq01@rq01
rabbitmqctl start_app
exit

5.测试登录

5.1 登录haproxy

用户名、密码:admin
image.png
登录成功
image.png

5.2 登录 rabbitmq

用户名密码 admin
image.png
登录成功
image.png

6.其他补充

6.1 安装辅助命令

docker ps -a | grep hy0 | awk '{print $1 }' | xargs docker  container  stop
docker ps -a | grep hy0 | awk '{print $1 }' | xargs docker  container  rm
docker ps -a | grep rq0 | awk '{print $1 }' | xargs docker  container  stop
docker ps -a | grep rq0 | awk '{print $1 }' | xargs docker  container  rm