zoukankan      html  css  js  c++  java
  • docker部署RabbitMQ集群

    拉取镜像

    [root@localhost ~]# docker pull rabbitmq:3.6.15-management
    3.6.15-management: Pulling from library/rabbitmq
    f2aa67a397c4: Pull complete
    f062288ad968: Pull complete
    8b9469379b84: Pull complete
    5b66af38c756: Pull complete
    2349eb3352c4: Pull complete
    d7fb0dd6e32f: Pull complete
    869ba3a0a942: Pull complete
    b7ac6c7140d2: Pull complete
    dc5d9eda274c: Pull complete
    4b48a2eebbeb: Pull complete
    8a009b580bbb: Pull complete
    f3a07993c96e: Pull complete
    86345f9dc620: Pull complete
    Digest: sha256:f367442fb88ff82ca5b102ccbf8bb5eafe7bb14c31abf57b0cee1576dca8d75c
    Status: Downloaded newer image for rabbitmq:3.6.15-management
    docker.io/library/rabbitmq:3.6.15-management

    启动三个容器

    [root@localhost ~]# docker run -d --hostname rabbit1 --name myrabbit1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
    47611d79ad0e9277f1e0a7097ec3ef8949ad5bbea4dfbd47ca4bcc7da8918d9d
    [root@localhost ~]# docker run -d --hostname rabbit2 --name myrabbit2 -p 5673:5672 --link myrabbit1:rabbit1 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
    5b823c0c7e9985d8890c5072126a13e111fc16e7cd8138698ef77d640dabcbae
    [root@localhost ~]# docker run -d --hostname rabbit3 --name myrabbit3 -p 5674:5672 --link myrabbit1:rabbit1 --link myrabbit2:rabbit2 -e RABBITMQ_ERLANG_COOKIE='rabbitcookie' rabbitmq:3.6.15-management
    891236c2c42efa4b3a1c652afbe1878c870f70679ddb826a9b7fd7c25e444c42

    查看容器

    [root@localhost ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    891236c2c42e rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp myrabbit3
    5b823c0c7e99 rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 15671-15672/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp myrabbit2
    47611d79ad0e rabbitmq:3.6.15-management "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp myrabbit1

    主要参数:
    -p 15672:15672 management 界面管理访问端口
    -p 5672:5672 amqp 访问端口
    --link 容器之间连接
    Erlang Cookie 值必须相同,也就是一个集群内 RABBITMQ_ERLANG_COOKIE 参数的值必须相同。因为 RabbitMQ 是用Erlang实现的,Erlang Cookie 相当于不同节点之间通讯的密钥,Erlang节点通过交换 Erlang Cookie 获得认证。

    3、加入节点到集群

    [root@localhost ~]# docker exec -it myrabbit1 bash
    root@rabbit1:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@rabbit1
    root@rabbit1:/# rabbitmqctl reset
    Resetting node rabbit@rabbit1
    root@rabbit1:/# rabbitmqctl start_app
    Starting node rabbit@rabbit1
    root@rabbit1:/# exit
    exit
    [root@localhost ~]# docker exec -it myrabbit2 bash
    root@rabbit2:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@rabbit2
    root@rabbit2:/# rabbitmqctl reset
    Resetting node rabbit@rabbit2
    root@rabbit2:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
    Clustering node rabbit@rabbit2 with rabbit@rabbit1
    root@rabbit2:/# rabbitmqctl start_app
    Starting node rabbit@rabbit2
    root@rabbit2:/# exit
    exit
    [root@localhost ~]# docker exec -it myrabbit3 bash
    root@rabbit3:/# rabbitmqctl stop_app
    Stopping rabbit application on node rabbit@rabbit3
    root@rabbit3:/# rabbitmqctl reset
    Resetting node rabbit@rabbit3
    root@rabbit3:/# rabbitmqctl join_cluster --ram rabbit@rabbit1
    Clustering node rabbit@rabbit3 with rabbit@rabbit1
    root@rabbit3:/# rabbitmqctl start_app
    Starting node rabbit@rabbit3
    eroot@rabbit3:/# exit
    exit

    设置好之后,使用http://物理机ip:15672 进行访问了,默认账号密码是guest/guest,效果如下图:

     

     启动了3个节点,1个磁盘节点和2个内存节点。

    有些特殊的情况,比如已经运行了一段时间的几个单个物理机,我们在之前没有设置过相同的Erlang Cookie值,现在我们要把单个的物理机部署成集群,实现我们需要同步Erlang的Cookie值。

    1.为什么要配置相同的erlang cookie?

    因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。

    2.Erlang Cookie的位置

    要想知道Erlang Cookie位置,首先要取得RabbitMQ启动日志里面的home dir路径,作为根路径。使用:“docker logs 容器名称”查看,如下图

    所以Erlang Cookie的全部路径就是“/var/lib/rabbitmq/.erlang.cookie”。

    注意:每个人的erlang cookie位置可能不同,一定要查看自己的home dir路径。

    3.复制Erlang Cookie到其他RabbitMQ节点

    获取到第一个RabbitMQ的Erlang Cookie之后,只需要把这个文件复制到其他RabbitMQ节点即可。

    物理机和容器之间复制命令如下:

    • 容器复制文件到物理机:docker cp 容器名称:容器目录 物理机目录
    • 物理机复制文件到容器:docker cp 物理机目录 容器名称:容器目录

    设置Erlang Cookie文件权限:“chmod 600 /var/lib/rabbitmq/.erlang.cookie”。

    参考资料

    https://blog.csdn.net/xiaoping0915/article/details/75094857

    https://blog.csdn.net/luosai19910103/article/details/78604692

    https://blog.csdn.net/bolg_hero/article/details/50267103

    http://ivivisoft.com/2017/03/06/rabbitmq-cluster/

  • 相关阅读:
    Chrome浏览器设置默认编码
    linux上安装subversion
    详解Linux命令行下常用svn命令
    css 使容器宽度适应内容宽
    Windsor Spring
    T4 Generate POCO Class for MSSQ
    MSSQ 树型结构数据 循环操作
    System.Reflection.Emit 动态实现接口
    T4 SqlSugar MySql
    微信多开
  • 原文地址:https://www.cnblogs.com/liujunjun/p/14144396.html
Copyright © 2011-2022 走看看