Program
Modern veri hatları ve mikro hizmetler dünyasında Apache Kafka, gerçek zamanlı olay akışlarını yönetmek ve dağıtık sistemleri entegre etmek için başvurulan bir çözüm olarak öne çıkıyor. Daha fazla mühendislik ekibi ölçeklenebilir, olaya dayalı mimarilere yöneldikçe Kafka güvenilir veri hareketinin merkezine yerleşiyor.
Bu eğilime paralel olarak Docker, geliştiricilerin karmaşık hizmetleri tutarsız ortamlar veya yerel sorunlar hakkında endişelenmeden yönetmesi, paylaşması ve dağıtması için önde gelen yol haline geldi.
Kafka’yı Docker ile çalıştırarak ekipler test, kavram kanıtlama demoları veya hatta üretim iş yükleri için üretime benzer kümeleri hızla ayağa kaldırabilir.
Bu makale, Kafka ile çalışmayı sade ve tekrarlanabilir hale getirmek isteyen orta seviye backend geliştiricileri, DevOps mühendisleri ve veri platformlarını yöneten herkese yöneliktir.
Kafka veya Docker’a yeniyseniz, Introduction to Apache Kafka kursumuza ya da Docker for Beginners: A Practical Guide to Containers içeriğimize göz atmayı unutmayın.
Kafka nedir ve neden Docker kullanmalı?
Apache Kafka, yüksek aktarım kapasiteli, hataya dayanıklı ve ölçeklenebilir mesajlaşma için tasarlanmış dağıtık bir akış platformudur.
Veri üreticileri ile tüketicileri arasında kalıcı ve yüksek hızlı bir hat görevi görür. Mikro hizmetleri bağlamanız, veri akışlarını orkestre etmeniz veya gerçek zamanlı analitik işlemeniz gerektiğinde Kafka genellikle tercih edilen araçtır.
Kafka Streams Eğitimi ile Kafka Streams kullanarak gerçek zamanlı veri işleme uygulamalarını nasıl oluşturacağınızı öğrenebilirsiniz. Eğitim, temel kavramları, Java & Python uygulamalarını ve ölçeklenebilir akış uygulamaları geliştirmek için adım adım örnekleri kapsar.
Kafka’yı çalıştırmak karmaşık olabilir. Deneyimli mühendisler bile broker’lar, konular (topic), bölümler (partition) ve Zookeeper veya KRaft gibi gerekli bileşenlerin karmaşıklığını yorucu bulabilir.
Docker, ikili dosyaları, bağımlılıkları ve yapılandırmaları konteynerlara paketleyerek süreci basitleştirir.
Docker ile mühendisler herhangi bir makinede Kafka kümesini başlatabilir, meslektaşlarıyla aynı kurulumları paylaşabilir ve yaygın “benim makinemde çalışıyor” baş ağrısından kaçınabilir. Dockerize Kafka özellikle şu alanlarda popülerdir:
- Hızlı açma-kapama döngülerinin çok değerli olduğu yerel geliştirme ve test
- CI/CD boru hatlarında izole entegrasyon ortamları
- Tek bir host üzerinde çoklu broker kümelerini taklit etmek
- Eğitim ve gösterim kurulumları
Apache Kafka for Beginners rehberimizle Apache Kafka’yı keşfedin. Temelleri öğrenin, başlayın ve bu güçlü olay akışı platformunun gelişmiş özellikleri ile gerçek dünya kullanım alanlarını ortaya çıkarın.
Docker’da Kafka’nın Temelleri
Orkestrasyona dalmadan önce, hem Kafka’nın teknik parçalarını hem de Docker’ın dizüstü bilgisayar veya sunucu üzerinde dağıtık doğasını nasıl yeniden yarattığını parçalarına ayırmak faydalı olacaktır.
Learn Docker from Scratch eğitimimizde de öğreneceğiniz üzere Docker, Kafka gibi uygulamaların konteynerizasyon yoluyla dağıtımını, ölçeklenmesini ve yönetimini basitleştiren popüler bir araçtır.
Kafka mimarisinin temelleri
Kafka’nın belkemiği, mesajları depolayan, alan ve sunan sunucu süreci olan broker’dır. Her küme birden fazla broker’dan oluşabilir; veri ve yük dağıtılır.
Her broker’ın içinde konular (mesajları düzenlemek için adlandırılmış kanallar) ve bölümler (paralellik ve dayanıklılık için olayları birçok sunucuya yayan alt kanallar) bulunur. Üreticiler (producer) veriyi konulara yazar, tüketiciler (consumer) ise bu mesajlara abone olur ve işler.
Eşgüdüm kritik önemdedir. Geleneksel olarak Kafka, broker metadatasını, bölüm liderliğini ve genel küme sağlığını yönetmek için Zookeeper’a dayanır. Daha yeni dağıtımlarda ise bu eşgüdümü Kafka’nın içine alan ve Zookeeper bağımlılığını kaldıran KRaft modu kullanılabilir. ZooKeeper 3.5 sürümünde kullanımdan kaldırıldı ve 4.0’da kaldırılması planlanıyor.
Makine öğrenimi uygulamalarını Docker ve Kubernetes ile nasıl konteynerize edeceğinizi How to Containerize an Application Using Docker eğitimimizle öğrenin.
KRaft modu: Kafka’nın mimarisini sadeleştirme
Kafka, 2.8 sürümünden itibaren KRaft modunu tanıttı; bu sayede küme eşgüdümünü Zookeeper’a ihtiyaç duymadan dahili olarak yönetebiliyor ve 3.3 sürümünde üretim için hazır ilan edildi. Bu değişim, dağıtımları basitleştirir ve yönetilmesi gereken bileşen sayısını azaltır.
Docker Compose kullanarak KRaft modunda Kafka kurmak için:
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
Bu yapılandırma, KRaft modunda tek düğümlü bir Kafka kümesi kurar ve Zookeeper ihtiyacını ortadan kaldırır.
Docker’ın olmazsa olmazları
Kafka’yı Docker ile çalıştırmak için yalnızca birkaç temel bileşene ihtiyacınız var: Docker Engine (çalışma zamanı) ve çoğunlukla çoklu konteyner yönetimi için Docker Compose.
Compose dosyaları, birden fazla servisi (Kafka, Zookeeper, Kafka UI vb.), bunların ağlarını, ortam değişkenlerini ve depolama bağlarını belirtmenizi sağlar. Docker’ın ağ yapısı, her broker’a kendi konteynerını, host adını ve portlarını vererek tek bir makinede bile çoklu broker kümelerini taklit etmeyi mümkün kılar.
Docker’ı öğrenmenin en iyi yollarından biri projelerle pratik yapmaktır. Şu 10 Docker Proje Fikri ile pratik yapın.
Docker Compose ile Kafka Kurulumu
Docker Compose, birbiriyle etkileşen birden çok konteyner gerektiren uygulamaları çalıştırmanın sıklıkla tercih edilen yoludur. Kabuk betikleri veya manuel komutlarla uğraşmak yerine Compose, tüm servisleri ve bağlantılarını tek bir YAML dosyasında tanımlamanıza olanak tanır.
Bu yaklaşım yapılandırma sapmasını azaltır, işe alıştırmayı hızlandırır ve herkesin geliştirme için aynı yığını kullanmasını garanti eder.
Minimal Compose kurulumu
Yerel geliştirme için Kafka ve Zookeeper’ı başlatan basit bir docker-compose.yml şöyle:
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:
Bu minimal kurulum, ilgili portları eşler, Kafka’yı Zookeeper’a bağlar ve konteynerlar yeniden başlarsa mesajların kaybolmaması için bir Docker birimini bağlar. Broker kimliği, dinleyici adresleri ve servisler arası bağlantı uç noktalarını yapılandırmak için ortam değişkenlerini kullandığınızdan emin olun.
Kafka’yı iyi anlamak, veri mühendisliği mülakatlarında başarı için kritiktir. Bir sonraki veri mühendisliği mülakatınıza, bu 20 Kafka Mülakat Sorusu ile hazırlanın.
Genişletilmiş yapılandırma
Profesyonel kurulumlar genellikle mesajları yönetmeyi ve incelemeyi kolaylaştırmak için Kafka UI, Schema Registry veya REST Proxy gibi araçlar ekler. Bunlar compose dosyanızdaki services bloğuna eklenebilir. Örneğin:
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: "Local"
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: "kafka:9092"
Kafka konularını ve günlüklerini yeniden başlatmalar arasında kalıcı kılmak, kurtarma senaryolarını veya uzun süre çalışan işlerini test etmek için gereklidir. Her broker için /var/lib/kafka/data ve eğer kullanılıyorsa Zookeeper için /var/lib/zookeeper konumlarına Docker birimleri bağlamayı unutmayın.
Doğru imajı seçmek kilittir. Hızlı bir özet:
|
Kafka Docker İmajı |
Bakımcı |
Özellikler |
En İyi Kullanım Senaryosu |
|
Confluent |
Confluent |
Tam set, çok sayıda eklenti |
Üretime yakın kurulumlar, ileri düzey testler |
|
Bitnami |
Bitnami |
Temiz, minimal |
Yerel geliştirme, kaynak kısıtlı ortamlar |
|
Apache Kafka (KRaft) |
Apache |
Zookeeper’sız, sadeleştirilmiş kurulum |
Modern dağıtımlar, sade mimari |
How to Learn Apache Kafka in 2025 eğitimi, Kafka hakkında daha fazla ayrıntıya giriyor; arasında şunlar var
- Apache Kafka’yı popüler kılan nedir?
- Apache Kafka’nın temel özellikleri
- Apache Kafka’nın çeşitli kullanım alanları
Docker’da Kafka ile Etkileşim
Kafka Docker Compose ile çalışır hale geldiğinde, tıpkı standart bir dağıtımda olduğu gibi anında konu oluşturabilir ve veri gönderebilirsiniz.
CLI erişimi ve Kafka komutları
docker-compose exec veya docker exec kullanarak Kafka CLI araçlarını çalıştırın. Örneğin bir konu oluşturmak için şunu çalıştırabilirsiniz:
docker-compose exec kafka kafka-topics.sh --create --topic demo --bootstrap-server localhost:9092
kafka-console-producer.sh ve kafka-console-consumer.sh araçlarını da aynı şekilde kullanabilirsiniz. Bu, yerel ortamınızı kirletmeden entegrasyon testi veya denemeler için hızlı bir geri bildirim döngüsü sağlar.
Uygulamalardan programatik erişim
Uygulamalar ve betikler, containerize Kafka’nıza host’un duyurduğu bootstrap sunucuları üzerinden bağlanabilir. Yerel uygulamalar için bootstrap.servers=localhost:9092 veya eşdeğerini ayarlayın.
Yaygın istemciler arasında Python, Java, NodeJS ve Go için resmi Kafka kütüphaneleri bulunur. Uygulamanızın ağ katmanının doğru port ve adreslere ulaşabildiğinden emin olun.
Docker Ağ Yapısı ve Kafka Bağlanabilirliği
Kafka’nın ağ yapılandırması sıklıkla zorluk çıkarır. Dahili ve harici dinleyicileri ve servislerin nasıl dışa açılacağını anlamak hayati önem taşır.
Dahili ve harici dinleyiciler
Kafka broker’ları, istemci bağlantılarını kontrol etmek için dinleyiciler kullanır. İki yaygın kurulum şunlardır:
PLAINTEXT://:9092yerel, güvenli olmayan trafik için; özellikle geliştirmede- Şifreli veya kimliği doğrulanmış bağlantılar için
SSLveyaSASL_SSLdinleyiciler
docker-compose içinde doğru portları dışa açın ve KAFKA_ADVERTISED_LISTENER’ların uygulamalarınızın kullandığı gerçek host ve porta uyduğundan emin olun. Bir VM’de veya bulutta çalışıyorsanız bu yapılandırmayı genel IP ve eşlenen porta ayarlayın.
|
Boyut |
Dahili Dinleyici |
Harici Dinleyici |
|
Yaygın Protokol |
PLAINTEXT://:9092 |
SSL://, SASL_SSL:// veya eşlenen PLAINTEXT:// |
|
Güvenlik |
Şifrelenmemiş, kimlik doğrulaması yok |
Şifreli ve/veya kimliği doğrulanmış |
|
Tipik Kullanım |
Yerel geliştirme, konteynerlar arası trafik |
Uzak istemciler, bulut VM’leri, üretim erişimi |
|
Docker Compose Kurulumu |
9092 portunu ağ içinde açın |
9092’yi host’a eşleyin, KAFKA_ADVERTISED_LISTENERS’ı genel IP’ye ayarlayın |
|
Yapılandırma Odağı |
Basitlik ve hız |
Güvenilirlik, güvenlik, genel erişim |
|
Ağ Kapsamı |
Localhost veya dahili Docker ağı |
Genel IP veya dışa dönük alan adı |
Çeşitli istemci erişimleri için birden fazla dinleyici yapılandırma
Docker ortamlarında farklı istemci erişim senaryolarını yönetmek için birden fazla dinleyici kurmak yaygındır:
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
Bu kurulum, dahili Docker istemcilerinin INTERNAL dinleyicisi üzerinden, harici istemcilerin ise EXTERNAL dinleyicisi üzerinden bağlanmasına olanak tanır.
Bağlantı sorunlarını giderme
Yaygın hatalar arasında ‘broker not available’, ‘connection refused’ veya istemci zaman aşımları bulunur. Şunları doğrulayın:
- Portlar doğru şekilde açılmış ve eşlenmiş mi
- Broker’ın duyurulan dinleyicileri, istemcinizin hedef adresiyle eşleşiyor mu
- Tüm konteynerlar
docker-compose psile sağlıklı mı - Konteynerlar arasında DNS çözümlemesi çalışıyor mu (servis adını kullanın, örn.
kafka:9092) - Konteynerlar arası bağlantıları hata ayıklamak için docker network inspect deneyin
Üretime Benzer Ortamlarda Kafka Docker
Yerel testlerin ötesinde, Dockerize Kafka ortamları aşamalı ortamlar ve CI/CD için de yardımcıdır.
Konteyner orkestrasyon stratejileri
Docker Swarm ve Kubernetes gibi orkestratörler, çoklu broker Kafka kurulumlarını, yuvarlanan güncellemeleri ve servis keşfini yönetebilir. Her broker kendi konteynerını alır ve kalıcı depolama eklenir.
Kubernetes’te StatefulSet’ler sıralı dağıtımı yönetir ve her broker için sabit DNS adları oluşturur.
Günlükleme ve izleme
Kafka günlüklerini analiz için Docker log sürücüsüne veya harici depolamaya yönlendirin. Birçok ekip, sorun gidermek için günlükleri Elasticsearch, Loki veya Splunk’a aktarır. Küme izlemesi için Dockerize Kafka’yı Prometheus ve Grafana ile eşleştirin.
Docker’da Kafka için Optimizasyon İpuçları
Kafka’nın performansı dikkatli kaynak ve depolama yönetimine bağlıdır.
Kaynak tahsisi
Her broker konteynerına üretime mümkün olduğunca yakın CPU, RAM ve disk verin. Docker kaynak sınırlarını ayarlayın ve yığın belleği ile çöp toplayıcı ayarları için KAFKA_JVM_PERFORMANCE_OPTS ile JVM seçenekleri geçin.
Kalıcı depolama
/var/lib/kafka/data ve /var/lib/zookeeper için her zaman Docker birimleri veya bind mount’lar kullanın; veriyi konteyner içinde tutmak yeniden başlatmalarda kayba yol açar ve dayanıklılık testlerini boşa çıkarır. Yüksek disk aktarım hızı, özellikle CI/CD yük testlerinde sürdürülebilir performans için kritiktir.
En İyi Uygulamalar ve Yaygın Tuzaklar
İstikrar, sürdürülebilirlik ve ekip verimliliği birkaç en iyi uygulamadan fayda görür.
Yapılandırma yönetimi
Gizleri ve yapılandırmaları haricen .env dosyalarıyla veya bağlanan yapılandırma dizinleriyle yönetin. Hassas verileri asla compose YAML’ınıza sabitlemeyin. Yeniden kullanılan kurulumlar için şablonlama araçlarını veya yapılandırma yönetimi çerçevelerini düşünün.
Yaygın hatalar
Yaygın hatalardan kaçınma
- Veriyi konteyner içinde saklamayın; her zaman birimleri bağlayın
- Host’unuzda port çakışmalarını kontrol edin
- Varsayılan yönetici parolalarını kullanmaktan kaçının; yerel geliştirme için bile açılan portları güvene alın
- Docker imajlarını güncel tutun; CVE’ler ve kullanım dışı bağımlılıklar için yamalayın
Kafka Güvenliğini Güçlendirme
Kafka dağıtımınızı güvene almak için:
- TLS Şifrelemesini Etkinleştirin: Tüm bağlantılar için SSL/TLS yapılandırarak aktarım halindeki veriyi koruyun.
- Kimlik Doğrulama Uygulayın: İstemcileri doğrulamak için SASL mekanizmalarını (örn. SCRAM, GSSAPI) kullanın.
- Yetkilendirme Kurun: İstemci izinlerini kontrol etmek için Access Control List (ACL) tanımlayın.
- Kimlik Bilgilerini Düzenli Olarak Döndürün: Parolaları ve anahtarları riski en aza indirmek için periyodik olarak değiştirin.
- İzleyin ve Denetleyin: Küme içindeki erişimi ve değişiklikleri takip etmek için denetim günlüklerini etkinleştirin
Sonuç
Docker, entegrasyon, öğrenme veya üretime benzer testler için Apache Kafka kümelerini başlatmayı, ayarlamayı ve denemeyi son derece kolaylaştırır. Konteynerlar sizi host işletim sistemi sorunları ve bağımlılık uyumsuzluklarından yalıtır; geliştirme ve test ortamlarınızın beklentilerinize uygun olduğuna dair güven sağlar. Basit yerel kümelerden orkestre edilmiş Kafka platformlarına doğru büyürken, sağlam Docker kurulumlarına ve en iyi uygulamalara yatırım yapmak ekibinize zaman ve hayal kırıklığından tasarruf sağlayacaktır.
Kafka ve Docker hakkında daha fazla bilgi için kapsamlı kurslarımızdan bazılarına göz atın:
Docker Kafka SSS
Docker’da Kafka çalıştırmak için Zookeeper’a ihtiyacım var mı?
Gerekli değil. Geleneksel Kafka kurulumları Zookeeper’a dayanırken, daha yeni sürümler KRaft modunu destekler ve küme eşgüdümünü dahili hale getirerek Zookeeper ihtiyacını ortadan kaldırır. Ancak birçok Docker Compose örneği uyumluluk ve kararlılık için varsayılan olarak hâlâ Zookeeper kullanır. ZooKeeper 3.5 sürümünde kullanımdan kaldırıldı ve 4.0’da kaldırılması planlanıyor.
Docker’da Kafka’yı üretim iş yükleri için kullanabilir miyim?
Kubernetes veya Docker Swarm gibi orkestrasyon araçları olmadan dağıtım yapmak mümkün olsa da her zaman önerilmez. Üretimde kalıcılık, izleme, güvenlik, ölçekleme ve failover desteğini göz önünde bulundurun. Docker, geliştirme ve test için idealdir ancak üretim için dikkatli planlama gerektirir.
Docker kullanırken Kafka istemcim neden bağlantı hataları alıyor?
İstemci bağlantı sorunlarının çoğu yanlış KAFKA_ADVERTISED_LISTENERS ayarlarından kaynaklanır. Dinleyici değerinin, istemcinin bağlanmak için kullandığı adresi yansıttığından (örn. yerel geliştirme için localhost:9092) ve Docker portlarının doğru şekilde açıldığından emin olun.
Hangi Kafka Docker imajını kullanmalıyım: Confluent, Bitnami mi yoksa Apache mi?
Tam özellikli kurulumlar ve ileri düzey testler için Confluent imajını, sade yerel geliştirme için Bitnami’yi, minimal ve özelleştirilebilir yapılar için Apache’yi kullanın. Kullanım durumunuza, kaynak gereksinimlerinize ve güvenlik ihtiyaçlarınıza göre seçin.
Kafka konteyner yeniden başlatmalarında veriyi nasıl kalıcı kılarım?
Her zaman /var/lib/kafka/data ve (kullanılıyorsa) /var/lib/zookeeper konumlarına eşlenen Docker birimleri veya bind mount’lar kullanın. Konteyner dosya sistemleri geçicidir; harici depolama olmadan tüm mesajlar ve konular yeniden başlatmalarda kaybolur.

