可行,但需分两个独立docker-compose.yml文件分别编排kafka(依赖zookeeper)和rocketmq(自带namesrv),共用自定义桥接网络message-net实现跨栈通信,严禁混用配置或网络逻辑。

直接用 Docker Compose 一键部署 Kafka 和 RocketMQ 微服务集群是可行的,但要注意:Kafka 和 RocketMQ 是两类不同架构的消息系统,不能混用同一套配置或网络逻辑,需分别编排、独立启动、明确隔离。所谓“一键”,本质是把各自组件的依赖、网络、启动顺序封装进两个独立的 docker-compose.yml 文件中,再统一执行。
先分清角色和依赖关系
Kafka 依赖 ZooKeeper(或 KRaft 模式),而 RocketMQ 自带 Namesrv,两者无交集。强行塞进一个 compose 文件会导致:
- 网络命名冲突(如都用
rocketmq网络名,Kafka 容器无法解析zookeeper) - 端口重叠(如 Kafka 的 9092 和 RocketMQ Console 的 8080 虽不冲突,但 Broker 的 10911/10912 与 Kafka 内部通信端口易混淆)
- 健康检查逻辑错乱(Kafka broker 启动慢,RocketMQ Namesrv 启动快,
depends_on无法真正保障就绪)
推荐做法:双 compose 文件 + 共享桥接网络
创建两个目录,分别管理 Kafka 和 RocketMQ:
-
kafka-stack/:含docker-compose.yml(ZooKeeper + Kafka)和server.properties -
rocketmq-stack/:含docker-compose.yml(Namesrv + Broker + Console)和broker.conf
在两份文件中都声明同一个自定义网络(例如 message-net),让 Producer/Consumer 容器可跨栈访问:
使用 Python 脚本下载 Docker 镜像并打包为 tar 文件。用户说“下载镜像”“拉取镜像”“pull xxx”“帮我下载 nginx 镜像”等时触发。支持 SOCKS5 代理直连(推荐)和国内镜像站加速两种模式。
message-net:
driver: bridge
Kafka 部分关键配置要点
使用 wurstmeister/kafka:2.8.1 或官方 confluentinc/cp-kafka:7.4.0 镜像,必须显式设置:
-
KAFKA_ADVERTISED_LISTENERS:填宿主机真实 IP(非localhost或127.0.0.1),否则外部 Java 应用连不上 -
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:设为PLAINTEXT:PLAINTEXT(开发环境) - ZooKeeper 地址用容器名直连,如
zookeeper:2181,前提是二者同属message-net
RocketMQ 部分关键配置要点
推荐镜像:apache/rocketmq:5.3.2(当前稳定主力版)。Console 控制台建议用独立镜像 apache/rocketmq-dashboard:latest,而非旧版内嵌方式:
- Broker 的
brokerIP1必须设为宿主机真实 IP(不是docker0或172.x网段地址) - Namesrv 地址通过
environment: NAMESRV_ADDR=rmqnamesrv:9876注入,且depends_on仅控制启动顺序,不保证就绪 - Console 需通过
JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876指向 Namesrv 容器名
一键启动与验证流程
终端中依次执行:
cd kafka-stack && docker-compose up -dcd ../rocketmq-stack && docker-compose up -d
等待 30 秒后验证:
-
docker logs rmqnamesrv | grep success→ 确认 Namesrv 就绪 -
docker logs rmqbroker | grep "The broker boot success"→ 确认 Broker 就绪 -
docker logs kafka | grep "started (kafka.server.KafkaServer)"→ 确认 Kafka 启动完成 - 浏览器打开
http://localhost:8080(Console)和http://localhost:9000(Kafka UI,如启用)










