Skip to main content
DevOps

Docker ve Kubernetes: Konteyner Teknolojileri Kapsamlı Rehberi

Mart 14, 2026 8 dk okuma 18 views Raw
Docker ve Kubernetes konteyner teknolojileri ile sunucu yönetimi
İçindekiler

Konteyner Teknolojileri Nedir?

Konteyner teknolojileri, yazılım uygulamalarını tüm bağımlılıklarıyla birlikte izole edilmiş ortamlarda paketlemeyi ve çalıştırmayı sağlayan sanallaştırma yöntemidir. Geleneksel sanal makinelerden farklı olarak konteynerler, işletim sistemi çekirdeğini paylaşarak çok daha hafif ve hızlı bir şekilde çalışır. Bu sayede geliştirme, test ve üretim ortamları arasında tutarlılık sağlanır.

Konteyner teknolojisinin temelinde, uygulamaların "bir kez oluştur, her yerde çalıştır" felsefesi yatar. Bir geliştirici bilgisayarında sorunsuz çalışan uygulama, aynı konteyner imajı kullanılarak sunucuda, bulutta veya başka herhangi bir ortamda da aynı şekilde çalışacaktır. Bu tutarlılık, "benim bilgisayarımda çalışıyordu" sorununu ortadan kaldırır.

Konteyner teknolojilerinin sağladığı başlıca avantajlar şunlardır:

  • Taşınabilirlik: Konteynerler herhangi bir platformda çalışabilir
  • Hafiflik: Sanal makinelere göre çok daha az kaynak tüketir
  • Hız: Saniyeler içinde başlatılabilir
  • İzolasyon: Her konteyner kendi bağımlılıklarını taşır
  • Ölçeklenebilirlik: Kolayca çoğaltılabilir ve yönetilebilir

Docker Nedir ve Nasıl Çalışır?

Docker, konteyner teknolojisinin en yaygın kullanılan platformudur. 2013 yılında Solomon Hykes tarafından başlatılan Docker projesi, konteynerleştirme kavramını demokratikleştirmiş ve yazılım dünyasında devrim yaratmıştır. Docker, Linux konteyner teknolojisi (LXC) üzerine inşa edilmiş olup zamanla kendi konteyner çalışma zamanını (containerd) geliştirmiştir.

Docker'ın çalışma prensibi oldukça basittir: bir Dockerfile ile uygulamanızın nasıl paketleneceğini tanımlarsınız, bu tanımdan bir imaj oluşturursunuz ve bu imajdan konteynerler çalıştırırsınız. Her adım tekrarlanabilir ve otomatikleştirilebilirdir.

Docker Temel Kavramları

Docker ekosistemini anlamak için birkaç temel kavramı bilmek gerekir:

  • Docker Image (İmaj): Uygulamanın çalışması için gereken tüm dosyaları, bağımlılıkları ve yapılandırmaları içeren salt okunur şablondur
  • Docker Container (Konteyner): Bir imajın çalışan örneğidir. İmajlardan oluşturulur ve izole bir ortamda çalışır
  • Dockerfile: İmajın nasıl oluşturulacağını tanımlayan metin dosyasıdır
  • Docker Registry: İmajların depolandığı merkezi havuzdur (Docker Hub gibi)
  • Docker Compose: Çoklu konteyner uygulamalarını tanımlamak ve yönetmek için kullanılan araçtır

Dockerfile Yazımı

Dockerfile, bir Docker imajının nasıl oluşturulacağını adım adım tanımlayan bir yapılandırma dosyasıdır. İyi yazılmış bir Dockerfile, imaj boyutunu küçültür ve güvenliği artırır.

# Temel imaj olarak .NET 8 SDK kullanıyoruz
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src

# Proje dosyalarını kopyala ve bağımlılıkları yükle
COPY *.csproj .
RUN dotnet restore

# Kaynak kodunu kopyala ve derle
COPY . .
RUN dotnet publish -c Release -o /app/publish

