【问题标题】:Can't connect to kafka docker container from another docker container无法从另一个 docker 容器连接到 kafka docker 容器
【发布时间】:2020-01-30 23:36:30
【问题描述】:

我正在尝试从另一个 docker 容器连接到 kafka docker 容器。但它没有连接。

有用于 kafka 消息传递的容器列表

网络 kafka-docker_default 有两个容器 kafka-docker_zookeeper_1kafka-docker_kafka0_1

为了运行 kafka 和 zookeeper,我使用了 docker-compose 文件:

version: '2'
services:
  zookeeper:
    image: "confluentinc/cp-zookeeper:latest"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

# This has three listeners you can experiment with. 
# BOB for internal traffic on the Docker network
# FRED for traffic from the Docker-host machine (`localhost`)
# ALICE for traffic from outside, reaching the Docker host on the DNS name `never-gonna-give-you-up`
# Use 
  kafka0:
    image: "confluentinc/cp-kafka"
    ports:
      - '9092:9092'
      - '29094:29094'
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: LISTENER_BOB://kafka0:29092,LISTENER_FRED://kafka0:9092,LISTENER_ALICE://kafka0:29094
      KAFKA_ADVERTISED_LISTENERS: LISTENER_BOB://kafka0:29092,LISTENER_FRED://localhost:9092,LISTENER_ALICE://never-gonna-give-you-up:29094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_BOB:PLAINTEXT,LISTENER_FRED:PLAINTEXT,LISTENER_ALICE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_BOB
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

容器 dockercompose17138956372294708100_kafkatest.producer_1dockercompose17138956372294708100_kafkatest.consumer_1 用于生产和消费消息。 虽然容器 dockercompose17138956372294708100_kafkatest.producer_1 正在尝试使用 bootstrap.servers 参数(localhost:9092 或 never-gonna-give-you-up:29094)连接到 kafka 集群,但它显示错误

%7|1569945335.015|BROKERFAIL|rdkafka#producer-1| [thrd:never-gonna-give-you-up:29094/bootstrap]: never-gonna-give-you-up:29094/bootstrap: failed: err: Local: Host resolution failure: (errno: Bad address)
%3|1569945335.015|FAIL|rdkafka#producer-1| [thrd:never-gonna-give-you-up:29094/bootstrap]: never-gonna-give-you-up:29094/bootstrap: Failed to resolve 'never-gonna-give-you-up:29094': Name or service not known (after 1656ms in state CONNECT)
%3|1569945335.015|ERROR|rdkafka#producer-1| [thrd:never-gonna-give-you-up:29094/bootstrap]: never-gonna-give-you-up:29094/bootstrap: Failed to resolve 'never-gonna-give-you-up:29094': Name or service not known (after 1656ms in state CONNECT)
%7|1569945335.015|STATE|rdkafka#producer-1| [thrd:never-gonna-give-you-up:29094/bootstrap]: never-gonna-give-you-up:29094/bootstrap: Broker changed state CONNECT -> DOWN
%3|1569945335.015|ERROR|rdkafka#producer-1| [thrd:never-gonna-give-you-up:29094/bootstrap]: 1/1 brokers are down

我该如何解决?

【问题讨论】:

    标签: docker apache-kafka apache-zookeeper


    【解决方案1】:

    请试试这个配置:

    version: '3'
    services:
      zookeeper:
        image: confluentinc/cp-zookeeper:latest
        ports:
          - "32181:32181"
        environment:
          ZOOKEEPER_CLIENT_PORT: 32181
          ZOOKEEPER_TICK_TIME: 2000
    
      kafka0:
        image: confluentinc/cp-kafka:latest
        ports:
         - "9090:9090"
        depends_on:
          - zookeeper
        environment:
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:32181
          KAFKA_ADVERTISED_LISTENERS: LISTENER_INTERNAL://kafka0:29090,LISTENER_EXTERNAL://localhost:9090
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_INTERNAL:PLAINTEXT,LISTENER_EXTERNAL:PLAINTEXT
          KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_INTERNAL
          KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
    

    使用此配置,如果您从主机连接到代理的容器,则使用 IP localhost:9090。如果您从具有相同网络的其他容器连接,则使用kafka0:29090

    【讨论】:

    • 如果我将使用 IP localhost:9090 从另一个没有相同网络的容器连接,它将无法连接到 Kafka。我该如何解决?
    • @Master 这个答案说如果你使用另一个容器,你会使用kafka0:29090,而不是本地主机
    • 仅当 docker 网络对于容器使用 kafka0:29090 相同时。我问在 docker 网络之外、来自另一个 docker 网络或来自另一个服务器的容器连接的主机是什么?
    • @MasterMedia 对于外部服务,逻辑是一样的。您可以创建新的广告侦听器,然后指向服务可以连接到的 Kafka 地址。例如:localhost:9090 变为 10.0.12.20:9090。这在很大程度上取决于您的 Kafka 所在的外部网络。
    【解决方案2】:

    dockercompose17138956372294708100_kafkatest.producer_1 正在尝试使用bootstrap.servers 参数(localhost:9092never-gonna-give-you-up:29094)连接到 kafka 集群

    来自另一个 Docker 容器,这些都不正确。

    1. never-gonna-give-you-up 在 Docker 配置中不作为主机名/DNS 记录存在于任何地方。根据错误,您的外部 DNS 服务器也不知道那是什么

    2. localhost 指的是 Kafka 客户端容器,而不是您的主机或代理容器。

    根据您的撰写配置,您需要连接到 kafka0 主机/服务,该主机/服务在端口 29092 上为bootstrap.servers 通告

    # BOB for internal traffic on the Docker network
    KAFKA_ADVERTISED_LISTENERS: LISTENER_BOB://kafka0:29092
    

    您还应该删除 LISTENER_ALICE,因为它没有提供任何有用的连接详细信息,除非您的主机的外部主机名实际上是 never-gonna-give-you-up

    并且您需要将您的生产者和消费者作为您的撰写文件的一部分

    【讨论】:

    • 如何正确设置Kafka的内部和外部连接?
    • 内部是什么意思?您已经为此设置了两个侦听器,看起来您并没有尝试从代理容器内部运行代码...对于外部,您可以运行 hostname -f,复制该输出,然后替换您的“永远不会放弃你”字符串与你的实际主机名。从 Docker 主机和使用 DNS 的外部机器,它们将使用公布的主机名进行通信(如果您使用外部主机名,则不需要 localhost 侦听器)
    • @cricker_007 内部表示容器连接到同一 docker 网络内的 Kafka 代理。外部意味着容器连接到 Docker 网络之外的 Kafka 代理。问题是来自另一个网络的容器无法连接到 Kafka 代理。我设置了'KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://host:9092',其中是'hostname'命令的'host'值。问题是为什么?
    • 生产者容器是否应该与kafka代理容器具有相同的网络?
    • 生产者和消费者应该在同一个网络上,是的。如果您没有在其他容器中运行 kafka 客户端,则应该仅连接到主机名地址
    猜你喜欢
    • 2020-02-09
    • 2019-09-04
    • 2022-01-04
    • 2016-01-29
    • 2019-02-24
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 2019-10-23
    相关资源
    最近更新 更多