如何在docker中使用confluent / cp-kafka图像和localhost上的广告以及我的网络容器名称kafka?

时间:2018-04-30 23:39:43

标签: docker apache-kafka docker-compose

如何在docker中使用confluent / cp-kafka图像,并在localhost和我的网络容器名称kafka上进行曝光?

不要将其作为副本链接:

  1. Connect to docker kafka container from localhost and another docker container
  2. Cannot produce message to kafka from service running in docker
  3. 这些不能解决我的问题,因为他们使用的方法被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:90920.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图像正在消灭localhostkafka。将它们都设置为0.0.0.0,然后抛出一个错误,我将2个不同的端口设置为同一个IP ...

    也许我只是碰到一些固执的码头图像,应该寻找不同的图像...

1 个答案:

答案 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

将其他应用程序作为Docker网络的一部分运行

请记住,如果您在Mac上运行,建议的方法(根据Confluent文档)是在Docker Machine中运行这些容器,在VM中,您可以使用{在{0}正确管理外部端口映射{1}} Docker的旗帜。但是,使用上面的博客,它在VM外部的Mac上运行良好。