如何将Docker中的Kafka暴露给外界?

1Z1*_*Z10 6 apache-kafka docker apache-zookeeper

必须从 Docker 化的 Spring-Boot 应用程序与 Kafka 进行通信,\n我能够工作的唯一选择就是对 Kafka 进行 Docker 化。

\n\n

这是我的docker-compose-yml

\n\n
version: \'3.5\'\nservices:\n  zookeeper:\n    image: wurstmeister/zookeeper\n    ports:\n      - "2181:2181"\n    networks:\n      - kafka-network\n  kafka:\n    image: wurstmeister/kafka\n    ports:\n      - "9092:9092"\n    networks:\n      - kafka-network\n    environment:\n      KAFKA_ADVERTISED_HOST_NAME: kafka\n      KAFKA_AUTO_CREATE_TOPICS_ENABLE: \'true\'\n      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181\n    depends_on:\n      - zookeeper\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\nnetworks:\n  kafka-network:\n    name: kafka-network\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样我就可以使用 url kafka:9092从kafka 网络上的另一个容器连接到 Kafka 代理

\n\n

如何使其也可以从本地主机和其他计算机上使用?

\n\n

更新\n我更新了我的 docker-compose,如下所示:

\n\n
version: \'3.5\'\nservices:\n  zookeeper:\n    image: wurstmeister/zookeeper\n    ports:\n      - "2181:2181"\n    networks:\n      - kafka-network\n  kafka:\n    image: wurstmeister/kafka\n    ports:\n      - "9092:9092"\n    networks:\n      - kafka-network\n    environment:\n      KAFKA_ADVERTISED_HOST_NAME: kafka\n      KAFKA_AUTO_CREATE_TOPICS_ENABLE: \'true\'\n      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181\n      KAFKA_LISTENERS: ${KAFKA_LISTENERS:-PLAINTEXT://:9092}\n      KAFKA_ADVERTISED_LISTENERS: ${KAFKA_ADVERTISED_LISTENERS:-PLAINTEXT://127.0.0.1:9092}\n    depends_on:\n      - zookeeper\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\nnetworks:\n  kafka-network:\n    name: kafka-network\n
Run Code Online (Sandbox Code Playgroud)\n\n

并创建了一个包含以下内容的 .env 文件:

\n\n
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://the.ip.of.machine:9092\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在我的 PC 上测试了它(没有 .env 文件),并且我能够使用来自本地主机的 kafkakat 与代理进行通信:

\n\n
$ docker ps\nCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                NAMES\n6844a16fa14f        wurstmeister/kafka       "start-kafka.sh"         5 seconds ago       Up 3 seconds        0.0.0.0:9092->9092/tcp                               kafka-compose_kafka_1_9573f71109c7\n15d62557f3bd        wurstmeister/zookeeper   "/bin/sh -c \'/usr/sb\xe2\x80\xa6"   6 seconds ago       Up 4 seconds        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-compose_zookeeper_1_61a19213cde7\n\n$ kafkacat -P -b localhost:9092 -t topic1\nNew test \n^C\n\n$ kafkacat -C -b localhost:9092 -t topic1\nNew test\n% Reached end of topic topic1 [0] at offset 1\n\n$ kafkacat  -b localhost:9092 -L\nMetadata for all topics (from broker -1: localhost:9092/bootstrap):\n 1 brokers:\n  broker 1001 at 127.0.0.1:9092\n 4 topics:\n ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是我无法在服务器上执行相同的操作,唯一的区别是 KAFKA_ADVERTISED_LISTENERS 的主机 IP。

\n\n

我看到的是它一直说领导者不可用

\n\n
# kafkacat  -b localhost:9092 -L\nMetadata for all topics (from broker -1: localhost:9092/bootstrap):\n 1 brokers:\n  broker 1002 at the.ip.of.machine:9092\n\n\n topic "__consumer_offsets" with 50 partitions:\n    partition 0, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n    partition 1, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n    partition 2, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n    partition 3, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n    partition 4, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n    partition 5, leader -1, replicas: 1001, isrs: , Broker: Leader not available\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不应该为KAFKA_ADVERTISED_LISTENERS设置服务器的 IP吗?

\n

Nis*_*yal 4

您必须进行设置LISTENERS才能environments将 Kafka 代理暴露给外部网络,如下所示:

KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://one.prod.com:9092
Run Code Online (Sandbox Code Playgroud)

这是示例:https
://github.com/wurstmeister/kafka-docker/blob/85821409d4d49a4edc7c5be83b68b71eceeab1bc/docker-compose-swarm.yml

您可以参考此处了解更多详细信息: https://github.com/wurstmeister/kafka-docker/wiki/Connectivity

  • 您可能会发现这也很有用:https://rmoff.net/2018/08/02/kafka-listeners-explained/ (2认同)