安装
- 查询rabbitMQ镜像
docker search rabbitmq:management
- 拉取镜像:
docker pull rabbitmq:management
- 查看docker镜像列表是否有了
docker images
- 操作容器(默认简单版)
- -d 后台运行
- -p 隐射端口
- –name 指定rabbitMQ名称
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
- 操作(设置账户密码版本)
- -d 后台运行
- -p 隐射端口
- –name 指定rabbitMQ名称
- RABBITMQ_DEFAULT_USER 指定用户账号
- RABBITMQ_DEFAULT_PASS 指定账号密码
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone rabbitmq:management
- 最后即可访问:http://ip:15672
- 默认账号密码:guest/guest
搭建集群
- 机器1:服务器1ip
- 机器2:服务器2ip
- 操作机器1
docker run -d --hostname rabbitmq1 --add-host=rabbitmq2:服务器2ip --restart=unless-stopped --name rabbitmq1 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbit_mq' rabbitmq:management
参数解释:
-d 容器后台运行
--hostname rabbitmq1 容器的主机名为 rabbitmq1
--add-host="rabbitmq1":192.168.23.189 修改容器内部的hosts
--restart=unless-stopped docker 容器重启后重启MQ
--name rabbitmq1 容器名为rabbitma1,在宿主机上运行“docker ps”命令时显示的名称
-p "5672:5672" 消息通讯端口
-p "15672:15672" 后台管理端口
-e RABBITMQ_DEFAULT_USER=admin 设置rabbitmq默认用户为admin
-e RABBITMQ_DEFAULT_PASS=admin 设置rabbitmq默认密码为admin
-e RABBITMQ_ERLANG_COOKIE='rabbit_mq' 设置rabbitmq的cookie为“rabbit_mq”,可以自定义为其他文本,容器保持一致即可
启动完毕后,在网页打开服务器1ip:15672访问看看是否正常
操作机器2
docker run -d --hostname rabbitmq2 --add-host=rabbitmq1:机器1ip --restart=unless-stopped --name rabbitmq2 --net host -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -e RABBITMQ_ERLANG_COOKIE='rabbit_mq' rabbitmq:management
启动完毕后,在网页打开服务器2ip:15672访问看看是否正常
回到机器1 进入刚刚启动的rabbit容器
docker exec -it rabbitmq1 bash
- 进入容器后通过rabbitmqctl命令对MQ进行操作
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#重新启动MQ
rabbitmqctl start_app
退出容器
exit
- 回到机器2 进入刚刚启动的rabbit容器
docker exec -it rabbitmq2 bash
- 进入容器后通过rabbitmqctl命令对MQ进行操作
#首先停止当前MQ
rabbitmqctl stop_app
#resetMQ
rabbitmqctl reset
#跟机器1的消息队列建立关系
rabbitmqctl join_cluster --ram rabbit@rabbitmq1
#重新启动MQ
rabbitmqctl start_app
退出容器
exit
- 登录查看
- 到这里测试用的两台集群已经搭建完毕,但是这时候还不能用,因为没有做负载。
- 这里可以另外找一台机器也可以再机器1或者机器2上进行部署nginx来进行负载;实际部署中是需要在另外一台机器进行部署的;测试的话就在机器1上进行部署nginx了
- 在机器1上面随便建立一个文件夹用来存放nginx的配置文件:/root/nginx/nginx_rabbitmq.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
#rabbitmq管理界面
upstream rabbitManage {
server 192.168.23.188:15672;
server 192.168.23.185:15672;
}
server {
listen 15673;
server_name 192.168.23.188;
location / {
proxy_pass http://rabbitManage;
index index.html index.htm;
}
}
}
# rabbitmq通信
stream{
upstream rabbitTcp{
server 192.168.23.188:5672;
server 192.168.23.189:5672;
}
server {
listen 5673;
server_name 192.168.23.188;
location / {
proxy_pass http://rabbitTcp;
index index.html index.htm;
}
}
}
配置完毕后启动nginx:
docker run -it -d --name nginxMQ -v /root/nginx/nginx_rabbitmq.conf:/etc/nginx/nginx.conf --privileged --net=host nginx
- 启动完毕后通过负载的地址进行统一访问MQ
- 后台地址:192.168.23.188:15673
- 通讯地址:192.168.23.188:5673
至此通过Docker 搭建普通版本RabbitMQ集群已经搭建完毕了,普通版本的集群对于一般公司的业务来说是够用的了,如果针对业务量比较大的公司还是有些弊端的;虽然搭建了nginx进行负载但是还是缺少高可用;这时候需要搭建镜像版的集群:
与普通集群模式区别 主要是消息实体会主动在镜像节点间同步数据,而不是只存储数据元信息。 普通通集群模式 一旦数据节点挂了,如果没有持久化数据,数据就会丢失,且这时候也不会进行消费,只能等待消息重新回到队列中才能再次消费;但镜像集群模式可以保证集群只要不全部挂掉,数据就不会丢失,当相对于性能来说,镜像集群模式会比普通集群模式多出消耗数据的传输。故取决于业务场景进行取舍;且镜像版集群不仅仅需要nginx来进行负载也需要keepaplived进行转发;对机器的要求相对更严格一点