如何使用Python为运行在容器中的Kafka主题生成消息[duplicate]

00jrzges  于 2023-10-15  发布在  Apache
关注(0)|答案(1)|浏览(109)

此问题已在此处有答案

Connect to Kafka running in Docker(6个回答)
关闭27天前。
我在使用本地机器上的Python代码与运行在容器中的Kafka Broker通信时遇到问题。我有一个docker compose文件来设置一个Kafka集群。这是yaml文件。

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"

这是成功的。当我在代理容器中时,我使用kafka-topics --create --topic my-topic --partitions 3 --replication-factor 1 --if-not-exists --bootstrap-server kafka1:9092命令创建一个主题,并使用kafka-console-producer --bootstrap-server kafka1:9092 --topic my-topic命令创建一个生产者。我将使用kafka-console-consumer --bootstrap-server kafka1:9092 --topic my-topic命令进一步使用消费者生成的消息。一切正常;现在,我想做同样的过程,但与Python从我的本地机器。我想从我的本地机器发送一条消息到我的docker容器中现有的Kafka主题;但是,我似乎无法从本地计算机与容器进行正确通信。下面是我使用的代码:

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()

这是我面临的错误:kafka 1:9092/bootstrap:无法解析'kafka 1:9092':没有这样的主机是已知的。
有人能帮我吗?我如何以编程方式从本地机器向Docker容器中的现有主题发送消息?先谢谢你了。

f8rj6qna

f8rj6qna1#

Docker为每个容器创建隔离的网络命名空间。当为容器设置共享网络时,它们将处于同一网络中。Docker也有一个内部DNS。
您可以通过主机名连接到另一个正在运行的容器,因为Docker的DNS会将容器名称(它将其视为主机名)解析为IP地址。它们属于相同的网络环境,因此无需进一步操作即可建立连接。
相反,主机不在同一网络中。要跨越边界进入Docker容器,需要使用NAT和端口转发等机制。因此,您不会通过(主机)名称来寻址容器,而是通过Map到容器的外部端口在localhost上进行连接。

相关问题