Kafka Docker 实战入门: 为什么 Kafka UI 无法连接?一步步指导支持 Docker 内外通信

115 阅读3分钟

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 Bootlocalhost:9092通过本机网络接口
kafka-ui (容器)kafka:29092通过容器网络

此配置已在实战 rapid-crud-generator 项目中进行验证,可立即处理 SpringBoot + Kafka 日志消息 + UI 可视化演示

如果你喜欢我的分享,欢迎收藏 / 点赞 / 评论!


🔗 项目源码地址

👉 本文中所用的示例代码与完整配置,已开源在 GitHub:

📦 🔗 GitHub - rapid-crud-generator 项目地址

欢迎 Star ⭐ / Fork 🍴 / Issue 💬!