Kafka access inside and outside docker Kafka access inside and outside docker docker docker

Kafka access inside and outside docker


What I needed to do was to declare the LISTENERS as both binding to the docker host, and then advertise them differently - one to the docker network, one to the host:

services:  zookeeper:    image: confluentinc/cp-zookeeper    ports:      - "2181:2181"    environment:      ZOOKEEPER_CLIENT_PORT: 2181      ZOOKEEPER_TICK_TIME: 2000      ZOOKEEPER_SYNC_LIMIT: 2  kafka:    image: confluentinc/cp-kafka    ports:      - 9094:9094    depends_on:      - zookeeper    environment:      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181      KAFKA_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://kafka:9094      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://localhost:9094      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL


Your config of the listeners looks correct, the problem is with your Docker Compose:

ports:  - "9094:9092"

You’re mapping 9094 (‘Outside’) back to 9092 (‘Inside’) and thus when you connect you’re connecting to the ‘Inside’ listener. If you remove this line of config then your listener set up should work as intended.

For more info, see http://rmoff.net/2018/08/02/kafka-listeners-explained/


Agreed to the answer from @Robin Moffatt that outside port 9094 is mapped to container's 9092.

In addition to removing that configuration from docker-compose.yml, the outside port 9094 should be mapped to container's 9094.

ports:  - "9094:9094"

PS: I couldn't add this as a comment to previous answer, hence adding it as a new answer.