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

snz8szmq  于 2021-06-05  发布在  Kafka
关注(0)|答案(1)|浏览(564)

这个问题有太多的答案,我最终完全搞不清楚如何从外部客户机连接到kafka docker容器。
我用以下命令创建了两台docker机器,一台是manager,一台是worker:

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

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

fhity93d1#

既然你用的是 docker-machine 你要么
在容器中运行代码(使用 kafka:9092 )
在vm操作系统中运行代码(使用 vm-host-name:9094 )
添加 PLAINTEXT://localhost:9096 对于播发的侦听器,将9096从vm公开到主机,然后使用 localhost:9096 在代码中(注意:9096是一些随机端口)
要点是客户机必须能够连接到引导地址和正在返回的公告地址。如果无法连接到第二个,代码将超时。

相关问题