# Çalışma zamanı imajı
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "MyApp.dll"]

Yukarıdaki örnekte çok aşamalı (multi-stage) derleme kullanılmaktadır. Bu yaklaşım, son imajda yalnızca çalışma zamanı dosyalarının bulunmasını sağlayarak imaj boyutunu önemli ölçüde küçültür.

Docker Compose ile Çoklu Konteyner Yönetimi

Gerçek dünya uygulamaları genellikle birden fazla servisten oluşur: web uygulaması, veritabanı, önbellek, mesaj kuyruğu gibi. Docker Compose, bu servisleri tek bir YAML dosyasında tanımlamanızı ve birlikte yönetmenizi sağlar.

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8080:80"
    depends_on:
      - db
      - redis
    environment:
      - ConnectionStrings__Default=Server=db;Database=myapp;User=sa;Password=Pass123!

  db:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Pass123!
    volumes:
      - sqldata:/var/opt/mssql

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  sqldata:

Bu yapılandırma ile docker-compose up komutu çalıştırıldığında üç servis birlikte ayağa kalkacaktır.

Kubernetes Nedir?

Kubernetes (kısaca K8s), Google tarafından geliştirilen ve şu anda Cloud Native Computing Foundation (CNCF) tarafından yönetilen açık kaynaklı bir konteyner orkestrasyon platformudur. Kubernetes, konteynerleştirilmiş uygulamaların dağıtımını, ölçeklenmesini ve yönetimini otomatikleştirir.

Docker tek bir sunucuda konteynerleri yönetmek için mükemmel olsa da, üretim ortamında yüzlerce veya binlerce konteyneri birden fazla sunucu üzerinde yönetmek gerektiğinde Kubernetes devreye girer. Kubernetes, yüksek kullanılabilirlik, otomatik ölçekleme, yük dengeleme ve kendini iyileştirme gibi kritik özellikleri sağlar.

Kubernetes Mimarisi

Kubernetes mimarisi, kontrol düzlemi (control plane) ve çalışan düğümlerden (worker nodes) oluşur. Bu iki katman birlikte çalışarak konteynerlerin güvenilir ve ölçeklenebilir şekilde çalışmasını sağlar.

Kontrol Düzlemi Bileşenleri:

  • API Server: Kubernetes'in merkezi iletişim noktasıdır. Tüm bileşenler bu sunucu üzerinden haberleşir
  • etcd: Kümenin tüm yapılandırma verilerini depolayan dağıtık anahtar-değer deposudur
  • Scheduler: Yeni oluşturulan pod'ları uygun düğümlere atayan bileşendir
  • Controller Manager: Kümenin istenen durumunu sürdürmekten sorumlu kontrolcüleri çalıştırır

Çalışan Düğüm Bileşenleri:

  • kubelet: Her düğümde çalışan ve pod'ların çalışmasını sağlayan ajandır
  • kube-proxy: Ağ kurallarını yönetir ve servis keşfini sağlar
  • Container Runtime: Konteynerleri çalıştıran motor (containerd, CRI-O gibi)

Pod, Service ve Deployment Kavramları

Kubernetes'te uygulamalar çeşitli kaynak nesneleri kullanılarak tanımlanır ve yönetilir:

Pod: Kubernetes'in en küçük dağıtım birimidir. Bir veya birden fazla konteyneri içerir ve aynı ağ alanını paylaşırlar. Pod'lar geçici yapılardır ve herhangi bir zamanda yeniden oluşturulabilirler.

Service: Pod'lara kararlı bir ağ erişim noktası sağlar. Pod'lar yeniden oluşturulsa bile servis adresi değişmez. ClusterIP, NodePort, LoadBalancer ve ExternalName olmak üzere farklı servis türleri vardır.

