近期项目中,我的项目内部通信是采用rabbitmq进行通信,与其他项目交互时是使用 Activemq 进行交互,所以研究了两种消息队列的安装方式
一般情况下映射到本地端口就可以了,例如第一个Rabbitmq服务 -p 127.0.0.1:5772:5672映射到本地端口,防止产生安全问题
一、单个Rabbitmq服务
docker run -d --hostname rabbit1 --name myrabbit1 -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password -p 5772:5672 -p 15673:15672 rabbitmq:3.6.15-management
查看服务状态 docker ps
0b3c88c98c99 rabbitmq:3.6.15-management "docker-entrypoint.s…" About an hour ago Up About an hour 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5772->5672/tcp, 0.0.0.0:15673->15672/tcp myrabbit1
这时,可以访问服务器的http://IP:15673端口查看Rabbitmq自带的网页。通过5772端口访问服务
我们设置的用户默认就是administrator用户
二、Activemq 服务
docker run -d --name activemq1 -p 61617:61616 -p 61623:61613 -p 8162:8161 webcenter/activemq
容器8161端口是容器提供的web网页端口,这里映射到了0.0.0.0:8162端口,可以通过http://ip:8162访问,默认账号:admin,密码:admin
其他两个端口看个人使用,我使用stomp进行连接,所以要开61613接口。
三、Rabbitmq 集群搭建
写了了一个脚本,命名rabbitmq.sh,给它执行权限
chmod +x rabbitmq.sh
编辑rabbitmq.sh文件内容 vim rabbitmq.sh ,内容如下
#!/bin/bash
docker run -d --hostname rabbit1 --name myrabbit1 -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' -p 5772:5672 -p 15673:15672 rabbitmq:3.6.15-management
docker run -d --hostname rabbit2 --name myrabbit2 -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link myrabbit1:rabbit1 rabbitmq:3.6.15-management
docker run -d --hostname rabbit3 --name myrabbit3 -e RABBITMQ_DEFAULT_USER=username -e RABBITMQ_DEFAULT_PASS=password -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 rabbitmq:3.6.15-management
这样就开启了三个容器,各个命令作用:
-d 守护进程
--hostname rabbit1 当其他容器连接到这个容器时容器的ip 比如其他容器 --link myrabbit1时使用 ping rabbit1 可以看到容器ip
--name 容器运行名称
-e RABBITMQ_DEFAULT_USER=username # 设置默认账号
-e RABBITMQ_DEFAULT_PASS=password # 设置默认密码
-e RABBITMQ_ERLANG_COOKIE='rabbitcookie' # 这个用来搭建集群用,单个容器不需要
-p 5772:5672 -p 15673:15672 # 将服务器 0.0.0.0:5772 映射到容器0.0.0.0:5672端口
rabbitmq:3.6.15-management # 镜像名称
查看三个容器的运行状态 docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64390a5a78bf rabbitmq:3.6.15-management "docker-entrypoint.s…" About an hour ago Up About an hour 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp myrabbit3
e4093a815e9d rabbitmq:3.6.15-management "docker-entrypoint.s…" About an hour ago Up About an hour 4369/tcp, 5671-5672/tcp, 15671-15672/tcp, 25672/tcp myrabbit2
0b3c88c98c99 rabbitmq:3.6.15-management "docker-entrypoint.s…" About an hour ago Up About an hour 4369/tcp, 5671/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:5772->5672/tcp, 0.0.0.0:15673->15672/tcp myrabbit1
这时,可以访问服务器的http://IP:15673端口查看Rabbitmq自带的网页。通过5772端口访问服务
我们设置的用户默认就是administrator用户,进入容器查看
(python3_env) lin@iZ2zefq26zde:~$ docker exec -it myrabbit3 bash
root@rabbit3:/# rabbitmqctl list_users
Listing users
shilin [administrator]
然后就可以开始搭建集群了
进入myrabbit1 容器 docker exec -it myrabbit1 bash ,
执行 rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app && exit
(python3_env) lin@iZ2zefq26zde3v:~$ docker exec -it myrabbit1 bash
root@rabbit1:/# rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl start_app && exit
Stopping rabbit application on node rabbit@rabbit1
Resetting node rabbit@rabbit1
Starting node rabbit@rabbit1
exit
进入myrabbit2 容器 docker exec -it myrabbit2 bash ,
执行 rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster --ram rabbit@rabbit1 && rabbitmqctl start_app && exit
(python3_env) lin@iZ2zefq26zde3vcgsd:~$ docker exec -it myrabbit2 bash
root@rabbit2:/# rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster --ram rabbit@rabbit1 && rabbitmqctl start_app && exit
Stopping rabbit application on node rabbit@rabbit2
Resetting node rabbit@rabbit2
Clustering node rabbit@rabbit2 with rabbit@rabbit1
Starting node rabbit@rabbit2
exit
进入myrabbit3 容器 docker exec -it myrabbit3 bash ,
执行 rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster --ram rabbit@rabbit1 && rabbitmqctl start_app && exit
(python3_env) lin@iZ2zefq26zde3vcgsd3gzrZ:~$ docker exec -it myrabbit3 bash
root@rabbit3:/# rabbitmqctl stop_app && rabbitmqctl reset && rabbitmqctl join_cluster --ram rabbit@rabbit1 && rabbitmqctl start_app && exit
Stopping rabbit application on node rabbit@rabbit3
Resetting node rabbit@rabbit3
Clustering node rabbit@rabbit3 with rabbit@rabbit1
Starting node rabbit@rabbit3
exit
如何判断已经将节点加入进来了呢,打开网页,看到 三个节点就说明成功了