Connect to Kafka running in Docker

前端 未结 3 1347
隐瞒了意图╮
隐瞒了意图╮ 2020-11-22 01:36

I setup a single node Kafka Docker container on my local machine like it is described in the Confluent documentation (steps 2-3).

In addition, I also exposed Zookeep

3条回答
  •  無奈伤痛
    2020-11-22 01:56

    Disclaimer

    tl;dr - At the end of the day, it's all the same Apache Kafka running in a container. You're just dependent on how it is configured. And which variables make it so.


    The following uses confluentinc docker images, not wurstmeister/kafka, although there is a similar configuration, I have not tried it. If using that image, read their Connectivity wiki.

    Nothing against the wurstmeister image, but it's community maintained, not built in an automated CI/CD release... Bitnami ones are similarly minimalistic and run in multiple cloud providers. For bitnami Kafka images, refer their README

    debezium/kafka docs on it are mentioned here. Note: advertised host and port settings are deprecated. Advertised listeners covers both

    spotify/kafka is deprecated and outdated. fast-data-dev is great for an all in one solution, but it is bloated

    For supplemental reading, a fully-functional docker-compose, and network diagrams, see this blog by @rmoff

    Answer

    The Confluent quickstart (Docker) document assumes all produce and consume requests will be within the Docker network.

    You could fix the problem by running your Kafka client code within its own container, but otherwise you'll need to add some more environment variables for exposing the container externally, while still having it work within the Docker network.

    First add a protocol mapping of PLAINTEXT_HOST:PLAINTEXT that will map the listener protocol to a Kafka protocol

    Key: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
    Value: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

    Then setup two advertised listeners on different ports. (kafka:9092 here refers to the docker container name). Notice the protocols match the right side values of the mappings above

    Key: KAFKA_ADVERTISED_LISTENERS
    Value: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

    When running the container, add -p 29092:29092 for the host port mapping

    tl;dr (with the above settings)

    When running any Kafka Client outside the Docker network (including CLI tools you might have installed locally), use localhost:29092 for bootstrap servers and localhost:2181 for Zookeeper

    If trying to connect from an external server, you'll need to advertise the external hostname/ip of the host as well/in place of localhost

    When running an app in the Docker network, use kafka:9092 for bootstrap servers and zookeeper:2181 for Zookeeper, just like any other Docker service communication

    See the example Compose file for the full Confluent stack

    Appendix

    For anyone interested in Kubernetes deployments: https://operatorhub.io/?keyword=Kafka

提交回复
热议问题