Kafka docker 撰写外部连接[重复]

问题描述 投票:0回答:1

我想将 9093 暴露到 docker 容器之外。当我将 kafka-0 端口设置为暴露给 9093 和 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代理本地主机:9092。

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

docker apache-kafka docker-compose
1个回答
20
投票

为什么目前无法使用?

通告的侦听器(如

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
如何解决它?

您可以:

    将侦听器更改为您通过 Docker 端口重定向定位的端口。这会起作用,但我个人认为更令人困惑。
  1. 更改 Docker 端口重定向以定位侦听器所在的端口。这是我会使用的选项,因为它更清晰(例如,始终使用端口
  2. 9093
    ,而不是将 
    9092
    9093
     混合在一起)
选项 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
解析为它自己的容器,从而失败。
多家经纪商

请参阅此处

,了解使用多个 Kafka 代理的 Docker Compose 示例。

© www.soinside.com 2019 - 2024. All rights reserved.