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

如何用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访问:

  1. 更新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"
  1. 重启Docker Compose集群:
docker-compose down && docker-compose up -d
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:35:32