Wurstmeister Kafka Docker Compose配置问题:Flask无法连接Broker
解决Docker Compose中Flask服务无法连接Wurstmeister Kafka的问题
你遇到的核心问题是Kafka的网络配置与Flask容器的访问逻辑不匹配,同时Flask代码里创建KafkaConsumer的方式也存在错误,以下是分步解决方案:
1. 修正Kafka的Docker Compose配置
你的KAFKA_ADVERTISED_LISTENERS设置成了宿主机的网桥地址172.17.0.1:9092,但在Docker Compose的内部网络(test-net)中,Flask容器应该通过服务名kafka来访问Kafka Broker,而不是宿主机地址。
修改后的Kafka配置如下:
kafka: image: wurstmeister/kafka ports: - "9092:9092" # 供本地Spring Boot应用外部访问 - "9093:9093" # 供Docker内部服务访问 environment: KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_INTERNAL://0.0.0.0:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:9093 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CREATE_TOPICS: "TEST:1:1" KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT volumes: - /var/run/docker.sock:/var/run/docker.sock depends_on: - zookeeper networks: - test-net
配置说明:
KAFKA_LISTENERS:让Kafka监听所有网卡的两个端口,分别对应外部(本地Spring Boot)和内部(Flask容器)访问场景KAFKA_ADVERTISED_LISTENERS:向ZooKeeper注册两个可访问地址:PLAINTEXT://localhost:9092:供宿主机上的Spring Boot应用连接PLAINTEXT_INTERNAL://kafka:9093:供Docker内部网络的Flask服务连接
- 如果不需要区分内外网,也可以简化配置:
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT://localhost:9092
2. 修正Flask的KafkaConsumer代码
你的代码存在两个关键问题:
- 多次创建
KafkaConsumer实例,但只有第一个被赋值给consumer,后续的配置参数(如auto_offset_reset、反序列化器)完全没有生效 - 反序列化器中存在拼写错误:
m.dedoce('utf-8')应该是m.decode('utf-8')
修正后的代码:
KafkaHost = "kafka:9093" # 对应Docker内部访问端口;如果用简化配置则改为9092 def initkafka(): # 将所有配置合并到一个KafkaConsumer实例中 consumer = KafkaConsumer( "TEST", group_id='view', bootstrap_servers=[KafkaHost], auto_offset_reset='latest', enable_auto_commit=False, value_deserializer=lambda m: json.loads(m.decode('utf-8')), consumer_timeout_ms=1000 ) return consumer
3. 验证与重启
- 停止并清理现有容器:
docker-compose down - 重新启动服务:
docker-compose up -d - 查看Kafka日志确认配置生效:
docker-compose logs kafka,你应该能看到类似Registered broker 0 at path /brokers/ids/0 with addresses: PLAINTEXT://kafka:9093,PLAINTEXT://localhost:9092的日志 - 启动Flask服务,检查是否还会抛出
NoBrokersAvailable异常
调整后,Flask容器就能通过Docker内部网络的服务名kafka正确连接到Kafka Broker,同时本地的Spring Boot应用也能通过localhost:9092正常发送消息。
内容的提问来源于stack exchange,提问作者FishingIsLife
相关产品推荐
相关产品推荐

