同一Docker网络中应用无法连接Kafka,报NoBrokersAvailable错误求助
问题描述
在同一Docker网络中部署了Kafka、ZooKeeper、Cassandra及Flask应用,同时有一个esp32_simulator容器连接该外部网络,但Flask应用与esp32_simulator均无法连接Kafka,报错NoBrokersAvailable。尝试使用localhost等地址仍无法解决问题,相关docker-compose配置如下:
主服务docker-compose.yml
version: '3' services: kafka1: image: confluentinc/cp-kafka:7.3.2 volumes: - ./init-scripts/kafka:/docker-entrypoint-initdb.d ports: - "9092:9092" environment: KAFKA_ZOOKEEPER_CONNECT: zoo1:2181 KAFKA_LISTENERS: INTERNAL://:9092,EXTERNAL://:9093 KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka1:9092,EXTERNAL://localhost:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 depends_on: - zoo1 networks: - mynetwork zoo1: image: confluentinc/cp-zookeeper:7.3.2 ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 networks: - mynetwork cassandra: image: cassandra:latest volumes: - ./init-scripts/cassandra:/docker-entrypoint-initdb.d ports: - "9042:9042" flask-app: build: . volumes: - .:/app ports: - "5000:5000" depends_on: - kafka1 - cassandra networks: mynetwork: driver: bridge
esp32_simulator的docker-compose.yml
version: '3' services: esp32_simulator: build: . volumes: - ./:/app networks: - mynetwork networks: mynetwork: external: name: bitirmetam_mynetwork
解决办法
1. 修正主服务的网络配置
主docker-compose中的flask-app和cassandra未加入共享网络mynetwork,导致无法和Kafka容器互通。修改这两个服务的配置,添加networks字段:
cassandra: image: cassandra:latest volumes: - ./init-scripts/cassandra:/docker-entrypoint-initdb.d ports: - "9042:9042" networks: - mynetwork # 新增该行 flask-app: build: . volumes: - .:/app ports: - "5000:5000" depends_on: - kafka1 - cassandra networks: - mynetwork # 新增该行
2. 调整Kafka连接地址
Docker网络内的服务必须使用Kafka的内部通告地址kafka1:9092连接,不能用localhost(容器内的localhost指向自身,而非宿主机)。检查Flask应用和esp32_simulator的代码,确保生产者/消费者的bootstrap_servers配置为:
# Flask应用示例 from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers=['kafka1:9092'])
3. 验证网络连通性
进入容器测试是否能ping通Kafka服务:
# 测试Flask容器 docker exec -it <flask容器名称> ping kafka1 # 测试esp32_simulator容器 docker exec -it <esp32_simulator容器名称> ping kafka1
如果ping不通,检查容器是否在同一网络:
docker network inspect bitirmetam_mynetwork
确认输出中包含flask-app、esp32_simulator和kafka1容器。
4. 端口用途说明
- 容器间通信:使用
kafka1:9092(内部监听器) - 宿主机本地访问:使用
localhost:9093(外部监听器)
内容的提问来源于stack exchange,提问作者Berk Sunduri
相关产品推荐
相关产品推荐

