Ga naar hoofdinhoud

Kafka Docker uitgelegd: Setup, best practices en tips

Leer hoe je Apache Kafka met Docker en Compose opzet. Ontdek best practices, veelvoorkomende valkuilen en tips voor ontwikkel- en testomgevingen
· 9 min lezen

Verken met AI

In de wereld van moderne datapijplijnen en microservices is Apache Kafka dé oplossing voor het verwerken van realtime eventstreams en het integreren van gedistribueerde systemen. Nu steeds meer engineeringteams overstappen op schaalbare, event-gedreven architecturen, wordt Kafka centraal voor betrouwbare datastromen. 

Parallel aan die trend is Docker uitgegroeid tot de voorkeursmethode voor ontwikkelaars om complexe services te beheren, delen en deployen, zonder zorgen over inconsistente omgevingen of lokale issues. 

Door Kafka met Docker te draaien, kunnen teams snel productieachtige clusters opzetten voor testen, proof-of-concept-demo’s of zelfs productie-workloads. 

Dit artikel is bedoeld voor intermediate backend-ontwikkelaars, DevOps-engineers en iedereen die betrokken is bij het beheren van dataplatformen en Kafka eenvoudig en reproduceerbaar wil maken.

Ben je nieuw met Kafka of Docker? Bekijk dan zeker onze Introduction to Apache Kafka-cursus of Docker for Beginners: A Practical Guide to Containers.

Wat is Kafka, en waarom Docker gebruiken?

Apache Kafka is een gedistribueerd streamingplatform, ontworpen voor messaging met hoge doorvoer, fouttolerantie en schaalbaarheid. 

Het fungeert als een duurzame, snelle pijplijn tussen dataproducenten en -consumenten. Wanneer je microservices moet verbinden, datastromen moet orkestreren of realtime analytics wilt verwerken, is Kafka vaak de tool bij uitstek.

Je kunt leren hoe je realtime dataverwerkingsapplicaties bouwt met Kafka Streams in onze Kafka Streams-tutorial. De tutorial behandelt kernconcepten, implementaties in Java & Python en stapsgewijze voorbeelden voor het bouwen van schaalbare streamingapplicaties.

Kafka draaien kan complex zijn. Zelfs ervaren engineers vinden de complexiteit van brokers, topics, partitions en vereiste componenten zoals Zookeeper of KRaft frustrerend. 

Docker vereenvoudigt dit door binaries, dependencies en configuraties in containers te verpakken. 

Met Docker kunnen engineers op elke machine een Kafka-cluster starten, identieke setups delen met collega’s en de bekende “het werkt op mijn machine”-hoofdpijn vermijden. Gedockeriseerde Kafka is vooral populair voor:

  • Lokale ontwikkeling en testen, waar snel op- en afschalen goud waard is
  • Geïsoleerde integratie-omgevingen in CI/CD-pijplijnen
  • Het nabootsen van multi-broker-clusters op één host
  • Training- en demosetups

Ontdek Apache Kafka met onze gids Apache Kafka for Beginners. Leer de basis, ga aan de slag en ontdek geavanceerde features en real-world toepassingen van dit krachtige event-streamingplatform.

Basisprincipes van Kafka in Docker

Voordat je in orkestratie duikt, helpt het om zowel de technische onderdelen van Kafka op te splitsen als te begrijpen hoe Docker de gedistribueerde aard op een laptop of server nabootst. 

Zoals je leert in onze tutorial Learn Docker from Scratch, is Docker een populair hulpmiddel om de deployment, schaalbaarheid en het beheer van toepassingen zoals Kafka te vereenvoudigen met containerisatie.

Kafka-architectuur: de basis

De ruggengraat van Kafka is de broker: een serverproces dat berichten opslaat, ontvangt en serveert. Elk cluster kan uit meerdere brokers bestaan, die data en load verdelen. 

Binnen elke broker bevinden zich topics (benoemde kanalen om berichten te organiseren) en partitions (subkanalen die events over meerdere servers spreiden voor parallelisatie en duurzaamheid). Producers schrijven data naar topics, terwijl consumers zich abonneren op en die berichten verwerken.

Coördinatie is cruciaal. Traditioneel vertrouwt Kafka op Zookeeper voor brokermetadata, partition leadership en de algehele clustergezondheid. Nieuwere deployments kunnen KRaft-modus gebruiken, waarbij deze coördinatie in Kafka zelf is geïntegreerd en de Zookeeper-afhankelijkheid vervalt. ZooKeeper werd gedeprcated in 3.5 en staat gepland voor verwijdering in 4.0.

Leer hoe je machinelearning-applicaties containeriseert met Docker en Kubernetes met onze tutorial How to Containerize an Application Using Docker. 

