【上海大数据培训】Docker中实现RabbitMQ集群

时间:2018-02-11 20:36:21   来源:上海尚学堂   阅读:

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

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

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

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

server中的erlang.cookie

 

JHWMKVOYFWWBXWXOYXFQ

 

  • 1

server中的rabbitmq.config

 

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

 

  • 1

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

 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

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"
        - "15

上海大数据培训 感谢您的阅读,更多大数据相关文章欢迎点击本站内容:
Docker镜像的管理与使用》;《Spring boot转docker&docker简单使用和管理》;等
原文地址:http://blog.csdn.net/zhangningkid/article/details/75258444



 

分享:0

电话咨询

客服热线服务时间

周一至周五 9:00-21:00

周六至周日 9:00-18:00

咨询电话

021-67690939
15201841284

微信扫一扫