无法从外部客户端连接到kafka docker容器(wurstmeister图像)

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

这个问题的答案太多了,我最终对如何从外部客户端连接到Kafka docker容器感到困惑。

我已经使用以下命令创建了两个docker机器,一个管理器和一个工人:

docker-machine create manager
docker-machine create worker1

我已将这两个节点添加到docker群中。

docker@manager:~$ docker node ls                                                                                                                                                                             
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
6bmovp3hr0j2w5irmexvvjgzq *   manager             Ready               Active              Leader              19.03.5
mtgbd9bg8d6q0lk9ycw10bxos     worker1             Ready               Active                                  19.03.5

docker-compose.yml

version: '3.2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9094
        published: 9094
        protocol: tcp
        mode: host
    environment:
      HOSTNAME_COMMAND: "hostname | awk -F'-' '{print $$2}'"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://_{HOSTNAME_COMMAND}:9094
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9094
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

从docker内部,一切正常。我可以创建主题,然后生成/使用消息。

我创建了一个python脚本,以使用来自外部docker的消息。简单的代码如下所示:

from kafka import KafkaConsumer
import json

try:
    print('Welcome to parse engine')
    consumer = KafkaConsumer('streams-plaintext-input', bootstrap_servers='manager:9094')
    for message in consumer:
        print(message)
except Exception as e:
    print(e)
    # Logs the error appropriately. 
    pass

但是代码永远是堆栈。连接不正确。任何人都可以提供有关如何建立连接的帮助吗?

docker apache-kafka dockerfile docker-machine kafka-python
1个回答
0
投票

由于您使用的是docker-machine,因此您必须选择其中一个

  1. 也在容器中运行代码(使用kafka:9092
  2. 在VM OS中运行代码(使用vm-host-name:9094
  3. 向发布的侦听器添加PLAINTEXT://localhost:9096,将9096从VM暴露给主机,然后在代码中使用localhost:9096(注意:9096是一些随机端口)

要点是,客户端必须能够连接到引导地址返回的广告地址。如果无法连接到第二个,则代码将超时。

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