KRaft-modus: de architectuur van Kafka vereenvoudigen

Vanaf versie 2.8 introduceerde Kafka de KRaft-modus, waarmee het metadata intern beheert zonder Zookeeper, en die in versie 3.3 production-ready werd verklaard. Deze verschuiving vereenvoudigt deployments en vermindert het aantal te beheren componenten.

Zo zet je Kafka in KRaft-modus op met Docker Compose:

version: '3.8'
services:
  kafka:
    image: apache/kafka:latest
    container_name: kafka
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      CLUSTER_ID: "Mk3OEYBSD34fcwNTJENDM2Qk"
    volumes:
      - ./data:/var/lib/kafka/data

Deze configuratie zet een single-node Kafka-cluster op in KRaft-modus, waardoor Zookeeper niet nodig is.

Docker-essentials

Om Kafka met Docker te draaien, heb je slechts een paar basics nodig: Docker Engine (de runtime) en vaak Docker Compose voor beheer van meerdere containers. 

Met Compose-bestanden kun je meerdere services (Kafka, Zookeeper, Kafka UI, enz.) specificeren, met hun netwerken, omgevingsvariabelen en eventuele opslagmounts. Het netwerk van Docker maakt het mogelijk om multi-broker-clusters te emuleren, zelfs op één machine, door elke broker zijn eigen container, hostnamen en poorten te geven.

Een van de beste manieren om vertrouwd te raken met Docker is via projecten. Oefen met deze 10 Docker-projectideeën. 

Kafka opzetten met Docker Compose

Docker Compose is vaak de voorkeursmethode om applicaties te draaien die meerdere samenwerkende containers vereisen. In plaats van te jongleren met shellscripts of handmatige commands, kun je met Compose alle services en hun koppelingen definiëren in één YAML-bestand. 

Deze aanpak vermindert configuratiedrift, versnelt onboarding en garandeert dat iedereen dezelfde stack kan gebruiken voor development.

Minimale Compose-setup

Hier is een basis-docker-compose.yml die Kafka en Zookeeper start voor lokale ontwikkeling:

version: '3'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    ports:
      - "2181:2181"
  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    ports:
      - "9092:9092"
    volumes:
      - kafka_data:/var/lib/kafka/data
volumes:
  kafka_data:

Deze minimale setup mappt de relevante poorten, koppelt Kafka aan Zookeeper en mount een Docker-volume zodat berichten niet verdwijnen als de containers herstarten. Gebruik omgevingsvariabelen om de brokeridentiteit, listener-adressen en verbindingseindpunten tussen services te configureren.

Een grondig begrip van Kafka is essentieel om een data-engineeringinterview te rocken. Bereid je voor op je volgende data-engineeringinterview met onze uitgebreide lijst met Kafka-vragen en -antwoorden via deze 20 Kafka Interview Questions for Data Engineers. 

Uitgebreide configuratie

Professionele setups voegen vaak tools toe zoals Kafka UI, Schema Registry of REST Proxy voor eenvoudiger beheer en inspectie van berichten. Deze kun je toevoegen aan het services-blok in je compose-bestand. Bijvoorbeeld:

kafka-ui:
  image: provectuslabs/kafka-ui:latest
  ports:
    - "8080:8080"
  environment:
    KAFKA_CLUSTERS_0_NAME: "Local"
    KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"

Het persistent opslaan van Kafka-topics en logs over herstarts heen is essentieel voor het testen van herstelscenario’s of langdurige jobs. Mount altijd Docker-volumes naar /var/lib/kafka/data voor elke broker en /var/lib/zookeeper voor Zookeeper, indien gebruikt.

De juiste image kiezen is cruciaal. Hier is een korte samenvatting:

Kafka Docker-image

Maintainer

Features

Beste usecase

Confluent

Confluent

Volledig pakket, veel add-ons

Productieachtige setups, geavanceerd testen

Bitnami

Bitnami

Schoon, minimaal

Lokale ontwikkeling, omgevingen met beperkte resources

Apache Kafka (KRaft)

Apache

Zonder Zookeeper, vereenvoudigde setup

Moderne deployments, vereenvoudigde architectuur

De How to Learn Apache Kafka in 2025-tutorial gaat dieper in op Kafka, waaronder 

  • Waarom is Apache Kafka populair?
  • Belangrijkste features van Apache Kafka
  • Verschillende toepassingen van Apache Kafka

Interactie met Kafka in Docker

Zodra Kafka draait via Docker Compose, kun je meteen topics aanmaken en data versturen, net zoals bij elke standaarddeployment.

CLI-toegang en Kafka-commands

Gebruik docker-compose exec of docker exec om Kafka CLI-tools te draaien. Om bijvoorbeeld een topic te maken, voer je uit:

