Last chance! 50% off DataCamp Premium
Sale ends in
Nel mondo dei moderni data pipeline e dei microservizi, Apache Kafka si distingue come la soluzione di riferimento per gestire stream di eventi in tempo reale e integrare sistemi distribuiti. Man mano che sempre più team di ingegneria si spostano verso architetture scalabili e event-driven, Kafka diventa centrale per uno spostamento dati affidabile.
Parallelamente a questa tendenza, Docker è emerso come il modo principale per sviluppatori di gestire, condividere e distribuire servizi complessi senza preoccuparsi di ambienti incoerenti o problemi locali.
Usando Docker per eseguire Kafka, i team possono avviare rapidamente cluster simili alla produzione per test, demo di proof-of-concept o persino carichi di lavoro in produzione.
Questo articolo è pensato per sviluppatori backend di livello intermedio, ingegneri DevOps e chiunque gestisca piattaforme dati e voglia rendere il lavoro con Kafka semplice e riproducibile.
Se sei alle prime armi con Kafka o Docker, dai un'occhiata al nostro corso Introduzione ad Apache Kafka o a Docker per principianti: guida pratica ai container.
Apache Kafka è una piattaforma di streaming distribuita progettata per messaging ad alto throughput, tollerante ai guasti e scalabile.
Funziona come una pipeline durevole e ad alta velocità tra produttori e consumatori di dati. Ogni volta che devi collegare microservizi, orchestrare flussi di dati o elaborare analisi in tempo reale, Kafka è spesso lo strumento di scelta.
Puoi imparare a creare applicazioni di elaborazione dati in tempo reale con Kafka Streams con il nostro tutorial su Kafka Streams. Il tutorial copre i concetti di base, implementazioni in Java e Python e esempi passo passo per creare applicazioni di streaming scalabili.
Eseguire Kafka può essere complesso. Anche ingegneri esperti trovano frustrante la complessità di broker, topic, partition e componenti necessari come Zookeeper o KRaft.
Docker semplifica il processo impacchettando binari, dipendenze e configurazioni nei container.
Con Docker, gli ingegneri possono avviare un cluster Kafka su qualsiasi macchina, condividere setup identici con i colleghi ed evitare il classico problema del "sul mio computer funziona". Kafka in Docker è particolarmente popolare per:
Esplora Apache Kafka con la nostra guida Apache Kafka per principianti. Impara le basi, inizia e scopri funzionalità avanzate e applicazioni reali di questa potente piattaforma di event streaming.
Prima di passare all'orchestrazione, è utile scomporre sia i componenti tecnici di Kafka sia come Docker aiuta a ricrearne la natura distribuita su un laptop o un server.
Come imparerai nel nostro tutorial Impara Docker da zero, Docker è uno strumento popolare per semplificare il deployment, lo scaling e la gestione di applicazioni come Kafka tramite la containerizzazione.
La spina dorsale di Kafka è il suo broker: un processo server che memorizza, riceve e serve i messaggi. Ogni cluster può essere composto da più broker, distribuendo dati e carico.
All'interno di ogni broker ci sono i topic (canali nominati per organizzare i messaggi) e le partition (sotto-canali che distribuiscono gli eventi su molti server per parallelismo e durabilità). I producer scrivono i dati nei topic, mentre i consumer si iscrivono e processano quei messaggi.
Il coordinamento è fondamentale. Tradizionalmente, Kafka ha fatto affidamento su Zookeeper per gestire i metadati dei broker, la leadership delle partition e la salute generale del cluster. Le implementazioni più recenti possono usare la modalità KRaft, che internalizza questo coordinamento in Kafka stesso, eliminando la dipendenza da Zookeeper. ZooKeeper è stato deprecato nella 3.5 ed è previsto per la rimozione nella 4.0.
Scopri come containerizzare applicazioni di machine learning con Docker e Kubernetes con il nostro tutorial Come containerizzare un'applicazione usando Docker.
A partire dalla versione 2.8, Kafka ha introdotto la modalità KRaft, che gli consente di gestire internamente i metadati senza basarsi su Zookeeper, ed è stata dichiarata pronta per la produzione nella versione 3.3. Questo cambiamento semplifica i deployment e riduce il numero di componenti da gestire.
Per configurare Kafka in modalità KRaft usando 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
Questa configurazione imposta un cluster Kafka a nodo singolo in modalità KRaft, eliminando la necessità di Zookeeper.
Per eseguire Kafka con Docker, servono solo pochi elementi: Docker Engine (il runtime) e spesso Docker Compose per la gestione multi-container.
I file Compose ti permettono di specificare diversi servizi (Kafka, Zookeeper, Kafka UI, ecc.), le loro reti, le variabili d'ambiente e gli eventuali mount di storage. Il networking di Docker consente di emulare cluster multi-broker, anche su una singola macchina, assegnando a ogni broker il proprio container, hostname e porte.
Uno dei modi migliori per familiarizzare con Docker è tramite progetti. Fai pratica con queste 10 idee di progetti Docker.
Docker Compose è spesso il modo preferito per eseguire applicazioni che richiedono più container interagenti. Invece di destreggiarti tra script shell o comandi manuali, Compose ti consente di definire tutti i servizi e i loro collegamenti in un unico file YAML.
Questo approccio riduce la deriva di configurazione, accelera l'onboarding e garantisce che tutti possano usare lo stesso stack per lo sviluppo.
Ecco un docker-compose.yml di base che avvia Kafka e Zookeeper per lo sviluppo locale:
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:
Questo setup minimo mappa le porte rilevanti, collega Kafka a Zookeeper e monta un volume Docker, così i messaggi non spariscono se i container si riavviano. Assicurati di usare variabili d'ambiente per configurare l'identità del broker, gli indirizzi dei listener e i punti di connessione tra i servizi.
Una comprensione approfondita di Kafka è essenziale per superare un colloquio da data engineer. Preparati al prossimo colloquio con la nostra ampia lista di domande e risposte su Kafka usando queste 20 domande di colloquio su Kafka per data engineer.
I setup professionali spesso aggiungono strumenti come Kafka UI, Schema Registry o REST Proxy per una gestione e un'ispezione dei messaggi più agevoli. Questi possono essere aggiunti al blocco services nel file compose. Ad esempio:
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: "Local"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"
Rendere persistenti topic e log di Kafka tra i riavvii è essenziale per testare scenari di recupero o job di lunga durata. Monta sempre volumi Docker su /var/lib/kafka/data per ogni broker e su /var/lib/zookeeper per Zookeeper, se utilizzato.
Scegliere l'immagine giusta è fondamentale. Ecco un breve riepilogo:
|
Immagine Docker di Kafka |
Maintainer |
Funzionalità |
Miglior caso d'uso |
|
Confluent |
Confluent |
Set completo, molti add-on |
Setup simili alla produzione, test avanzati |
|
Bitnami |
Bitnami |
Pulita, minimale |
Sviluppo locale, ambienti con risorse limitate |
|
Apache Kafka (KRaft) |
Apache |
Senza Zookeeper, setup semplificato |
Deployment moderni, architettura semplificata |
Il tutorial Come imparare Apache Kafka nel 2025 entra più nel dettaglio su Kafka, includendo
Una volta che Kafka è in esecuzione tramite Docker Compose, puoi creare subito topic e inviare dati, proprio come faresti con qualsiasi deployment standard.
Usa docker-compose exec o docker exec per eseguire gli strumenti CLI di Kafka. Ad esempio, per creare un topic, puoi eseguire:
docker-compose exec kafka kafka-topics.sh --create --topic demo --bootstrap-server localhost:9092
Puoi anche usare kafka-console-producer.sh e kafka-console-consumer.sh allo stesso modo. Questo offre un ciclo di feedback rapido per test di integrazione o sperimentazioni senza inquinare il tuo ambiente locale.
Applicazioni e script possono connettersi al tuo Kafka containerizzato usando i bootstrap server pubblicizzati dall'host. Per le app locali, imposta bootstrap.servers=localhost:9092 o equivalente.
I client comuni includono le librerie ufficiali Kafka per Python, Java, NodeJS e Go. Assicurati che lo stack di rete della tua applicazione possa raggiungere le porte e gli indirizzi corretti.
La configurazione di rete di Kafka presenta spesso sfide. Capire listener interni ed esterni e come esporre i servizi è fondamentale.
I broker Kafka usano i listener per controllare le connessioni dei client. Due setup comuni sono:
PLAINTEXT://:9092 per traffico locale non protetto, soprattutto in devSSL o SASL_SSL per connessioni cifrate o autenticateIn docker-compose, esponi le porte giuste e assicurati che KAFKA_ADVERTISED_LISTENERS corrisponda all'host e alla porta effettivi usati dalle tue app. Se esegui in una VM o nel cloud, imposta questa configurazione sull'IP pubblico e sulla porta mappata.
|
Aspetto |
Listener interno |
Listener esterno |
|
Protocollo comune |
PLAINTEXT://:9092 |
SSL://, SASL_SSL:// o PLAINTEXT:// mappato |
|
Sicurezza |
Non cifrato, non autenticato |
Cifrato e/o autenticato |
|
Uso tipico |
Sviluppo locale, traffico intra-container |
Client remoti, VM cloud, accesso in produzione |
|
Setup Docker Compose |
Esponi la porta 9092 nella rete interna |
Mappa 9092 sull'host, imposta KAFKA_ADVERTISED_LISTENERS sull'IP pubblico |
|
Focus di configurazione |
Semplicità e velocità |
Affidabilità, sicurezza, accesso pubblico |
|
Ambito di rete |
Localhost o rete interna di Docker |
IP pubblico o dominio esposto all'esterno |
Negli ambienti Docker è comune configurare più listener per gestire diversi scenari di accesso dei client:
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
Questo setup consente ai client interni a Docker di connettersi tramite il listener INTERNAL e ai client esterni di connettersi tramite il listener EXTERNAL.
Gli errori comuni includono "broker non disponibile", "connessione rifiutata" o timeout del client. Verifica:
docker-compose pskafka:9092)Oltre ai test locali, ambienti Kafka containerizzati aiutano anche con staging e CI/CD.
Orchestratori come Docker Swarm e Kubernetes possono gestire setup Kafka multi-broker, aggiornamenti progressivi e service discovery. Ogni broker ha il proprio container, con storage persistente collegato.
In Kubernetes, i StatefulSet gestiscono il deployment ordinato e creano nomi DNS stabili per ogni broker.
Invia i log di Kafka al driver di log di Docker o a storage esterno per l'analisi. Molti team instradano i log verso Elasticsearch, Loki o Splunk per il troubleshooting. Abbina Kafka in Docker a Prometheus e Grafana per il monitoraggio del cluster.
Le prestazioni di Kafka dipendono da un'attenta gestione di risorse e storage.
Assegna a ogni container broker CPU, RAM e disco sufficienti per imitare la produzione il più possibile. Regola i limiti di risorse di Docker e passa le opzioni JVM con KAFKA_JVM_PERFORMANCE_OPTS per heap e impostazioni del garbage collector.
Usa sempre volumi Docker o bind mount per /var/lib/kafka/data e /var/lib/zookeeper; memorizzare i dati all'interno del container significa perderli al riavvio, vanificando qualsiasi test di durabilità. Un'elevata velocità del disco è fondamentale per prestazioni sostenute, soprattutto nei test di carico CI/CD.
Stabilità, manutenibilità e produttività del team traggono tutte beneficio da alcune best practice.
Gestisci secret e configurazioni esternamente con file .env o directory di config montate. Non inserire mai dati sensibili in hardcode nello YAML di compose. Per setup riutilizzati, considera strumenti di templating o framework di config management.
Evitare errori comuni
Per mettere in sicurezza il tuo deployment Kafka:
Docker rende sorprendentemente facile avviare, modificare e sperimentare cluster Apache Kafka per integrazione, apprendimento o anche test simili alla produzione. I container ti isolano dai problemi dell'OS host e dalle incompatibilità di dipendenze, dandoti la sicurezza che gli ambienti di sviluppo e test corrispondano a quanto ti aspetti. Man mano che cresci da semplici cluster locali a piattaforme Kafka orchestrate, investire in setup Docker solidi e best practice farà risparmiare tempo e frustrazione al tuo team.
Esplora altre informazioni su Kafka e Docker in uno dei nostri corsi completi:
Non necessariamente. Sebbene i setup Kafka tradizionali si basino su Zookeeper, le versioni più recenti supportano la modalità KRaft, che elimina la necessità di Zookeeper internalizzando il coordinamento del cluster. Tuttavia, molti esempi Docker Compose usano ancora Zookeeper per impostazione predefinita per compatibilità e stabilità. ZooKeeper è stato deprecato nella versione 3.5 ed è previsto per la rimozione nella 4.0.
Sebbene sia possibile distribuire applicazioni senza strumenti di orchestrazione come Kubernetes o Docker Swarm, non è sempre consigliato. Per la produzione, considera persistenza, monitoraggio, sicurezza, scaling e supporto al failover. Docker è ideale per sviluppo e test, ma richiede un'attenta pianificazione per la produzione.
La maggior parte dei problemi di connessione dei client deriva da impostazioni errate di KAFKA_ADVERTISED_LISTENERS. Assicurati che il valore del listener rifletta l'indirizzo che il client usa per connettersi (ad es., localhost:9092 per sviluppo locale) e che le porte Docker siano esposte correttamente.
Usa l'immagine di Confluent per setup completi e test avanzati, quella di Bitnami per uno sviluppo locale semplice e quella di Apache per build minime e personalizzabili. Scegli in base al tuo caso d'uso, alle risorse necessarie e ai requisiti di sicurezza.
Usa sempre volumi Docker o bind mount mappati su /var/lib/kafka/data e /var/lib/zookeeper (se utilizzato). I filesystem dei container sono effimeri: senza storage esterno, tutti i messaggi e i topic andranno persi ai riavvii.

I migliori corsi DataCamp
Programma
Corso
Corso
blog
Tim Lu
12 min

blog
Abid Ali Awan
10 min

blog
Abid Ali Awan
15 min