Docker容器内Spring Boot客户端无法连接Confluent Kafka Broker
问题根因
你通过docker run单独启动的Spring Boot应用容器,默认接入Docker默认bridge网络,与docker-compose启动的Kafka、ZooKeeper、Schema Registry所在的自定义compose网络完全隔离,容器内部无法解析broker主机名,因此无法建立连接。
你当前的Kafka监听器配置本身没有问题:
PLAINTEXT://broker:29092是为同Docker网络内的容器访问准备的监听器PLAINTEXT_HOST://localhost:9092是为宿主机本地进程访问准备的监听器
宿主机本地应用能正常连接,就是走了后面这个监听器链路。
修复步骤
- 先查询Kafka集群所在的Docker网络名
执行以下命令列出所有Docker网络,找到你的Kafka、zookeeper容器接入的网络,compose默认创建的网络名格式为[compose文件所在目录名]_default:docker network ls - 启动应用容器时接入该网络
调整你的容器启动命令,增加--network参数指定Kafka集群所在网络,示例如下:docker run -it --name event-consumer \ --network 替换为你查到的实际网络名 \ -p 9091:9091 \ event-consumer:1.0 - 修正Schema Registry访问地址
既然应用容器已经和Kafka集群在同一个Docker网络内,不需要通过host.docker.internal绕宿主机访问服务,直接用服务名访问即可,同时避免Linux环境下host.docker.internal默认不生效的问题。修改application.yaml对应配置:
你原配置中的spring: cloud: stream: binder: consumer-properties: schema.registry.url: http://schema-registry:8081 schemaRegistryClient: endpoint: http://schema-registry:8081spring.kafka.bootstrap-servers: broker:29092不需要修改,网络打通后即可正常解析。
验证方法
容器启动后可以先执行以下命令进入容器内部,测试到Broker和Schema Registry的网络连通性:
docker exec -it event-consumer sh # 测试Broker端口连通性 nc -zv broker 29092 # 测试Schema Registry连通性 nc -zv schema-registry 8081
两个地址都能连通的情况下,应用即可正常建立连接。
内容的提问来源于stack exchange,提问作者user1298426
相关产品推荐
相关产品推荐

