使用 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