programa
En el mundo de los pipelines de datos modernos y los microservicios, Apache Kafka destaca como la solución de referencia para gestionar flujos de eventos en tiempo real e integrar sistemas distribuidos. A medida que más equipos de ingeniería adoptan arquitecturas escalables basadas en eventos, Kafka se vuelve clave para un movimiento de datos fiable.
En paralelo, Docker se ha consolidado como la forma preferida de los desarrolladores para gestionar, compartir y desplegar servicios complejos sin preocuparse por entornos inconsistentes o problemas locales.
Usar Docker para ejecutar Kafka permite a los equipos levantar rápidamente clústeres similares a producción para pruebas, demos de prueba de concepto o incluso cargas de trabajo de producción.
Este artículo está dirigido a desarrolladores backend intermedios, ingenieros de DevOps y cualquier persona que gestione plataformas de datos y quiera trabajar con Kafka de forma sencilla y reproducible.
Si eres nuevo en Kafka o Docker, consulta nuestro curso Introduction to Apache Kafka o Docker for Beginners: A Practical Guide to Containers.
¿Qué es Kafka y por qué usar Docker?
Apache Kafka es una plataforma de streaming distribuida diseñada para mensajería con alto rendimiento, tolerancia a fallos y escalabilidad.
Actúa como un canal robusto y veloz entre productores y consumidores de datos. Cuando necesitas conectar microservicios, orquestar flujos de datos o procesar analítica en tiempo real, Kafka suele ser la herramienta elegida.
Puedes aprender a crear aplicaciones de procesamiento de datos en tiempo real con Kafka Streams en nuestro Kafka Streams Tutorial. El tutorial cubre los conceptos clave, implementaciones en Java y Python y ejemplos paso a paso para crear aplicaciones de streaming escalables.
Poner en marcha Kafka puede ser complejo. Incluso ingenieros con experiencia se enfrentan a la complejidad de brokers, topics, particiones y componentes necesarios como Zookeeper o KRaft.
Docker simplifica el proceso al empaquetar binarios, dependencias y configuraciones en contenedores.
Con Docker, los ingenieros pueden iniciar un clúster de Kafka en cualquier máquina, compartir configuraciones idénticas con sus compañeros y evitar el clásico «en mi máquina funciona». Kafka en Docker es especialmente popular para:
- Desarrollo y pruebas locales, donde poder levantar y tirar entornos rápido no tiene precio
- Entornos de integración aislados en pipelines CI/CD
- Simular clústeres con múltiples brokers en un único host
- Formación y demos
Explora Apache Kafka con nuestra guía Apache Kafka for Beginners. Aprende lo básico, empieza con buen pie y descubre funciones avanzadas y casos de uso reales de esta potente plataforma de event streaming.
Fundamentos de Kafka en Docker
Antes de entrar en la orquestación, conviene desglosar las piezas técnicas de Kafka y cómo Docker ayuda a recrear su naturaleza distribuida en un portátil o servidor.
Como verás en nuestro tutorial Learn Docker from Scratch, Docker es una herramienta muy extendida para simplificar el despliegue, escalado y gestión de aplicaciones como Kafka mediante contenedores.
Conceptos básicos de la arquitectura de Kafka
La columna vertebral de Kafka es el broker: un proceso de servidor que almacena, recibe y sirve mensajes. Cada clúster puede tener múltiples brokers para distribuir datos y carga.
Dentro de cada broker hay topics (canales con nombre para organizar mensajes) y particiones (subcanales que reparten eventos entre varios servidores para paralelismo y durabilidad). Los productores escriben datos en los topics, mientras que los consumidores se suscriben y procesan esos mensajes.
La coordinación es clave. Tradicionalmente, Kafka ha confiado en Zookeeper para gestionar metadatos de brokers, liderazgo de particiones y la salud general del clúster. Las implementaciones más recientes pueden usar el modo KRaft, que internaliza esta coordinación en el propio Kafka y elimina la dependencia de Zookeeper. ZooKeeper se declaró obsoleto en la versión 3.5 y está previsto su retiro en la 4.0.
Aprende a contenerizar aplicaciones de machine learning con Docker y Kubernetes con nuestro tutorial How to Containerize an Application Using Docker.
Modo KRaft: simplificando la arquitectura de Kafka
Desde la versión 2.8, Kafka introdujo el modo KRaft, que le permite gestionar metadatos internamente sin depender de Zookeeper, y fue declarado listo para producción en la versión 3.3. Este cambio simplifica los despliegues y reduce los componentes a gestionar.
Para configurar Kafka en modo 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
Esta configuración crea un clúster de Kafka de un solo nodo en modo KRaft, eliminando la necesidad de Zookeeper.
Imprescindibles de Docker
Para ejecutar Kafka con Docker solo necesitas unos básicos: Docker Engine (el runtime) y, a menudo, Docker Compose para gestionar múltiples contenedores.
Los archivos Compose te permiten definir varios servicios (Kafka, Zookeeper, Kafka UI, etc.), sus redes, variables de entorno y cualquier montaje de almacenamiento. La red de Docker hace posible emular clústeres con varios brokers, incluso en una sola máquina, asignando a cada broker su contenedor, hostname y puertos.
Una de las mejores formas de familiarizarte con Docker es con proyectos. Practica con estas 10 ideas de proyectos con Docker.
Configurar Kafka con Docker Compose
Docker Compose suele ser la forma preferida de ejecutar aplicaciones que requieren múltiples contenedores interactuando entre sí. En lugar de pelearte con scripts o comandos manuales, Compose te permite definir todos los servicios y sus enlaces en un único archivo YAML.
Este enfoque reduce la deriva de configuración, acelera la incorporación y garantiza que todos uséis la misma pila de desarrollo.
Configuración mínima con Compose
Aquí tienes un docker-compose.yml básico que inicia Kafka y Zookeeper para desarrollo local:
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:
Esta configuración mínima mapea los puertos relevantes, enlaza Kafka con Zookeeper y monta un volumen de Docker para que los mensajes no desaparezcan si los contenedores se reinician. Usa variables de entorno para configurar la identidad del broker, las direcciones de los listeners y los endpoints de conexión entre servicios.
Dominar Kafka es clave para brillar en una entrevista de ingeniería de datos. Prepárate con nuestra lista de preguntas y respuestas usando estas 20 preguntas de entrevista sobre Kafka para data engineers.
Configuración ampliada
En entornos profesionales, suele añadirse Kafka UI, Schema Registry o REST Proxy para facilitar la gestión y la inspección de mensajes. Puedes añadirlos al bloque de services en tu archivo compose. Por ejemplo:
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: "Local"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"
Persistir topics y logs de Kafka entre reinicios es esencial para probar recuperaciones o trabajos de larga duración. Monta siempre volúmenes de Docker en /var/lib/kafka/data para cada broker y en /var/lib/zookeeper para Zookeeper, si lo usas.
Elegir la imagen adecuada es clave. Aquí tienes un resumen rápido:
|
Imagen de Kafka en Docker |
Mantenedor |
Características |
Mejor caso de uso |
|
Confluent |
Confluent |
Conjunto completo, muchos complementos |
Entornos similares a producción, pruebas avanzadas |
|
Bitnami |
Bitnami |
Limpia, minimalista |
Desarrollo local, entornos con pocos recursos |
|
Apache Kafka (KRaft) |
Apache |
Sin Zookeeper, configuración simplificada |
Despliegues modernos, arquitectura simplificada |
El tutorial How to Learn Apache Kafka in 2025 entra en más detalle sobre Kafka, incluyendo
- ¿Por qué es popular Apache Kafka?
- Principales características de Apache Kafka
- Aplicaciones y casos de uso de Apache Kafka
Interactuar con Kafka en Docker
Una vez que Kafka se esté ejecutando con Docker Compose, puedes crear topics y enviar datos al momento, igual que en cualquier despliegue estándar.
Acceso por CLI y comandos de Kafka
Usa docker-compose exec o docker exec para ejecutar las herramientas de CLI de Kafka. Por ejemplo, para crear un topic, ejecuta:
docker-compose exec kafka kafka-topics.sh --create --topic demo --bootstrap-server localhost:9092
También puedes usar kafka-console-producer.sh y kafka-console-consumer.sh de la misma manera. Esto te da un ciclo de feedback rápido para pruebas de integración o experimentación sin ensuciar tu entorno local.
Acceso programático desde aplicaciones
Aplicaciones y scripts pueden conectarse a tu Kafka en contenedor usando los bootstrap servers anunciados en el host. Para apps locales, establece bootstrap.servers=localhost:9092 o el equivalente.
Entre los clientes más comunes están las librerías oficiales de Kafka para Python, Java, NodeJS y Go. Asegúrate de que la red de tu aplicación alcance los puertos y direcciones correctos.
Red de Docker y conectividad de Kafka
La configuración de red de Kafka suele dar guerra. Entender los listeners internos y externos y cómo exponer servicios es vital.
Listeners internos vs externos
Los brokers de Kafka usan listeners para controlar las conexiones de los clientes. Dos configuraciones comunes son:
PLAINTEXT://:9092para tráfico local sin cifrar, especialmente en desarrolloSSLoSASL_SSLpara conexiones cifradas o autenticadas
En docker-compose, expón los puertos correctos y asegúrate de que KAFKA_ADVERTISED_LISTENERS coincide con el host y puerto reales que usan tus apps. Si lo ejecutas en una VM o en la nube, configura esta variable con la IP pública y el puerto mapeado.
|
Aspecto |
Listener interno |
Listener externo |
|
Protocolo habitual |
PLAINTEXT://:9092 |
SSL://, SASL_SSL:// o PLAINTEXT:// mapeado |
|
Seguridad |
Sin cifrar ni autenticar |
Cifrado y/o autenticado |
|
Uso típico |
Desarrollo local, tráfico entre contenedores |
Clientes remotos, VMs en la nube, acceso de producción |
|
Configuración en Docker Compose |
Exponer el puerto 9092 dentro de la red |
Mapear 9092 al host y definir KAFKA_ADVERTISED_LISTENERS con la IP pública |
|
Enfoque de configuración |
Simplicidad y velocidad |
Fiabilidad, seguridad, acceso público |
|
Ámbito de red |
Localhost o red interna de Docker |
IP pública o dominio expuesto |
Configurar múltiples listeners para distintos clientes
En entornos Docker, es habitual configurar varios listeners para cubrir diferentes escenarios de acceso de clientes:
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
Este ajuste permite que los clientes internos de Docker se conecten mediante el listener INTERNAL y que los clientes externos se conecten mediante el listener EXTERNAL.
Solucionar problemas de conectividad
Los errores más comunes incluyen «broker not available», «connection refused» o timeouts del cliente. Verifica:
- Que los puertos estén expuestos y mapeados correctamente
- Que los advertised listeners del broker coincidan con la dirección a la que apunta tu cliente
- Que todos los contenedores estén healthy con
docker-compose ps - Que haya resolución DNS entre contenedores (usa el nombre del servicio, p. ej.,
kafka:9092) - Prueba con docker network inspect para depurar enlaces entre contenedores
Kafka con Docker en entornos similares a producción
Más allá de las pruebas locales, los entornos de Kafka en Docker también ayudan en staging y CI/CD.
Estrategias de orquestación de contenedores
Orquestadores como Docker Swarm y Kubernetes pueden gestionar configuraciones de Kafka con múltiples brokers, actualizaciones graduales y descubrimiento de servicios. Cada broker tiene su contenedor con almacenamiento persistente adjunto.
En Kubernetes, los StatefulSets gestionan despliegue ordenado y crean nombres DNS estables para cada broker.
Logging y monitorización
Redirige los logs de Kafka al driver de logs de Docker o a almacenamiento externo para su análisis. Muchos equipos envían logs a Elasticsearch, Loki o Splunk para troubleshooting. Combina Kafka en Docker con Prometheus y Grafana para monitorizar el clúster.
Consejos de optimización para Kafka en Docker
El rendimiento de Kafka depende de una buena gestión de recursos y almacenamiento.
Asignación de recursos
Dale a cada contenedor de broker suficiente CPU, RAM y disco para acercarte lo máximo posible a producción. Ajusta los límites de recursos de Docker y pasa opciones JVM con KAFKA_JVM_PERFORMANCE_OPTS para configurar heap y el recolector de basura.
Almacenamiento persistente
Usa siempre volúmenes de Docker o bind mounts para /var/lib/kafka/data y /var/lib/zookeeper. Si guardas datos dentro del contenedor los perderás al reiniciar, lo que invalida cualquier prueba de durabilidad. Un alto rendimiento de disco es crítico para mantener el rendimiento, especialmente en pruebas de carga en CI/CD.
Buenas prácticas y errores comunes
La estabilidad, el mantenimiento y la productividad del equipo mejoran con unas cuantas buenas prácticas.
Gestión de la configuración
Gestiona secretos y configuraciones externamente con archivos .env o directorios de configuración montados. Nunca hardcodees datos sensibles en tu YAML de compose. Para configuraciones reutilizables, valora usar plantillas o frameworks de gestión de configuración.
Errores habituales
Evita estos fallos comunes
- No guardes datos dentro de los contenedores; monta siempre volúmenes
- Comprueba conflictos de puertos en tu host
- Evita contraseñas por defecto; asegura los puertos expuestos, incluso en desarrollo local
- Mantén las imágenes de Docker al día; aplica parches para CVEs y dependencias obsoletas
Refuerza la seguridad de Kafka
Para asegurar tu despliegue de Kafka:
- Activa el cifrado TLS: protege los datos en tránsito configurando SSL/TLS para todas las conexiones.
- Implementa autenticación: usa mecanismos SASL (por ejemplo, SCRAM, GSSAPI) para autenticar clientes.
- Configura la autorización: define listas de control de acceso (ACL) para controlar los permisos de los clientes.
- Rota credenciales periódicamente: cambia contraseñas y claves cada cierto tiempo para minimizar riesgos.
- Monitoriza y audita: activa logs de auditoría para rastrear accesos y cambios dentro del clúster
Conclusión
Docker hace que sea sorprendentemente fácil arrancar, ajustar y experimentar con clústeres de Apache Kafka para integración, aprendizaje o incluso pruebas similares a producción. Los contenedores te aíslan de problemas del SO anfitrión y desajustes de dependencias, dándote la tranquilidad de que tus entornos de desarrollo y prueba son los que esperas. A medida que pases de clústeres locales simples a plataformas de Kafka orquestadas, invertir en configuraciones de Docker sólidas y buenas prácticas te ahorrará tiempo y frustraciones.
Explora más sobre Kafka y Docker en alguno de nuestros cursos más completos:
Docker y Kafka: preguntas frecuentes
¿Necesito Zookeeper para ejecutar Kafka en Docker?
No necesariamente. Aunque las configuraciones tradicionales de Kafka dependen de Zookeeper, las versiones más recientes admiten el modo KRaft, que elimina la necesidad de Zookeeper al internalizar la coordinación del clúster. Sin embargo, muchos ejemplos de Docker Compose siguen usando Zookeeper por defecto por compatibilidad y estabilidad. ZooKeeper se declaró obsoleto en la versión 3.5 y está previsto su retiro en la 4.0.
¿Puedo usar Kafka en Docker para cargas de trabajo en producción?
Aunque es posible desplegar aplicaciones sin herramientas de orquestación como Kubernetes o Docker Swarm, no siempre es recomendable. En producción, ten en cuenta persistencia, monitorización, seguridad, escalado y tolerancia a fallos. Docker es ideal para desarrollo y pruebas, pero requiere una planificación cuidadosa para producción.
¿Por qué mi cliente de Kafka muestra errores de conexión al usar Docker?
La mayoría de los problemas de conexión de clientes provienen de una configuración incorrecta de KAFKA_ADVERTISED_LISTENERS. Asegúrate de que el valor que anuncias coincide con la dirección que usa el cliente para conectarse (por ejemplo, localhost:9092 en desarrollo local) y de que los puertos de Docker estén expuestos correctamente.
¿Qué imagen de Kafka en Docker debería usar: Confluent, Bitnami o Apache?
Usa la imagen de Confluent para configuraciones completas y pruebas avanzadas, la de Bitnami para desarrollo local sencillo y la de Apache para builds minimalistas y personalizables. Elige según tu caso de uso, necesidades de recursos y requisitos de seguridad.
¿Cómo persisto los datos entre reinicios del contenedor de Kafka?
Usa siempre volúmenes de Docker o bind mounts mapeados a /var/lib/kafka/data y /var/lib/zookeeper (si lo usas). Los sistemas de archivos de los contenedores son efímeros: sin almacenamiento externo, todos los mensajes y topics se perderán en los reinicios.


