我正在尝试使用Apache Kafka,即在虚拟机中与docker(wurstmeister/kafka-docker)连接的版本,并通过VM的主机系统连接到dockers中的kafka代理.
我将更详细地描述设置:
我的主机系统是在"通常"计算机上运行的Ubuntu 64位14.04.3 LTS(内核3.13).我有一个完整而复杂的各种码头集装箱相互作用的结构.为了不干扰或更好地说,要封装整个结构,不能直接在主机系统上运行docker镜像.另一个原因是需要在主机上使用不同的python库,这会干扰docker-compose所需的python-lib版本(用于启动不同的docker镜像).
因此,所需的解决方案应该是通过VirtualBox(来宾系统:Ubuntu 16.04.1 LTS)设置虚拟机,并在此VM中完全运行docker环境.这具有明显的优点,即VM本身可以完全根据docker结构的要求进行配置.
如上所述,其中一个docker镜像提供了用于通信和消息传递的kafka和zookeeper功能.这意味着.yaml文件设置运行此映像的容器,将kafka和zookeeper的所有必需端口转发到docker环境的主机系统(这是虚拟机VM的guest虚拟机系统).为了使docker环境在主机系统中可见,我通过VirtualBox中的网络设置转发了所有端口(网络 - >适配器NAT - >高级 - >端口转发).系统的行为如下:
当我运行docker-environment(包括kafka)时,我可以从VM-kafka连接,使用和生成,它使用推荐的标准kafka shell脚本(producer和consumer api).
当我在VM guest系统上运行Kafka和zookeeper服务器时,我可以从VM(主机)外部连接,生成和使用生产者和消费者api.
当我在docker环境中运行Kafka时,我可以从VM外部的主机系统连接,这意味着我可以看到所有主题,获取有关主题的信息,同时还可以看到来自docker中的kafka和zookeeper的一些调试输出.
遗憾的是,生成或消费来自主机系统到/来自docker-kafka的任何消息是不可能的.从生产者API我得到一个"批量过期"异常,消费者返回一个"ClosedChannelException".
我做了很多谷歌搜索,并找到了很多提示如何解决类似的问题.其中大多数引用kafka-server.properties中的advertised.host.name参数,该参数可通过.yaml中的KAFKA_ADVERTISED_HOST_NAME访问./sf/ask/17360801/例如,当上述两个错误发生时,指的是该参数.不幸的是,没有一个场景同时具有docker和VM功能.
更多尝试修改此参数根本没有影响.虽然我对docker 和 kafka 不太熟悉,但我可以在这里看到一个问题,因为kafka消费者和生产者将获得docker环境的本地IP,在NAT情况下为10.0.2.15,用作代理.但不幸的是,这个IP并不是来自VM之外的.因此,解决方案可能是更改的设置,其中应该使用VirtualBox网络中的桥接模式.这里奇怪的是,(当然)桥接连接导致了自己的虚拟机的IP通过DHCP,然后导致不可接近的泊坞窗,卡夫卡都从虚拟机和主机系统.这最后的行为对我来说似乎很尴尬.
总结我的问题是,如果有人对这个或类似场景有一些经验并且可以告诉我,如何配置docker-kafka,VirtualBox VM和主机系统.我已经为消费者和制作人电话尝试了很多不同的设置而没有成功.当然,也欢迎一些码头工人,卡夫卡或码头工人和卡夫卡专家回答.
如果您需要其他信息或者可以提供一些提示,请告诉我们.
提前致谢