Deployment: Pod'ların bildirimsel olarak yönetilmesini sağlar. Kaç kopya çalışacağını, hangi imajın kullanılacağını ve güncelleme stratejisini tanımlar.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
      - name: web-app
        image: myregistry/web-app:v1.2.0
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "128Mi"
            cpu: "250m"
          limits:
            memory: "256Mi"
            cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
  name: web-app-service
spec:
  selector:
    app: web-app
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

Namespace ile Kaynak İzolasyonu

Namespace'ler, Kubernetes kümesini mantıksal olarak bölümlere ayırmanızı sağlar. Farklı ekipler, ortamlar veya projeler için ayrı namespace'ler oluşturabilirsiniz. Bu sayede kaynak kotaları, erişim kontrolleri ve ağ politikaları namespace bazında uygulanabilir.

Yaygın namespace organizasyonu şu şekilde olabilir:

  • development - Geliştirme ortamı
  • staging - Test ortamı
  • production - Üretim ortamı
  • monitoring - İzleme araçları

Konteyner Orkestrasyonu ve Ölçekleme

Konteyner orkestrasyonu, çok sayıda konteynerin koordineli bir şekilde çalıştırılmasını, ölçeklenmesini ve yönetilmesini ifade eder. Kubernetes bu alanda en kapsamlı çözümü sunar.

Yatay Pod Ölçekleme (HPA)

Horizontal Pod Autoscaler (HPA), CPU kullanımı, bellek tüketimi veya özel metrikler gibi kriterlere göre pod sayısını otomatik olarak artırır veya azaltır. Bu sayede uygulama, trafik yoğunluğuna göre dinamik olarak ölçeklenir.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

Küme Ölçekleme

Cluster Autoscaler, mevcut düğümlerin kapasitesi yetersiz kaldığında yeni düğümler ekler ve kullanılmayan düğümleri kaldırır. Bu özellik, bulut sağlayıcılarıyla entegre çalışarak altyapı maliyetlerini optimize eder.

İzleme ve Gözlemlenebilirlik

Konteynerleştirilmiş uygulamaların izlenmesi, geleneksel uygulamalardan farklı yaklaşımlar gerektirir. Konteynerlerin dinamik yapısı nedeniyle merkezi loglama, metrik toplama ve dağıtık izleme çözümleri kullanılmalıdır.

Prometheus ve Grafana

Prometheus, Kubernetes ekosisteminin fiili standart izleme aracıdır. Metrik toplama, depolama ve sorgulama yetenekleri sunar. Grafana ise toplanan metrikleri görselleştirmek için kullanılır.

Prometheus'un temel özellikleri şunlardır:

  • Pull tabanlı metrik toplama modeli
  • PromQL sorgu dili ile güçlü sorgulama
  • Alertmanager ile alarm yönetimi
  • Service discovery ile otomatik hedef keşfi
  • Kubernetes ile native entegrasyon

Merkezi Loglama

Konteyner ortamlarında loglar, EFK (Elasticsearch, Fluentd, Kibana) veya PLG (Promtail, Loki, Grafana) yığınları ile merkezi olarak toplanır ve analiz edilir. Bu sayede geçici konteynerlerin logları kaybolmaz ve sorun tespiti kolaylaşır.

Helm Charts ile Paket Yönetimi

Helm, Kubernetes için bir paket yöneticisidir. Karmaşık Kubernetes uygulamalarını şablonlar ve değerler dosyaları kullanarak paketler ve yönetir. Helm Charts sayesinde uygulamalar kolayca kurulabilir, güncellenebilir ve geri alınabilir.

# Helm chart kurulumu
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-redis bitnami/redis --set auth.password=secretpass

# Özel değerler dosyası ile kurulum
helm install my-app ./my-chart -f values-production.yaml

# Güncelleme
helm upgrade my-app ./my-chart -f values-production.yaml

# Geri alma
helm rollback my-app 1

