You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 11:37:03