Table of Contents
Overview
In order to start working with kafka, we need a cluster. The easiest way is to use docker. You can also download the binary files and run if you prefer. This is just one in many options
Docker-compose
networks: kafka-net: driver: bridge services: # -------------------------------------------------------------------------- # KAFKA BROKER (in KRaft mode) # -------------------------------------------------------------------------- kafka: # We use the Confluent Inc. image, which is popular and well-maintained. image: confluentinc/cp-kafka:latest container_name: kafka networks: - kafka-net ports: # Port for external connections to the Kafka broker from your host machine. - "9092:9092" environment: # --- KRaft settings --- # Specifies the roles of this node. In a single-node setup, it's both broker and controller. KAFKA_PROCESS_ROLES: 'broker,controller' # A unique ID for this node in the cluster. KAFKA_NODE_ID: 1 # Specifies the controller nodes. In a single-node cluster, it's just this node. # Format: <node_id>@<hostname>:<port> KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:9093' # A unique ID for the entire cluster. Generate one with: `docker run --rm confluentinc/cp-kafka kafka-storage random-uuid` KAFKA_CLUSTER_ID: 'MkU3OEV5T0T6a7eSgBNB2w' CLUSTER_ID: 'MkU3OEV5T0T6a7eSgBNB2w' # --- Listener settings --- # Defines how clients can connect. We define three listeners: # - INTERNAL: For communication between services within the Docker network. # - EXTERNAL: For communication from your host machine (e.g., your IDE). # - CONTROLLER: For KRaft's internal protocol. KAFKA_LISTENERS: 'INTERNAL://:29092,EXTERNAL://:9092,CONTROLLER://:9093' # Maps listener names to security protocols. KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT' # Specifies how clients (including other services) should connect to this broker. # This is what the broker "advertises" to the outside world. KAFKA_ADVERTISED_LISTENERS: 'INTERNAL://kafka:29092,EXTERNAL://localhost:9092' # The listener used for communication between brokers. Not critical for a single node, but good practice. KAFKA_INTER_BROKER_LISTENER_NAME: 'INTERNAL' # The listener used by the controller nodes. KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER' # --- General Kafka settings --- # Automatically create topics if they don't exist when a producer writes to them. Good for development. KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" # Kafka Connect needs to store its configuration, offsets, and status. These topics are for that. KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 # -------------------------------------------------------------------------- # KAFKA CONNECT # -------------------------------------------------------------------------- kafka-connect: image: confluentinc/cp-kafka-connect:latest container_name: kafka-connect networks: - kafka-net ports: # Port for the Kafka Connect REST API. - "8083:8083" depends_on: - kafka environment: # The address of the Kafka broker(s) for Connect to use. We use the internal listener. CONNECT_BOOTSTRAP_SERVERS: 'kafka:29092' # A unique ID for this Connect cluster. CONNECT_GROUP_ID: 'connect-cluster' # The topics where Connect will store its internal state. CONNECT_CONFIG_STORAGE_TOPIC: 'connect-configs' CONNECT_OFFSET_STORAGE_TOPIC: 'connect-offsets' CONNECT_STATUS_STORAGE_TOPIC: 'connect-status' # Replication factor for these internal topics. Must be 1 in a single-node setup. CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1 CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1 CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1 CONNECT_KEY_CONVERTER: 'org.apache.kafka.connect.json.JsonConverter' CONNECT_VALUE_CONVERTER: 'org.apache.kafka.connect.json.JsonConverter' CONNECT_INTERNAL_KEY_CONVERTER: 'org.apache.kafka.connect.json.JsonConverter' CONNECT_INTERNAL_VALUE_CONVERTER: 'org.apache.kafka.connect.json.JsonConverter' # The REST API listener for managing connectors. CONNECT_REST_ADVERTISED_HOST_NAME: 'kafka-connect' # Location where connector plugins are stored. CONNECT_PLUGIN_PATH: '/usr/share/java,/usr/share/confluent-hub-components' # -------------------------------------------------------------------------- # REDPANDA CONSOLE (Web UI) # -------------------------------------------------------------------------- redpanda-console: image: docker.redpanda.com/redpandadata/console:latest container_name: redpanda-console networks: - kafka-net ports: # Port to access the web UI from your browser. - "8080:8080" depends_on: - kafka - kafka-connect environment: # The address of the Kafka broker(s) for the console to connect to. KAFKA_BROKERS: "kafka:29092" # The address of the Kafka Connect cluster for the console to manage. KAFKA_CONNECT_ENABLED: "true" KAFKA_CONNECT_CLUSTERS_NAME: "connect-cluster" KAFKA_CONNECT_CLUSTERS_URL: "http://kafka-connect:8083"
Here I have a simple setup with some extra services (kafka-connect) and redpanda (for a nice UI).
Simply run docker-compose up
and you should have a cluster up and running (with one broker)

If you go to localhost:8080, you can see the cluster’s overview, thanks to redpanda


I build softwares that solve problems. I also love writing/documenting things I learn/want to learn.