Docker中实现RabbitMQ集群

1. docker环境准备
1). 获取docker所在centos7的hostname值
2). Docker版本1.7,erlang版本17.3,docker-compose版本1.5.2
3). 镜像及配置准备: rabbitmq-base:所需配置见下面的Dockerfile内容。注意:Dockerfile文件中FROM为基础镜像centos和rabbitmq,其他不变(可以直接从docker官方拉取). rabbitmq-server:所需配置见server中的Dockerfile, erlang.cookie,rabbitmq.config以及startrabbit.sh。注意:Dockerfile文件中FROM为rabbitmq-base制作镜像的name, EXPOSE为对外暴露的端口,可自行添加。Erlang.cookie中是erlang通讯的cookie值,必须按其规则写死。Startrabbit.sh中hostname与本虚拟机的hostname保持一致。(hostname命令可直接查看,hostname newname指令可以修改,newname为修改hostname). RabbitMQ实例集群:所需docker-compose执行cluster文件中的yml文件。注意:每个节点名称自定,但是要保持一致,image镜像必须制定为rabbitmq-server创建的镜像name, ports左边是容器暴露端口,客户端访问端口,可自定修改,不产生端口冲突即可。

2. 镜像制作与docker-compose一键部署
1). 基础镜像导入及docker-compose安装
a). SSHClient工具上传docker-compose-Linux-x86_64到/usr/local/bin目录下
b). mv docker-compose-Linux-x86_64 docker-compose #修改名称
c). chmod +x /usr/local/bin/docker-compose #设置文件访问权限
d). docker-compose -version #查看版本
e). docker-compose up -d #后台模式被启动
2). rabbitmq-base镜像制作
在base文件夹执行命令 docker build -t rabbitmq-base:3.6.5 .(千万别忘记空格”.”)
这里写图片描述
3). rabbitmq-server镜像制作:
同rabbitmq-base一样设置,执行docker build -t rabbit-server:3.6.5

4). 查看镜像: docker images
5). 一键部署:
只需要在cluster文件执行:-compose up -d
此命令会在当前目录及父目录中搜索yml,yaml等文件,并自动执行。
这里写图片描述 (成功创建三个节点)
6). 查看实例
执行命令: docker ps
这里写图片描述

至此,通过docker-compose创建实例完成。

3. 集群及高可用实现
1). 实现rabbitmq集群
a.首先进入每个容器,启动客户端管理插件。
执行命令:docker exec -i -t ca9d909c529c bash进入ID为ca9d909c529c的容器。
执行命令: rabbitmq-plugins enable rabbitmq_management启动插件。
执行命令:exit退出容器(容器依旧工作,不会停止服务)
b. 在yml文件中,已制定了三个节点之间的挂载管理,节点2挂载在节点1,节点3挂载集群1, 2节点上。所以,再加入集群操作时,也按照该顺序执行。先进入节点2,执行命令:rabbitmqctl stop_app停止服务. 然后执行命令:rabbitmqctl join_cluster –ram rabbit@tabbit1.接着执行命令:rabbitmqctl start_app启动服务.
这里写图片描述(节点1和节点2实现了集群), 同样的操作在节点3操作,挂载的节点可以是1或者2。 –ram指定内存,如果不写指定磁盘,其中内存在消息吞吐上性能更加,磁盘可以保证消息持久化。
c. 所有对外暴露的端口对外开放
开发端口:firewall-cmd –zone=public –add-port80/tcp –permanent (–permanent永久生效:firewall-cmd –reload)
d. 客户端
在浏览器地址输入ip:15672, 按照默认账号密码登陆, 可以看到三个节点实现”负载均衡”的集群。
这里写图片描述
2). 实现高可用
实现高可用的策略和普通Linux上一样,详见Linux部署手册。
这里写图片描述(黄色数量根据节点数目和策略自动镜像的队列,红色是镜像策略的一种。)

4. docker及rabbitmq常见操作命令

Docker:
版本查看:docker version
服务启动:service docker start
服务关闭:service docker stop
服务重启:service docker restart
服务信息:docker info

镜像库提供的多个镜像:docker search redis      
拉取最后版本的docker-redis镜像:docker pull redis         
查看镜像:docker images
启动镜像实例:docker run -d --name redis7001 -p 7001:6379 redis

查看当前运行的dockerid:docker ps                               
查看已有的可能状态是停止:docker ps -a                           
开启实例:docker start b193fbe1e400              #如重启可能实例被关闭
停止实例:docker stop b193fbe1e400               
删除运行的docker:docker rm –f 0cfc4932b9a0       # -f强制删除

删除镜像:docker rmi xcfc4932b9a0                
创建镜像:docker build -t jt-centos6:0.0.1 .
导出镜像:docker save -o jt-centos6.tar jt-centos6:0.0.1
导入镜像:docker load -i jt-centos6.tar
进入容器:docker exec -it 0cfc4932b9a0 bash
退出容器:exit

