Skip to content

Instantly share code, notes, and snippets.

@satyajitnayk
Last active December 23, 2023 13:21
Show Gist options
  • Save satyajitnayk/ab4c9671cadd6a34057512adffdc302c to your computer and use it in GitHub Desktop.
Save satyajitnayk/ab4c9671cadd6a34057512adffdc302c to your computer and use it in GitHub Desktop.
Run Kafka using Docker

Create a file with name docker-compose.yml

version: "3.7"
services:
  zookeeper:
    restart: always
    image: docker.io/bitnami/zookeeper:3.8
    ports:
      - "2181:2181"
    volumes:
      - "zookeeper-volume:/bitnami"
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    restart: always
    image: docker.io/bitnami/kafka:3.3
    ports:
      - "9093:9093"
    volumes:
      - "kafka-volume:/bitnami"
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT
    depends_on:
      - zookeeper
volumes:
  kafka-volume:
  zookeeper-volume:

Command to run kafka inside docker

docker-compose build #run this first time only
docker-compose up

Create a file to test if kafka working locally - name the file check_kafka.js

const { Kafka } = require('kafkajs');

// Define your Kafka broker(s)
const kafkaBrokers = ['localhost:9093'];

// Create a Kafka instance
const kafka = new Kafka({
  clientId: 'kafka-test-client',
  brokers: kafkaBrokers,
});

// Create a Kafka producer
const producer = kafka.producer();

// Create a Kafka consumer
const consumer = kafka.consumer({ groupId: 'kafka-test-group' });

// Function to produce a test message
async function produceMessage() {
  await producer.connect();
  await producer.send({
    topic: 'test-topic',
    messages: [{ value: 'Hello, Kafka!' }],
  });
  await producer.disconnect();
}

// Function to consume messages
async function consumeMessages() {
  await consumer.connect();
  await consumer.subscribe({ topic: 'test-topic', fromBeginning: true });

  await consumer.run({
    eachMessage: async ({ message }) => {
      console.log(`Received message: ${message.value}`);
    },
  });

  // Uncomment the following line if you want to stop the consumer after a certain period
  // setTimeout(async () => await consumer.disconnect(), 5000);
}

// Run the test
async function runTest() {
  try {
    await produceMessage();
    await consumeMessages();
  } catch (error) {
    console.error('Error:', error);
  } finally {
    await producer.disconnect();
  }
}

// Run the test
runTest();

connnect with kafka container (to check if it's runnig)

# to find containers with name
docker ps --format '{{.Names}}'

docker exec -it setup-kafka-kafka-1 bin/bash #setup-kafka-kafka-1 is my kafka container name

# find kafka ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id_or_name>

# to check if kafka working in machine
node check_kafka.js

On running kafka using docker you will get output something like this image

If kafka working fine then you will get output something like this image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment