Apache Kafka Docker容器外连接踩坑一则

第一次接触 Kafka,想要写个 Demo 测试一下,就用 Docker 直接在本地部署了一个,测试的时候踩了个坑:默认配置下从容器外没法连接到容器内部。记录一下解决过程。

部署和配置

使用的是镜像是 bitnami/kafka:latest,运行容器的命令如下:

shellscript 复制代码
docker run -d --name kafka \
    --network kafka \
    -v kafka:/bitnami/kafka \
    -p 9092:9092 \
    -e TZ=Asia/Shanghai \
    -e ALLOW_PLAINTEXT_LISTENER=yes \
    -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true \
    bitnami/kafka:latest

同时我还用 provectuslabs/kafka-ui:latest 镜像部署了一个 Kafka UI 用来可视化管理,接入了 kafka 容器网络。

org.springframework.kafka:spring-kafka 集成到 Spring Boot 中,连接配置如下:

yaml 复制代码
spring:
  kafka:
    bootstrap-servers:
      - "localhost:9092"

运行和排错

在 kafka-ui 中确认连接成功后,我尝试在其中连接 Kafka 节点,连接成功。

然后 bootRun ------ 运行报错: 看到连接错误,我首先想到是不是 Kafka 本身没有拉起来,于是我在面板中尝试收发消息,全部成功了。

看到日志中的 UnknownHostException: ec79ba9450e3,于是我猜和容器有关系。已知 Docker 本身应该没什么问题,于是去 Docker Hub 上仔细阅读了一下 bitnami/kafka 镜像的 Overview,发现了: 我查了一下 Kafka 的文档,大概是:需要通过配置 advertised.listeners 来告知客户端需要连接的 Kafka 地址,否则客户端就会像我上面一样试图去连接 ec79ba9450e3:9092 这个地址,而 ec79ba9450e3 这个主机名在宿主机中当然是未知的主机名,所以就会导致连接异常。

解决方案

如上文中镜像 Overview 中所写的一样,添加如下的三条环境变量:

ruby 复制代码
KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT

然后暴露容器端口9094,将应用的 spring.kafka.bootstrap-servers 一项从 "localhost:9092" 改为 "localhost:9094" ,连接成功!

后记

由于我的应用本身实际上也是跑在容器里的,所以只需要像上面的 kafka-ui 一样和 Kafka 组到同一个 Docker 网络里就行了,以上配置实际上是不需要的,Docker 部署的情况下只有需要容器外连接 Kafka 才需要配置这些。


如果上文中有任何地方写的有问题的话欢迎指出,如果觉得有用的话还请点个赞!QwQ

相关推荐
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
天冬忘忧8 小时前
Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
大数据·分布式·kafka
工业甲酰苯胺10 小时前
Python脚本消费多个Kafka topic
开发语言·python·kafka
B站计算机毕业设计超人12 小时前
计算机毕业设计SparkStreaming+Kafka新能源汽车推荐系统 汽车数据分析可视化大屏 新能源汽车推荐系统 汽车爬虫 汽车大数据 机器学习
数据仓库·爬虫·python·数据分析·kafka·数据可视化·推荐算法
谷大羽13 小时前
Kafka Stream实战教程
spring boot·后端·中间件·kafka·stream
求积分不加C13 小时前
Kafka怎么发送JAVA对象并在消费者端解析出JAVA对象--示例
java·分布式·kafka·linq
GDDGHS_14 小时前
“Kafka面试攻略:核心问题与高效回答”
分布式·面试·kafka
宋发元15 小时前
Go语言使用 kafka-go 消费 Kafka 消息教程
golang·kafka·linq
꧁薄暮꧂15 小时前
kafka中的数据清理策略
数据库·分布式·kafka
hong16168815 小时前
大数据技术Kafka详解:消息队列(Messages Queue)
大数据·分布式·kafka