我的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
我有一个flask服务器在此运行,但它给了我NoBrokersAvaliable错误。即使我的Kafka和应用程序运行在同一个网络上,它们也无法相互通信。
我有另一个名为esp32_simulator的容器,它有一个像这样的docker-compose文件:
version: '3'
services:
esp32_simulator:
build: .
volumes:
- ./:/app
networks:
- mynetwork
networks:
mynetwork:
external:
name: bitirmetam_mynetwork
但是当我用kafka 1:9092运行这个应用程序时,它也显示NoBrokersAvaliable。我尝试了localhost和一切,但仍然给出错误。
2条答案
按热度按时间fykwrbwg1#
我看到的一个问题是,你暴露了9092后,这是内部配置,但你应该暴露端口9093。
当你连接到一个Kafka broker时,应用程序连接到一个kafka broker,broker在内部查看它应该使用哪个连接(在你的例子中是INTERNAL或EXTERNAL)。由于您通过9092连接,因此它将使用INTERNAL。
然后代理查看“AdvertisedListener”列表中的internal,并返回该值,即
但是如果你从Docker网络外部连接,这个URL就不起作用了。
同样,只需将暴露的端口从9092:9092更改为9093:9093,它就应该可以工作
6ju8rftf2#
在同一个网络上
但他们不是。您的flask应用未使用
mynetwork
在flask应用程序中使用localhost也不是Kafka代理的地址
同样不清楚你的Kafka客户端进程从哪里开始,因为你没有显示代码,但是Confluent容器需要大约20秒才能完全启动,而depends_on不会等待这个时间。在创建Kafka客户端之前,您需要在Python代码的某个地方添加显式的sleep/port check/retry-loop