【问题标题】:Cannot connect to kafka from ourside of its docker container [duplicate]无法从其 docker 容器外部连接到 kafka [重复]
【发布时间】:2021-10-28 16:34:42
【问题描述】:

这是我的 docker compose 文件:

version: "3.7"

services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    container_name: zookeeper
    ports: 
      - 2181:2181
    env_file: 
      - zookeeper.env
  
  kafka:
    image: 'bitnami/kafka:latest'
    container_name: kafka
    env_file:
      - kafka.env
    ports: 
      - 9093:9092
    depends_on:
      - zookeeper

这些也是我的.env 文件:

kakfa.env

KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
KAFKA_CFG_LISTENERS=INTERNAL://kafka:9092,EXTERNAL://localhost:9093
KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka:9092,EXTERNAL://localhost:9093
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=1
ALLOW_PLAINTEXT_LISTENER=yes

zookeeper.env

ZOOKEEPER_CLIENT_PORT=2181
ZOOKEEPER_TICK_TIME=2000
ALLOW_ANONYMOUS_LOGIN=yes

当我创建 compose 文件时,一切似乎都很好,并且我在 docker 容器之外,在我的本地主机上,到 9093 端口有良好的 telnet 结果表单。

我写了一个简单的生产者python文件如下:

import logging

from kafka import KafkaProducer

logging.basicConfig(level=logging.INFO)


class Producer():
    def __init__(self) -> None:
        self.conn = KafkaProducer(bootstrap_servers="localhost:9093")

    def produce(self):
        while True:
            try:
                self.conn.send("test", b'test')
            except KeyboardInterrupt:
                logging.info("Producer finished")
                break


if __name__ == "__main__":
    producer = Producer()
    producer.produce()

当我运行我的代码时,我得到了这个错误:

WARNING:kafka.conn:DNS lookup failed for kafka:9092, exception was [Errno -3] Temporary failure in name resolution. Is your advertised.listeners (called advertised.host.name before Kafka 9) correct and resolvable?
ERROR:kafka.conn:DNS lookup failed for kafka:9092 (AddressFamily.AF_UNSPEC)

我还阅读了this 的帖子,但我无法解决我的错误,我不知道应该怎么做才能摆脱这个错误。

【问题讨论】:

    标签: python docker apache-kafka kafka-producer-api


    【解决方案1】:

    你转发了错误的端口

    主机上的9093需要映射到localhost:9093通告的端口

    否则,您将连接到 9093,它会返回 kafka:9092,如博客中所述。默认情况下,主机无法解析容器主机名

    【讨论】:

    • 我可以通过将KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka:9092,EXTERNAL://localhost:9093 设置为KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka:9092,EXTERNAL://0.0.0.0:9093 来解决问题
    • 0.0.0.0 不是可解析的地址。除了端口映射,您无需更改任何内容
    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2020-06-12
    • 2022-01-12
    相关资源
    最近更新 更多