【问题标题】:Kafka docker compose external connectionKafka docker 撰写外部连接
【发布时间】:2020-04-16 05:15:27
【问题描述】:

我想将 9093 发布到 docker 容器之外。当我如下设置暴露给 9093 的 kafka-0 端口和 KAFKA_ADVERTISED_LISTENERS 时,我无法连接到 localhost:9093,如下面的 docker-compose 文件所示。

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.2.1
    container_name: kafka-0
    hostname: kafka-0
    ports:
      - "9093:9092"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=wise-nlp-zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.3.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

但是,当我更改为

ports:
 - "9092:9092"

- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9092

我能够连接到 kafka 代理 localhost:9092。

如何将外部端口更改为 9093 以供应用程序连接?我想设置多个经纪人。

【问题讨论】:

  • 你的 29094 端口来自哪里?

标签: apache-kafka docker-compose


【解决方案1】:

为什么现在不工作了?

广告侦听器(如KAFKA_ADVERTISED_LISTENERS 中定义)是代理在其初始连接中返回给客户端以供其在后续连接中使用的主机和端口

如果您希望外部客户端使用 9093,那么 KAFKA_ADVERTISED_LISTENERS=…PLAINTEXT_HOST://localhost:9093 是正确的。 然而,你还没有配置你的KAFKA_LISTENERS,如果你在启动时检查代理日志,它将默认为KAFKA_ADVERTISED_LISTENERS设置的值:

kafka-0      |  listeners = PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9093

因此,在这种状态下,代理正在侦听端口 9093,但使用此 Docker Compose 指令,您已将外部连接重定向到容器内 9093 到 9092 上的容器:

    ports: 
      - "9093:9092"
➜ docker ps
CONTAINER ID        IMAGE                             … PORTS                                        NAMES
8b934ef4145c        confluentinc/cp-kafka:5.4.1       … 0.0.0.0:9093->9092/tcp                       kafka-0

因此,您的外部连接将转到容器中的 9092 端口,并且代理未在此端口上侦听。您可以通过nc 验证这一点:

-- Port 9093 is open on the host machine
➜ nc -vz localhost 9093
Connection to localhost port 9093 [tcp/*] succeeded!

-- Port 9092 is _not_ open on the Kafka container
➜ docker exec -it kafka-0 nc -vz localhost 9092
localhost [127.0.0.1] 9092 (?) : Connection refused

❌您会看到客户端连接失败

➜ kafkacat -b localhost:9093 -L
% ERROR: Failed to acquire metadata: Local: Broker transport failure

如何解决?

您可以:

  1. 将侦听器更改为使用 Docker 端口重定向定位的端口。这会起作用,但我个人认为更令人困惑。
  2. 更改 Docker 端口重定向以定位侦听器所在的端口。这是我会使用的选项,因为它更清晰(例如,端口9093 始终使用,而不是将90929093 混合在一起)

选项 1:将侦听器更改为使用 Docker 端口重定向的目标端口

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.4.1
    container_name: kafka-0
    ports:
      - "9093:9092"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9092
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.4.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

✅测试:

➜ kafkacat -b localhost:9093 -L
Metadata for all topics (from broker 1: localhost:9093/1):
 1 brokers:
  broker 1 at localhost:9093 (controller)

选项 2:更改 Docker 端口重定向以针对侦听器所在的端口

version: '3'

services:
  kafka-0:
    image: confluentinc/cp-kafka:5.4.1
    container_name: kafka-0
    ports:
      - "9093:9093"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka-0:29094,PLAINTEXT_HOST://localhost:9093
      # If you don't specify KAFKA_LISTENERS it will default to the ports used in
      # KAFKA_ADVERTISED_LISTENERS, but IMO it's better to be explicit about these settings
      - KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:29094,PLAINTEXT_HOST://0.0.0.0:9093
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
    depends_on:
      - zookeeper

  zookeeper:
    image: confluentinc/cp-zookeeper:5.4.1
    container_name: zookeeper
    ports:
      - "2182:2181"
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181

✅测试

➜ kafkacat -b localhost:9093 -L
Metadata for all topics (from broker 1: localhost:9093/1):
 1 brokers:
  broker 1 at localhost:9093 (controller)

Docker 网络中连接到 Kafka

以上示例是关于从 Docker 主机 连接到 Kafka。如果您想从 Docker 网络中(例如另一个容器)连接到它,您需要使用 kafka-0:29094 作为代理主机和 IP。如果您尝试使用localhost:9093,那么客户端容器会将localhost 解析为它自己的容器,因此会失败。

多个经纪人

See here 示例 Docker Compose 与多个 Kafka 代理。

参考文献

https://rmoff.net/2018/08/02/kafka-listeners-explained/

【讨论】:

  • 但是,同样的问题,端口 29094 来自哪里? IMO,它是容器中使用的端口。
  • @Vincent 29094 只是用于侦听器端口之一的任意数字。
  • kafka-0的端口映射为“9093:9093”,所以在容器中,端口应该是9093。不是吗?
  • @Vincent 随时提出一个关于此的新问题 :)
猜你喜欢
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 2021-02-06
  • 2021-11-01
  • 1970-01-01
  • 2022-07-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多