Невозможно подключиться к контейнеру kafka docker со стороны клиента (образы wurstmeister) - PullRequest
0 голосов
/ 28 января 2020

На этот вопрос так много ответов, что я был совершенно сбит с толку из-за того, как я могу подключиться к контейнеру 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

Но код навсегда стековый. Соединение не правильное. Может ли кто-нибудь помочь с настройкой соединения?

1 Ответ

0 голосов
/ 28 января 2020

Поскольку вы используете docker-machine, вам необходимо либо

  1. Запустить свой код также в контейнере (используя kafka:9092)
  2. Запустить свой код в ОС VM ( используя vm-host-name:9094)
  3. Добавьте PLAINTEXT://localhost:9096 к объявленным слушателям, выставьте 9096 с виртуальной машины на свой хост, затем используйте localhost:9096 в своем коде (примечание: 9096 - это некоторый случайный порт)

Суть в том, что клиенты должны иметь возможность подключаться к bootstrap адресу и объявленному адресу, который возвращается. Если он не может подключиться ко второму, время истекает.

...