Questa guida mostra passo per passo come eseguire Apache Kafka in ambienti di sviluppo usando Docker e Docker Compose.
Vedremo come:
- capire il ruolo di Kafka e i vantaggi dell'uso con Docker;
- avviare rapidamente un cluster minimo con Docker Compose;
- configurare topic, producer e consumer da linea di comando;
- organizzare una struttura di progetto riutilizzabile per i tuoi servizi.
Perché usare Kafka con Docker
Apache Kafka è una piattaforma di streaming distribuita pensata per gestire flussi di eventi ad alta velocità. Docker semplifica moltissimo l'esecuzione di Kafka in locale:
- non devi installare manualmente Java, Kafka e Zookeeper;
- tutto il cluster è descritto in file di configurazione versionabili (Dockerfile, docker-compose.yml);
- puoi distruggere e ricreare l'ambiente in pochi secondi;
- puoi condividere la stessa configurazione con il team.
Prerequisiti
- Docker installato e in esecuzione;
- Docker Compose (versione stand-alone o integrata in Docker Desktop);
- conoscenza di base della riga di comando.
Creare un progetto Kafka con Docker
Crea una cartella per il progetto, ad esempio:
mkdir kafka-docker-demo
cd kafka-docker-demo
All'interno di questa cartella creeremo un file docker-compose.yml che definisce i
container necessari.
Docker Compose: esempio di cluster minimo
Di seguito un esempio di configurazione con un broker Kafka e Zookeeper, basato sulle immagini di
Bitnami. Crea il file docker-compose.yml con il contenuto seguente:
version: "3.8"
services:
zookeeper:
image: bitnami/zookeeper:latest
container_name: zookeeper
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
ports:
- "2181:2181"
kafka:
image: bitnami/kafka:latest
container_name: kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
- KAFKA_BROKER_ID=1
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_LISTENERS=PLAINTEXT://:9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- ALLOW_PLAINTEXT_LISTENER=yes
Spiegazione rapida della configurazione
zookeeperesegue un server Zookeeper accessibile sulla porta 2181.kafkaesegue un singolo broker Kafka.KAFKA_ADVERTISED_LISTENERSindica come il broker si presenta ai client (in questo caso, la tua macchina locale).ALLOW_PLAINTEXT_LISTENERabilita l'uso di connessioni non cifrate, adatte a sviluppo e test.
Avviare Kafka con Docker Compose
Per avviare il cluster, esegui:
docker compose up -d
L'opzione -d manda i container in background. Puoi verificare che tutto sia in esecuzione con:
docker compose ps
Accedere alla shell del container Kafka
Molti comandi di gestione di Kafka (creazione di topic, producer, consumer) vengono eseguiti all'interno del container. Per aprire una shell:
docker exec -it kafka /bin/bash
Da qui puoi usare gli script forniti da Kafka, tipicamente sotto /opt/bitnami/kafka/bin
nelle immagini Bitnami. Per semplicità, potresti esportare una variabile:
export KAFKA_BIN=/opt/bitnami/kafka/bin
Creare un topic
Esempio di creazione di un topic chiamato test-topic:
$KAFKA_BIN/kafka-topics.sh \
--create \
--topic test-topic \
--bootstrap-server localhost:9092 \
--partitions 3 \
--replication-factor 1
Per verificare che il topic esista:
$KAFKA_BIN/kafka-topics.sh \
--describe \
--topic test-topic \
--bootstrap-server localhost:9092
Inviare messaggi (producer)
Per aprire un producer interattivo sulla riga di comando:
$KAFKA_BIN/kafka-console-producer.sh \
--topic test-topic \
--bootstrap-server localhost:9092
Dopo aver eseguito il comando, ogni riga che digiti verrà inviata come messaggio a Kafka sul topic
test-topic.
Leggere messaggi (consumer)
In una seconda shell (sempre nel container Kafka), esegui:
$KAFKA_BIN/kafka-console-consumer.sh \
--topic test-topic \
--bootstrap-server localhost:9092 \
--from-beginning
L'opzione --from-beginning indica al consumer di leggere tutti i messaggi presenti sul topic
a partire dall'inizio.
Esempio di producer e consumer in un'applicazione
In uno scenario reale, vorrai collegare i tuoi servizi applicativi al broker Kafka in esecuzione nel container.
I client si connettono all'indirizzo pubblicato da KAFKA_ADVERTISED_LISTENERS, quindi per
uno sviluppo locale sarà tipicamente localhost:9092.
Di seguito un semplice esempio (pseudocodice) di configurazione client in un file JSON di impostazioni:
{
"kafka": {
"bootstrapServers": "localhost:9092",
"clientId": "example-app",
"acks": "all",
"retries": 3
}
}
Arrestare e ripulire il cluster
Per fermare i container ma mantenere i dati:
docker compose down
Se vuoi eliminare anche i volumi (e quindi i dati persistenti di Kafka e Zookeeper), esegui:
docker compose down -v
Consigli pratici
-
Mantieni il file
docker-compose.ymlnel controllo di versione del progetto, insieme alla documentazione su come avviare il cluster. - Usa nomi di topic significativi, coerenti tra ambienti (sviluppo, staging, produzione) e documentali chiaramente.
- Per scenari più avanzati (più broker, sicurezza, monitoraggio), estendi il file Docker Compose aggiungendo nuovi servizi e configurazioni, mantenendo però una variante minimale per lo sviluppo.
Conclusione
Usare Kafka con Docker ti permette di avere un ambiente di messaggistica potente e realistico direttamente sulla tua macchina di sviluppo, senza installazioni complesse. Con pochi comandi puoi creare, distruggere e ricreare un cluster, testare producer e consumer e condividere l'intera configurazione con il resto del team.
A partire dall'esempio mostrato in questa guida puoi costruire configurazioni sempre più complete, aggiungendo più broker, tool di monitoraggio e servizi applicativi che consumano e producono eventi su Kafka.