docker-compose exec kafka kafka-topics.sh --create --topic demo --bootstrap-server localhost:9092

Je kunt kafka-console-producer.sh en kafka-console-consumer.sh op dezelfde manier gebruiken. Dit geeft een snelle feedbackloop voor integratietesten of experimenten zonder je lokale omgeving te vervuilen.

Programmatische toegang vanuit apps

Applicaties en scripts kunnen verbinding maken met je gecontaineriseerde Kafka via de geadverteerde bootstrap-servers van de host. Voor lokale apps stel je bootstrap.servers=localhost:9092 of het equivalent in. 

Veelgebruikte clients zijn de officiële Kafka-bibliotheken voor Python, Java, NodeJS en Go. Let erop dat de netwerkstack van je applicatie de juiste poorten en adressen kan bereiken.

Docker-netwerken en Kafka-connectiviteit

De netwerkconfiguratie van Kafka levert vaak uitdagingen op. Het begrijpen van interne en externe listeners en hoe je services exposeert is essentieel.

Interne vs. externe listeners

Kafka-brokers gebruiken listeners om clientverbindingen te beheren. Twee veelvoorkomende setups zijn:

  • PLAINTEXT://:9092 voor lokaal, onbeveiligd verkeer, vooral voor dev
  • SSL of SASL_SSL-listeners voor versleutelde of geauthenticeerde verbindingen

Expose in docker-compose de juiste poorten en zorg dat KAFKA_ADVERTISED_LISTENERS overeenkomt met de daadwerkelijke host en poort die je apps gebruiken. Als je in een VM of cloud draait, stel je deze configuratie in op het publieke IP en de gemapte poort.

Aspect

Interne listener

Externe listener

Veelgebruikt protocol

PLAINTEXT://:9092

SSL://, SASL_SSL:// of gemapte PLAINTEXT://

Beveiliging

Onversleuteld, niet geauthenticeerd

Versleuteld en/of geauthenticeerd

Typisch gebruik

Lokale ontwikkeling, verkeer tussen containers

Externe clients, cloud-VM’s, productie-toegang

Docker Compose-setup

Poort 9092 intern in het netwerk exposen

9092 mappen naar host, KAFKA_ADVERTISED_LISTENERS instellen op publiek IP

Configuratiefocus

Eenvoud en snelheid

Betrouwbaarheid, veiligheid, publieke toegang

Netwerkscope

Localhost of intern Docker-netwerk

Publiek IP of extern gerichte domeinnaam

Meerdere listeners configureren voor diverse clienttoegang

In Docker-omgevingen is het gebruikelijk om meerdere listeners op te zetten voor verschillende clientscenario’s:

environment:
  KAFKA_LISTENERS: INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092
  KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:29092,EXTERNAL://localhost:9092
  KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
  KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

Met deze setup kunnen interne Docker-clients verbinden via de INTERNAL listener en externe clients via de EXTERNAL listener.

Connectiviteit troubleshooten

Veelvoorkomende fouten zijn ‘broker not available’, ‘connection refused’ of client time-outs. Controleer:

  • Of poorten correct ge-exposed en gemapt zijn
  • Of de geadverteerde listeners van de broker overeenkomen met het doeladres van je client
  • Of alle containers healthy zijn met docker-compose ps
  • Of DNS-resolutie tussen containers werkt (gebruik de servicenaam, bijv. kafka:9092)
  • Gebruik docker network inspect om links tussen containers te debuggen

Kafka Docker in productieachtige omgevingen

Naast lokaal testen zijn gedockeriseerde Kafka-omgevingen ook handig voor staging en CI/CD.

Strategieën voor containerorkestratie

Orchestrators zoals Docker Swarm en Kubernetes kunnen multi-broker Kafka-setups, rolling updates en service discovery beheren. Elke broker krijgt zijn eigen container met gekoppelde persistente opslag. 

In Kubernetes verzorgen StatefulSets geordende deployment en creëren ze stabiele DNS-namen voor elke broker.

Logging en monitoring

Stuur Kafka-logs naar de Docker-logdriver of externe opslag voor analyse. Veel teams sturen logs naar Elasticsearch, Loki of Splunk voor troubleshooting. Combineer gedockeriseerde Kafka met Prometheus en Grafana voor clustermonitoring.

Optimalisatietips voor Kafka in Docker

De performance van Kafka hangt af van zorgvuldig beheer van resources en opslag.

Resource-allocatie

Geef elke brokercontainer voldoende CPU, RAM en schijf om productie zo goed mogelijk te benaderen. Stel Docker-resourcelimieten af en geef JVM-opties door met KAFKA_JVM_PERFORMANCE_OPTS voor heap- en garbagecollector-instellingen.

