跳转至

使用 Docker 部署 ActiveMQ


2025-11-10 by dongnan

开始之前

Apache ActiveMQ 是一个开源的消息中间件,用于在分布式系统中实现 异步通信、系统解耦、流量削峰 和 可靠消息传递。

它支持多种消息协议(JMS、AMQP、MQTT、STOMP 等),并且可以在 Java、Python、Go等语言间通信。

应用场景

  • 异步处理:下单后异步发送短信、发票
  • 系统解耦:前端系统发消息 → 后台异步处理
  • 流量削峰:大量请求写入队列,后台逐步消费
  • 广播通知:系统配置变更、缓存失效通知
  • IoT设备消息:使用 MQTT 协议传感器上报数据

版本

  • ActiveMQ 5.x Classic 历史悠久,成熟稳定,配置简单
  • ActiveMQ Artemis 新一代架构 性能高、延迟低、内存占用小,支持更多协议

环境描述

  • OS: Ubuntu Server 20.04 LTS
  • Docker: 24.0.7
  • Docker-compose: 1.25.0

操作步骤

编排容器

使用 docker-compose 编排 ActiveMQ 服务,适合开发或测试环境使用。

version: '3'

services:
  activemq:
    image: rmohr/activemq:latest
    container_name: activemq
    restart: always
    ports:
      - "61616:61616"   # JMS 连接端口
      - "8161:8161"     # Web 控制台端口
    environment:
      - ACTIVEMQ_ADMIN_LOGIN=admin
      - ACTIVEMQ_ADMIN_PASSWORD=admin
      - ACTIVEMQ_MIN_MEMORY=512
      - ACTIVEMQ_MAX_MEMORY=2048
    volumes:
      - activemq-data:/var/activemq/data
      - activemq-logs:/var/activemq/logs

volumes:
  activemq-data:
  activemq-logs:

启动

docker-compose up -d

查看状态

docker-compose ps

查看日志

docker-compose logs -f activemq

demo

在 Java 中可使用连接 URL:

tcp://localhost:61616

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection("admin", "admin");
connection.start();

其它(可选)

Q:创建的 activemq 容器(172.17.0.2)正常工作,如何禁止该容器访问 internet 其它保持不变?

A:Docker 当前 NAT 规则允许 172.17.0.0/16 网段的容器通过 MASQUERADE 访问 internet,可以在 DOCKER-USER 链中加一条规则:

iptables -I DOCKER-USER -s 172.17.0.2 ! -d 172.17.0.0/16 -j DROP

A:Docker 官方建议自定义规则都放在 DOCKER-USER 链,它会在所有容器流量进入 Docker NAT 规则前被处理。

说明:

  • -s 172.17.0.2:匹配容器源 IP。
  • ! -d 172.17.0.0/16:目的地址不是 Docker 内部网段时。
  • -j DROP:直接丢弃包(阻止访问外网)。
  • 这会禁止 172.17.0.2 访问 Internet,但容器间通信仍可用。

参考

  • ChatGPT
回到页面顶部