设置文件权限:chmod +x /usr/local/bin/docker-compose
查看版本:docker-compose -version                            
后台模式被启动docker-compose up -d                             

查看版本:COMPOSE_PROJECT_NAME=myzk docker-compose ps            
先停止:COMPOSE_PROJECT_NAME=myzk docker-compose stop       
后删除:COMPOSE_PROJECT_NAME=myzk docker-compose rm         

Rabbitmq:
启动服务:service rabbitmq-server start
停止服务:service rabbitmq-server stop
重启服务:service rabbitmq-server restart
错误日志目录:/var/log/rabbitmq/startup_err
设置开机启动:chkconfig rabbitmq-server on

启动后台管理:rabbitmq-plugins enable rabbitmq_management

集群:
停止服务:rabbitmqctl stop_app
加入集群:rabbitmqctl join_cluster --ram rabbit@rabbit1
rabbitmqctl start_app

5. 要到的配置代码
Dockerfile

FROM jt-centos6:0.0.1

FROM rabbitmq:latest

RUN /usr/sbin/rabbitmq-plugins enable rabbitmq_mqtt rabbitmq_stomp rabbitmq_management  rabbitmq_management_agent rabbitmq_management_visualiser rabbitmq_federation rabbitmq_federation_management sockjs

#CMD /usr/sbin/rabbitmq-server

server中的Dockerfile

FROM mq-base:latest

ADD rabbitmq.config /etc/rabbitmq/

RUN chmod u+rw /etc/rabbitmq/rabbitmq.config

ADD erlang.cookie /var/lib/rabbitmq/.erlang.cookie

RUN chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie

RUN chmod 400 /var/lib/rabbitmq/.erlang.cookie

RUN mkdir /opt/rabbit

ADD startrabbit.sh /opt/rabbit/

RUN chmod a+x /opt/rabbit/startrabbit.sh


EXPOSE 5672
EXPOSE 15672
EXPOSE 25672
EXPOSE 4369
EXPOSE 9100
EXPOSE 9101
EXPOSE 9102
EXPOSE 9103
EXPOSE 9104
EXPOSE 9105

CMD /opt/rabbit/startrabbit.sh

server中的erlang.cookie

JHWMKVOYFWWBXWXOYXFQ

server中的rabbitmq.config

[{rabbit, [{loopback_users, []}]}].

server中的startrabbit.sh

#!/bin/bash

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie

RABBITMQ_NODENAME=$RABBITMQ_NODENAME /usr/sbin/rabbitmq-server

 if [ -z "$CLUSTERED" ]; then
#       # if not clustered then start it normally as if it is a single server
        RABBITMQ_NODENAME=$RABBITMQ_NODENAME /usr/sbin/rabbitmq-server
 else
        if [ -z "$CLUSTER_WITH" -o -z "$CLUSTER_NODENAME" ]; then
                # If clustered, but cluster with is not specified then again start normally, could be the first server in the
                # cluster
                RABBITMQ_NODENAME=$RABBITMQ_NODENAME /usr/sbin/rabbitmq-server
        else
                RABBITMQ_NODENAME=$RABBITMQ_NODENAME /usr/sbin/rabbitmq-server -detached
                /usr/sbin/rabbitmqctl stop_app
                if [ -z "$RAM_NODE" ]; then
                        /usr/sbin/rabbitmqctl join_cluster $RABBITMQ_NODENAME@$CLUSTER_WITH
                else
                        /usr/sbin/rabbitmqctl join_cluster --ram $RABBITMQ_NODENAME@$CLUSTER_WITH
                fi
                /usr/sbin/rabbitmqctl start_app
                # /usr/sbin/rabbitmq-plugins enable rabbitmq_mqtt rabbitmq_stomp rabbitmq_management  rabbitmq_management_agent rabbitmq_management_visualiser rabbitmq_federation rabbitmq_federation_management sockjs

                # Tail to keep the a foreground process active..
                #tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
                tail -f /etc/hosts
        fi
 fi

cluster中的compose.yml


rabbit1:
  image: mq-server:latest
  hostname: rabbit1
  ports:
    - "5672:5672"
    - "15672:15672"
  environment:
    - RABBITMQ_DEFAULT_USER=admin
    - RABBITMQ_DEFAULT_PASS=admin
rabbit2:
  image: mq-server:latest
  hostname: rabbit2
  links:
    - rabbit1
  environment:
   - CLUSTERED=true
   - CLUSTER_WITH=rabbit1
   - RAM_NODE=true
  ports:
      - "5673:5672"
      - "15673:15672"

rabbit3:
  image: mq-server:latest
  hostname: rabbit3
  links:
    - rabbit1
    - rabbit2
  environment:
   - CLUSTERED=true
   - CLUSTER_WITH=rabbit1
  ports:
        - "5674:5672"
        - "15674:15672"

猜你喜欢

转载自blog.csdn.net/zhangningkid/article/details/75258444