docker - 无法从外部客户端连接到 kafka docker 容器(wurstmeister 图像)
问题描述
这个问题有很多答案,以至于我最终对如何从外部客户端连接到 Kafka docker 容器感到完全困惑。
我用这些命令创建了两台 docker 机器,一个 manager 和一个 worker:
docker-machine create manager
docker-machine create worker1
我在 docker swarm 中添加了这两个节点。
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-machine
你必须要么
- 也在容器中运行您的代码(使用
kafka:9092
) - 在 VM 操作系统中运行您的代码(使用
vm-host-name:9094
) - 添加
PLAINTEXT://localhost:9096
到广告侦听器,将 9096 从 VM 公开到您的主机,然后localhost:9096
在您的代码中使用(注意:9096 是一些随机端口)
要点是客户端必须能够连接到引导地址和正在返回的广告地址。如果它无法连接到第二个,代码将超时。
推荐阅读
- python - 绘图纸格式不统一
- apache-spark - pyspark 从 spark 数据框列创建一个不同的列表并在 spark sql where 语句中使用
- c# - 程序世界生成器生成重叠的地砖 - Unity3D C#
- performance - 如何改进我的 LED 显示屏代码,使其实时反应
- javascript - 我如何使用 Livewire 和 CkEditor 4 传递数据?
- python - 使用列表中的数据更新 JSON 文件中的值
- c# - DataProtectorTokenProvider ValidateAsync 始终为 False
- c# - 当我尝试通过解决方案中的另一个项目访问数据时,为什么数据库无法在我的 .NET Web 应用程序项目中初始化?
- django - 带有条件 WHERE 的 Django3 ListView
- powershell - PowerShell Compare-Object 和 Export-Csv 导出错误数据