docker和VirtualBox VM中的Apache Kafka

我试图在虚拟机中使用Apache Kafka,即一个可用于docker(wurstmeister / kafka-docker)的版本,并通过VM的主机系统连接到Docker中的kafka代理。

我将更详细地描述设置:

我的主机系统是运行在“普通”计算机上的Ubuntu 64位14.04.3 LTS(内核3.13)。 我有一个完整和复杂的各种docker集装箱相互作用的结构。 为了不打扰,或者更好的说,封装这个整个结构,不能直接在主机系统上运行docker镜像。 另一个原因是主机上需要不同的python库,这会干扰docker-compose(用于启动不同的docker镜像)所需的python-lib版本。

因此,所需的解决scheme应该是通过VirtualBox(来宾系统:Ubuntu 16.04.1 LTS)build立一个虚拟机,并完全运行该VM中的docker环境。 这具有明显的优点,即VM本身可以根据docker结构的要求精确configuration。

如上所述,其中一个docker镜像提供了kafka和zookeeperfunction,可用于通信和消息传递。 这意味着.yaml文件设置了一个运行这个映像的容器,将kafka和zookeeper的所有必要的端口转发到docker环境的主机系统(这是虚拟机VM的guest虚拟机系统)。 为了使Docker环境在主机系统中可见,我通过VirtualBox的networking设置(networking – >适配器NAT – >高级 – >端口转发)转发所有端口。 系统的行为如下:

当我运行docker-environment(包括kafka)时,我可以使用推荐的标准kafka shell脚本(producer&consumer api)来连接,使用和生成VM-kafka。

当我在VM guest系统上运行一个Kafka和zookeeper服务器时,我可以从VM(主机)之外进行连接,在生产者和消费者api上生成和使用。

当我在Docker环境中运行Kafka时,我可以从VM之外的主机系统连接,这意味着我可以看到所有主题,获取有关主题的信息,同时还可以在Docker中看到来自kafka和zookeeper的一些debugging输出。

不幸的是,不可能产生或使用来自主机系统的任何信息到/从docker卡夫卡。 从生产者API我得到一个“批次过期”exception,消费者返回一个“ClosedChannelException”。

我做了大量的search,发现了很多提示如何解决类似的问题。 其中大部分引用kafka-server.properties中的advertised.host.name参数,可通过.yaml中的KAFKA_ADVERTISED_HOST_NAME进行访问。 例如,如果发生上述错误,则引用该参数。 不幸的是,这些场景都不具备docker和VMfunction。

进一步试图修改这个参数根本没有任何影响。 尽pipe我对docker kafka不是很熟悉,但是在这里我可以看到一个问题,因为kafka消费者和生产者会获得docker环境的本地IP(在NAT中是10.0.2.15)作为代理。 但不幸的是,这个IP不是从虚拟机外部可见的。 因此,解决scheme可能是一个改变的设置,在VirtualBoxnetworking中应该使用桥接模式。 奇怪的是,桥接连接(当然)通过DHCP导致VM自己的IP,这导致VM 主机系统无法访问docker-kafka。 这最后一个行为似乎对我来说很尴尬。

总结我的问题是,如果有人有这种或类似的情况的一些经验,并可以告诉我,如何configurationdocker卡夫卡,VirtualBox虚拟机和主机系统。 我真的尝试了很多不同的设置,消费者和生产者调用没有成功。 当然,一些docker工人,卡夫卡人或者docker工人和卡夫卡专家也都欢迎回答。

如果您需要更多信息,或者您可以提供一些提示,请让我知道。

提前致谢