Helm Charts'ın avantajları:

  • Tekrarlanabilir dağıtımlar sağlar
  • Ortam bazında farklı yapılandırmalar destekler
  • Sürüm yönetimi ve geri alma imkanı sunar
  • Topluluk tarafından hazırlanmış binlerce chart mevcuttur

Docker ve Kubernetes En İyi Uygulamaları

Konteyner teknolojilerini verimli ve güvenli kullanmak için aşağıdaki en iyi uygulamaları takip etmek önemlidir.

Docker En İyi Uygulamaları

  • Küçük temel imajlar kullanın: Alpine tabanlı imajlar tercih edin
  • Çok aşamalı derleme kullanın: Derleme araçlarını son imaja dahil etmeyin
  • Root olmayan kullanıcı ile çalıştırın: Güvenlik için ayrıcalıksız kullanıcı oluşturun
  • Katman önbelleğinden yararlanın: Sık değişen dosyaları Dockerfile'ın sonuna koyun
  • .dockerignore dosyası kullanın: Gereksiz dosyaların imaja dahil edilmesini önleyin
  • İmajları etiketleyin: latest yerine belirli sürüm etiketleri kullanın
  • Güvenlik taraması yapın: Trivy veya Snyk gibi araçlarla imajları tarayın

Kubernetes En İyi Uygulamaları

  • Kaynak limitleri tanımlayın: Her pod için CPU ve bellek limitleri belirleyin
  • Liveness ve readiness probe'ları kullanın: Sağlık kontrollerini yapılandırın
  • Pod Disruption Budget tanımlayın: Bakım sırasında minimum erişilebilirliği garanti edin
  • Network Policy kullanın: Pod'lar arası ağ trafiğini kısıtlayın
  • RBAC yapılandırın: En az ayrıcalık ilkesini uygulayın
  • GitOps yaklaşımını benimseyin: Kubernetes yapılandırmalarını Git'te saklayın
  • Secret yönetimi için harici araçlar kullanın: HashiCorp Vault veya Sealed Secrets tercih edin

Konteyner Güvenliği

Konteyner güvenliği, imaj oluşturma aşamasından çalışma zamanına kadar her aşamada dikkat edilmesi gereken kritik bir konudur.

İmaj Güvenliği

Güvenli konteyner imajları oluşturmak için resmi ve güvenilir temel imajları kullanmak, düzenli güvenlik taramaları yapmak ve imajları imzalamak gerekir. Ayrıca imajlardaki gereksiz paketleri kaldırmak ve minimal imajlar oluşturmak saldırı yüzeyini azaltır.

Çalışma Zamanı Güvenliği

Konteynerler çalışırken de güvenlik önlemleri alınmalıdır. Seccomp profilleri, AppArmor veya SELinux politikaları, read-only dosya sistemleri ve ayrıcalıklı olmayan konteynerler çalışma zamanı güvenliğini artırır. Falco gibi araçlar ise çalışma zamanı tehdit algılama için kullanılabilir.

Sonuç

Docker ve Kubernetes, modern yazılım geliştirme ve dağıtım süreçlerinin temel taşlarıdır. Docker ile uygulamalarınızı taşınabilir konteynerler halinde paketleyebilir, Kubernetes ile bu konteynerleri ölçeklenebilir ve güvenilir bir şekilde yönetebilirsiniz. Konteyner teknolojilerine yatırım yapmak, yazılım teslimat süreçlerinizi hızlandıracak ve altyapı yönetimi maliyetlerinizi düşürecektir.

Konteyner teknolojilerini başarıyla uygulamak için küçük adımlarla başlayın: önce Docker ile uygulamalarınızı konteynerleştirin, ardından Docker Compose ile çoklu konteyner yapılandırmaları oluşturun ve son olarak Kubernetes ile orkestrasyon katmanını ekleyin. Bu kademeli yaklaşım, ekibinizin teknolojiye adapte olmasını kolaylaştıracaktır.

Bu yazıyı paylaş