Persistente opslag

Gebruik altijd Docker-volumes of bind mounts voor /var/lib/kafka/data en /var/lib/zookeeper. Data in de container opslaan betekent dat je die bij een herstart kwijtraakt, wat elke duurzaamheidstest ondermijnt. Hoge schijfdoorvoer is cruciaal voor aanhoudende performance, vooral bij loadtesten in CI/CD.

Best practices en veelvoorkomende valkuilen

Stabiliteit, onderhoudbaarheid en teamproductiviteit profiteren allemaal van een paar best practices.

Configuratiebeheer

Beheer secrets en configuraties extern met .env-bestanden of gemounte configmappen. Hardcode nooit gevoelige data in je compose-YAML. Overweeg voor herbruikbare setups templatingtools of configmanagement-frameworks.

Veelgemaakte fouten

Veelgemaakte fouten vermijden

  • Sla geen data op in containers; mount altijd volumes
  • Controleer op poortconflicten op je host
  • Gebruik geen standaard adminwachtwoorden; beveilig ge-exposede poorten, ook voor lokale ontwikkeling
  • Houd Docker-images up-to-date; patch voor CVE’s en verouderde dependencies

Kafka-beveiliging versterken

Om je Kafka-deployment te beveiligen:

  • TLS-versleuteling inschakelen: Bescherm data onderweg door SSL/TLS voor alle verbindingen te configureren.
  • Authenticatie implementeren: Gebruik SASL-mechanismen (bijv. SCRAM, GSSAPI) om clients te authenticeren.
  • Autorisatie instellen: Definieer Access Control Lists (ACL’s) om clientrechten te beheren.
  • Credentials regelmatig roteren: Wijzig wachtwoorden en sleutels periodiek om risico’s te minimaliseren.
  • Monitoren en auditen: Schakel auditlogs in om toegang en wijzigingen binnen het cluster te volgen

Conclusie

Docker maakt het verrassend eenvoudig om Apache Kafka-clusters te starten, tweaken en mee te experimenteren voor integratie, leren of zelfs productieachtige tests. Containers schermen je af van host-OS-problemen en dependency-mismatches, waardoor je erop kunt vertrouwen dat je dev- en testomgevingen zijn wat je verwacht. Naarmate je groeit van eenvoudige lokale clusters naar georkestreerde Kafka-platformen, bespaart investeren in robuuste Docker-setups en best practices je team tijd en frustratie. 

Ontdek meer over Kafka en Docker in een van onze uitgebreide cursussen: 

Docker Kafka FAQ’s

Heb ik Zookeeper nodig om Kafka in Docker te draaien?

Niet per se. Hoewel traditionele Kafka-setups vertrouwen op Zookeeper, ondersteunen nieuwere versies KRaft-modus, die de noodzaak van Zookeeper wegneemt door clustercoördinatie te internaliseren. Veel Docker Compose-voorbeelden gebruiken echter nog standaard Zookeeper voor compatibiliteit en stabiliteit. ZooKeeper werd gedeprcated in versie 3.5 en staat gepland voor verwijdering in 4.0.

Kan ik Kafka in Docker gebruiken voor productie-workloads?

Het is mogelijk om applicaties te deployen zonder orkestratietools zoals Kubernetes of Docker Swarm, maar het is niet altijd aan te raden. Voor productie moet je rekening houden met persistentie, monitoring, security, schaalbaarheid en failover-ondersteuning. Docker is ideaal voor ontwikkeling en testen, maar vereist zorgvuldige planning voor productie.

Waarom krijgt mijn Kafka-client verbindingsfouten bij gebruik van Docker?

De meeste clientverbindingsproblemen komen voort uit onjuiste KAFKA_ADVERTISED_LISTENERS-instellingen. Zorg dat de waarde het adres weerspiegelt dat de client gebruikt om te verbinden (bijv. localhost:9092 voor lokale dev) en dat Docker-poorten correct zijn ge-exposed.

Welke Kafka Docker-image moet ik gebruiken: Confluent, Bitnami of Apache?

Gebruik de image van Confluent voor volledige setups en geavanceerd testen, die van Bitnami voor eenvoudige lokale ontwikkeling, en die van Apache voor minimale, aanpasbare builds. Kies op basis van je usecase, resourcebehoeften en security-eisen.

Hoe persisteer ik data over herstarts van Kafka-containers?

Gebruik altijd Docker-volumes of bind mounts die gemapt zijn naar /var/lib/kafka/data en /var/lib/zookeeper (indien gebruikt). Container-bestandssystemen zijn vluchtig; zonder externe opslag gaan alle berichten en topics verloren bij herstarts.

Derrick Mwiti

Auteur

Derrick Mwiti

Onderwerpen

Gerelateerd