如何用Python向容器内运行的Kafka Topic发送消息?
问题描述
本地Python代码连接Docker容器内的Kafka Broker时失败,报错:
kafka1:9092/bootstrap: Failed to resolve 'kafka1:9092': No such host is known
所用Docker Compose配置如下:
version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:7.0.0 environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 kafka1: image: confluentinc/cp-kafka:7.0.0 depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_LISTENERS: PLAINTEXT://:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
本地Python生产者代码:
from confluent_kafka import Producer # Producer configuration producer_config = { 'bootstrap.servers': 'kafka1:9092', } # Create a Kafka producer producer = Producer(producer_config) # Produce a message to a Kafka topic producer.produce('my-topic', key='key', value='Hello, Kafka!') # Wait for any outstanding messages to be delivered and delivery reports to be received producer.flush()
问题原因
kafka1是Docker Compose内部网络的服务名称,仅在容器集群内部可解析,本地主机的DNS无法识别这个名称,因此无法建立连接。
解决方案
方法一:配置Kafka双监听器(推荐)
修改Docker Compose中Kafka的配置,添加一个面向外部主机的监听器,让本地Python代码可以通过localhost访问:
- 更新
docker-compose.yml的kafka1服务配置:
kafka1: image: confluentinc/cp-kafka:7.0.0 depends_on: - zookeeper ports: - "9092:9092" - "29092:29092" # 新增外部访问端口映射 environment: KAFKA_BROKER_ID: 1 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092 # 双监听器 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://localhost:29092 # 分别声明内部和外部访问地址 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT # 映射监听器和协议 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
- 重启Docker Compose集群:
docker-compose down && docker-compose up -d
- 修改Python代码的
bootstrap.servers为本地端口:
producer_config = { 'bootstrap.servers': 'localhost:29092', }
这样配置后,容器内部服务可以通过kafka1:9092访问Kafka,本地主机则通过localhost:29092访问,互不冲突。
方法二:修改本地hosts文件(临时测试用)
在本地主机的hosts文件中添加映射,让kafka1指向本地回环地址:
- Windows:编辑
C:\Windows\System32\drivers\etc\hosts,添加一行:127.0.0.1 kafka1 - Linux/macOS:编辑
/etc/hosts,添加同样内容。
修改后无需调整Python代码,直接运行即可连接。但这种方法仅适合单节点测试场景,多节点集群时扩展性较差。
内容的提问来源于stack exchange,提问作者Moein
相关产品推荐
相关产品推荐

