# 使用docker 搭建activemq集群

# 一、 获取镜像

# 1. 查找已有的mq docker镜像

TIP

自己搭建失败了。。这里使用别人的

# 命令行输入

docker search activemq

# 结果

# 由于5.14不是最新版,这里我们选用第二个

# 二、 搭建集群前的准备工作

# 1. 试运行一下

# 命令行输入

docker run -d rmohr/activemq

# 运行后会返回生成的容器ID

# 2. 进入容器查看mq根目录所在

docker exec -ti 3921feaef9d69c241c9bb14d7aa3296eb1e127be9f7ebd43e3db32809037a56f /bin/bash
pwd

# 可以看到mq根目录的路径为 /opt/apache-activemq-5.15.6

# 3. 复制容器根目录文件到宿主机上并改名为activemq(挂载用)

docker cp 3921feaef9d69c241c9bb14d7aa3296eb1e127be9f7ebd43e3db32809037a56f:/opt/apache-activemq-5.15.6  ./

退出容器

ctrl + p + q

mv apache-activemq-5.15.6 activemq

# 三、编写 docker-compose.yml 文件

# 1. 在当前目录新建一个 docker-compose.yml 文件

touch docker-compose.yml

# 2. 加入一下代码

version: "3"
services:
  activemq1:
    image: rmohr/activemq
    ports:
    - "8161:8161"
    - "61616:61616"
    volumes:
    - ./activemq/conf:/opt/apache-activemq-5.15.6/conf
  activemq2:
    image: rmohr/activemq
    ports:
    - "8162:8161"
    - "61617:61616"
    volumes:
    - ./activemq/conf:/opt/apache-activemq-5.15.6/conf

# 3. 跑起来(要在docker-compose.yml所在的目录)

docker-compose up -d

# 访问本机ip的 8161 或者 8162 端口

这样子雏形就搭好了

# 四、添加密码安全认证

# 主要修改以下文件

# 1.在 users.properties 中增加用户名密码(用于61616端口的认证)

# 2. 在 ***login.config***修改登录插件配置

activemq-domain {
    org.apache.activemq.jaas.PropertiesLoginModule required  debug=true
    org.apache.activemq.jaas.properties.user="users.properties"
    org.apache.activemq.jaas.properties.group="groups.properties";
};

TIP

配置键名需要与 activemq.xml 里插件配置的参数一致

# 3. 在 activemq.xml 增加登录插件

# 标签内加入如下代码

<plugins>
    <jaasAuthenticationPlugin configuration="activemq-domain"/>
</plugins>

# 4. 修改 jetty-realm.properties (这里用于 8161 端口的网页登录)

TIP

格式: 用户名:密码,权限

# 重启容器进入管理端的密码就会变成你修改后的密码了,同时后台程序连接mq也需要密码认证

# 五、 配置死信重发插件及死信队列单独命名

# 1. 死信重发

activemq.xml <broker> 标签下 <plugins> 标签内添加如下代码

<redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
    <redeliveryPolicyMap>
        <redeliveryPolicyMap>
            <redeliveryPolicyEntries>
                <!-- a destination specific policy -->
                <redeliveryPolicy queue="SpecialQueue"
                                  maximumRedeliveries="4"
                                  redeliveryDelay="10000"/>
            </redeliveryPolicyEntries>
    
            <defaultEntry>
                <!-- the fallback policy for all other destinations -->
                <redeliveryPolicy maximumRedeliveries="4"
                                  initialRedeliveryDelay="5000"
                                  redeliveryDelay="10000"/>
            </defaultEntry>
        </redeliveryPolicyMap>
    </redeliveryPolicyMap>
</redeliveryPlugin>

TIP

仅5.15以后的版本可用

# 2. 死信队列单独命名

#activemq.xml <broker> 标签下 <destinationPolicy> <policyMap> <policyEntries> 标签内添加如下代码

<policyEntry queue=">">
    <deadLetterStrategy>
        <individualDeadLetterStrategy queuePrefix="DLQ." useQueueForQueueMessages="true" processNonPersistent="true"/>
    </deadLetterStrategy>
</policyEntry>

参考文档 http://activemq.apache.org/message-redelivery-and-dlq-handling.html (opens new window)

# 六、配置集群

#activemq.xml <broker> 标签下 添加如下代码

 <networkConnectors>
            <networkConnector name="local_network" uri="static:(tcp://192.168.2.139:61616,tcp://192.168.2.139:61617)"
                              duplex="true" userName="admin"
                              password="admin"></networkConnector>
</networkConnectors>

TIP

192.168.2.139 是本机IP,配置服务器时记得换成公网IP userName="admin" password="admin" 顾名思义,账号密码

Last Updated: 2/1/2019, 11:53:26 AM