Docker中实现RabbitMQ集群

来源:互联网 发布:603258电魂网络吧 编辑:程序博客网 时间:2024/06/05 12:47

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@rabbit1rabbitmqctl start_app

5. 要到的配置代码
Dockerfile

FROM jt-centos6:0.0.1FROM rabbitmq:latestRUN /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:latestADD rabbitmq.config /etc/rabbitmq/RUN chmod u+rw /etc/rabbitmq/rabbitmq.configADD erlang.cookie /var/lib/rabbitmq/.erlang.cookieRUN chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookieRUN chmod 400 /var/lib/rabbitmq/.erlang.cookieRUN mkdir /opt/rabbitADD startrabbit.sh /opt/rabbit/RUN chmod a+x /opt/rabbit/startrabbit.shEXPOSE 5672EXPOSE 15672EXPOSE 25672EXPOSE 4369EXPOSE 9100EXPOSE 9101EXPOSE 9102EXPOSE 9103EXPOSE 9104EXPOSE 9105CMD /opt/rabbit/startrabbit.sh

server中的erlang.cookie

JHWMKVOYFWWBXWXOYXFQ

server中的rabbitmq.config

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

server中的startrabbit.sh

#!/bin/bashchown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookiechmod 400 /var/lib/rabbitmq/.erlang.cookieRABBITMQ_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=adminrabbit2:  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"