如何在docker中使用confluent / cp-kafka图像,并在localhost和我的网络容器名称kafka上进行曝光?
不要将其作为副本链接:
这些不能解决我的问题,因为他们使用的方法被confluent / cp-kafka折旧,我想在localhost和docker网络上连接。
在confluent / cp-kafka的configure脚本中,他们执行了这个烦人的任务:
# By default, LISTENERS is derived from ADVERTISED_LISTENERS by replacing
# hosts with 0.0.0.0. This is good default as it ensures that the broker
# process listens on all ports.
if [[ -z "${KAFKA_LISTENERS-}" ]]
then
export KAFKA_LISTENERS
KAFKA_LISTENERS=$(cub listeners "$KAFKA_ADVERTISED_LISTENERS")
fi
它始终将我给KAFKA_ADVERTISED_LISTENERS的任何内容设置为0.0.0.0!使用docker网络,执行
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9093,PLAINTEXT://kafka:9093
我希望听众可以是localhost:9092
或0.0.0.0:9092
以及一些docker ip PLAINTEXT://172.17.0.1:9093
(无论kafka解析到docker网络上)
目前,我只能使用其中一种工作。所以使用localhost,它只适用于主机系统,没有docker容器可以访问它。使用kafka,它只能在docker网络中运行,没有主机应用程序可以访问它。我想让它与两者合作。我正在使用docker compose,以便我可以启动zookeeper,kafka,redis和我的应用程序。我有其他应用程序将在没有docker的情况下启动。
更新
因此,当我设置PLAINTEXT://localhost:9092
时,我可以在docker之外访问kafka运行的docker。
当我设置PLAINTEXT://kafka:9092
时,我无法在docker之外访问kafka运行的docker。
这是预期的,但这样做:PLAINTEXT://localhost:9092,PLAINTEXT://kafka:9093
我希望在docker内部和外部访问kafka运行的docker。汇合/ cp-kafka图像正在消灭localhost
和kafka
。将它们都设置为0.0.0.0
,然后抛出一个错误,我将2个不同的端口设置为同一个IP ...
也许我只是碰到一些固执的码头图像,应该寻找不同的图像...
答案 0 :(得分:1)
也许我只是碰到一些固定的码头图像,应该寻找不同的图像......
图像很好。您可能需要阅读this explanation of the listeners。
tl; dr - 您不希望(并且不应该?)在不同的网络中使用相同的侦听器“协议”。
使用advertised.listeners
,无需修改listeners
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092
当在容器内部加载PLAINTEXT://localhost:9093
时,您需要为9093添加端口映射,这应该是自解释的,并且您连接到localhost:9093
它应该可以工作。
然后,如果您还有PLAINTEXT://kafka:9092
,那么它只能在Docker Compose网络覆盖中工作,而不能在DNS服务器外部工作,因为这就是Docker网络的工作原理。您应该能够使用--network
标记或link containers using Docker Compose
请记住,如果您在Mac上运行,建议的方法(根据Confluent文档)是在Docker Machine中运行这些容器,在VM中,您可以使用{在{0}正确管理外部端口映射{1}} Docker的旗帜。但是,使用上面的博客,它在VM外部的Mac上运行良好。