Kafka Docker 实战入门: 为什么 Kafka UI 无法连接?一步步指导支持 Docker 内外通信
适合初学者和小型项目解决 Kafka 和 UI 通信失败问题,配合 Spring Boot + Redpanda Console 开发环境。
一、问题叙述
在使用 Docker Compose 部署 Kafka + Kafka UI 后,常常会遇到:
- Spring Boot 连 Kafka OK,但 Kafka UI (如 Redpanda Console)无法连接
- 报错
localhost refused to connect
- 报错
dial tcp [::1]:9092: connect: connection refused
不是 Kafka 没跑起来,而是 Kafka UI 完全不知道如何连 Kafka,就像打电话的时候输入了一个错误的号码,怎么打都打不通。
二、根本原因:两个系统,看不到同一个 Kafka
客户端类型 | 通信方式 | 需要接入地址 |
---|---|---|
Spring Boot (IDE) | 通过 localhost 和本机网络接口 | localhost:9092 |
kafka-ui 容器 | 通过 Docker 内网 | kafka:29092 |
简单说:
- 容器里面不认识
localhost
是你本机的 Kafka,而是认为是它自己 - 所以 UI 容器需要通过 Kafka 的容器名
kafka
连接到 Kafka
三、正确配置要点
🔸 Kafka 启动时应告知两个 listener
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_HOST://kafka:29092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
用 localhost:9092 给 Spring Boot 连,用 kafka:29092 给 kafka-ui 连
🔸 kafka-ui 要连 kafka:29092
kafka-ui:
environment:
- KAFKA_BROKERS=kafka:29092
四、完整 docker-compose.yml
(省略 zookeeper / mongo 部分,重点是 kafka 和 kafka-ui)
kafka:
image: confluentinc/cp-kafka:7.5.0
container_name: kafka
ports:
- "9092:9092"
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_HOST://kafka:29092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
kafka-ui:
image: docker.io/redpandadata/console:latest
ports:
- "8081:8080"
environment:
- KAFKA_BROKERS=kafka:29092
- CONSOLE_AUTHENTICATION_ENABLED=false
depends_on:
- kafka
五、Spring Boot 配置: application.yml
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: audit-consumer-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring.json.trusted.packages: "*"
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
template: default-topic: audit-log-topic
仅对 Spring Boot 而言,Kafka 就是一个本地服务器
六、Spring Boot 示例代码(以审计日志为例)
✅ 消息模型
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AuditLogEvent {
private String action;
private String entity;
private String payload;
private LocalDateTime timestamp;
}
✅ 发送者 Producer
@Service
@RequiredArgsConstructor
public class KafkaProducerService {
private final KafkaTemplate<String, AuditLogEvent> kafkaTemplate;
public void sendLog(AuditLogEvent event) {
kafkaTemplate.send("audit-log-topic", event);
System.out.println("✅ Sent Kafka log: " + event);
}
}
✅ 消费者 Listener
@Component
public class KafkaConsumerService {
@KafkaListener(topics = "audit-log-topic", groupId = "audit-consumer-group")
public void listen(AuditLogEvent event) {
System.out.println("📥 Received Kafka log: " + event);
}
}
七、Kafka UI 配合验证
- 用 CLI 或 Java 发送消息
- 在 Kafka UI → audit-log-topic → Messages 可视化查看
- 验证 Spring Boot 消费者是否收到数据
八、关于安全协议说明
当前环境采用
PLAINTEXT
协议,原因是项目处于本地开发阶段,所有服务运行在同一台机器,无需身份认证和传输加密,可以大大简化配置。
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
🛡 当项目进入测试 / 生产部署阶段(如远程调用 Kafka、公网访问、SaaS 接入)时,应切换为更安全的协议,例如:
SSL
SASL_SSL
- 配合
kafka-acls
做访问权限管理
八、总结
系统设备 | 连 Kafka 地址 | 说明 |
---|---|---|
Spring Boot | localhost:9092 | 通过本机网络接口 |
kafka-ui (容器) | kafka:29092 | 通过容器网络 |
此配置已在实战 rapid-crud-generator 项目中进行验证,可立即处理 SpringBoot + Kafka 日志消息 + UI 可视化演示
如果你喜欢我的分享,欢迎收藏 / 点赞 / 评论!
🔗 项目源码地址
👉 本文中所用的示例代码与完整配置,已开源在 GitHub:
📦 🔗 GitHub - rapid-crud-generator 项目地址
欢迎 Star ⭐ / Fork 🍴 / Issue 💬!