Makale

Docker ve Kubernetes ile Konteynerleştirme

Docker ve Kubernetes ile Konteynerleştirme

Containerization has revolutionized how we build, ship, and run software. Konteynerler, uygulamaları bağımlılıklarıyla birlikte hafif, taşınabilir birimler halinde paketleyerek "makinemde çalışıyor" sorununu çözer ve geliştirme, test ve üretim ortamlarında tutarlı dağıtım sağlar.

3 dk okumaDil: TR TürkçeÜcretsiz0 alkış0 yorum
TeknolojiMühendislik MakaleleriDevOpsDockerKubernetesTechnologyEngineering ArticlesContainerization
Okuma seçenekleri

giriiş

Containerization has revolutionized how we build, ship, and run software. Konteynerler, uygulamaları bağımlılıklarıyla birlikte hafif, taşınabilir birimler halinde paketleyerek "makinemde çalışıyor" sorununu çözer ve geliştirme, test ve üretim ortamlarında tutarlı dağıtım sağlar.

Docker konteynerleri erişilebilir hale getirdi. Kubernetes bunları geniş ölçekte yönetilebilir hale getirdi. Together, they form the backbone of modern cloud-native application deployment.


Konteynerler Nelerdir?

Konteynerler ve Sanal Makineler

┌───────────────────────┐  ┌───────────────────────┐
│    Virtual Machine     │  │      Container         │
├───────────────────────┤  ├───────────────────────┤
│  ┌─────────────────┐  │  │  ┌─────────────────┐  │
│  │   Application   │  │  │  │   Application   │  │
│  ├─────────────────┤  │  │  ├─────────────────┤  │
│  │   Guest OS      │  │  │  │   Dependencies   │  │
│  │   (full kernel) │  │  │  ├─────────────────┤  │
│  ├─────────────────┤  │  │  │   Container      │  │
│  │   Hypervisor    │  │  │  │   Runtime        │  │
│  ├─────────────────┤  │  │  ├─────────────────┤  │
│  │   Host OS       │  │  │  │   Host OS        │  │
│  └─────────────────┘  │  │  │   Kernel (shared)│  │
└───────────────────────┘  │  └─────────────────┘  │
                           └───────────────────────┘
Özellik VM Konteyner
Önyükleme zamanı dakika Milisaniye
Boyut GB'ler MB'ler
İşletim sistemi yükü VM başına tam işletim sistemi Paylaşılan çekirdek
İzolasyon Güçlü (donanım düzeyinde) Süreç düzeyi
Performans Yerele yakın Yerele yakın
Taşınabilirlik İyi Harika
Yoğunluk Düşük (ana bilgisayar başına 10-100) Yüksek (ana bilgisayar başına 100-1000)

Docker: Konteyner Platformu

Anahtar Kavramlar

Konsept Tanım
Resim Kapsayıcı oluşturmaya yönelik talimatları içeren salt okunur bir şablon
Konteyner Bir görüntünün çalıştırılabilir bir örneği
Docker dosyası Görüntü oluşturma talimatlarını içeren bir metin dosyası
Kayıt Görüntüler için depolama ve dağıtım (Docker Hub, ECR, GCR)
Hacim Konteyner dosya sisteminin dışında kalıcı veri depolama
Ağ Konteynerler ve dış dünya arasındaki iletişim
Oluştur Çok konteynerli uygulamaları tanımlayın ve çalıştırın

Dockerfile En İyi Uygulamaları

# 1. Use specific base images (not 'latest')
FROM node:20-alpine AS builder

# 2. Set working directory
WORKDIR /app

# 3. Copy dependency files first (leverage layer caching)
COPY package*.json ./
RUN npm ci --production

# 4. Copy application code last
COPY . .

# 5. Use multi-stage builds
FROM node:20-alpine AS production
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist

# 6. Run as non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

# 7. Expose only necessary ports
EXPOSE 3000

# 8. Use exec form of CMD
CMD ["node", "dist/server.js"]

Docker Komutları Hile Sayfası

# Build image
docker build -t myapp:1.0 .

# Run container
docker run -d --name myapp -p 3000:3000 myapp:1.0

# Execute command in running container
docker exec -it myapp bash

# View logs
docker logs -f myapp

# List containers
docker ps -a

# Stop and remove
docker stop myapp && docker rm myapp

# Volumes (persistent data)
docker volume create data-volume
docker run -v data-volume:/app/data myapp:1.0

# Compose (multi-service)
docker compose up -d
docker compose logs -f
docker compose down

Docker Ağı

# docker-compose.yml
version: '3.8'
services:
  web:
    image: myapp:latest
    ports:
      - "3000:3000"
    networks:
      - frontend
      - backend
    depends_on:
      - api
      - db

  api:
    image: api:latest
    networks:
      - backend
    environment:
      - DB_HOST=db

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_password

networks:
  frontend:
  backend:

volumes:
  postgres_data:

secrets:
  db_password:
    file: ./secrets/db_password.txt

Kubernetes: Konteyner Düzenlemesi

Kubernetes (K8s), bir küme genelinde kapsayıcıya alınmış uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini otomatikleştirir.

Mimarlık

┌──────────────────────────────────────────────┐
│            Kubernetes Control Plane          │
│  ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│  │ API      │ │ Scheduler│ │ Controller   │ │
│  │ Server   │ │          │ │ Manager      │ │
│  └──────────┘ └──────────┘ └──────────────┘ │
│  ┌─────────────────────────────────────────┐│
│  │ etcd (distributed key-value store)      ││
│  └─────────────────────────────────────────┘│
└─────────────────┬────────────────────────────┘
                  │
┌─────────────────▼────────────────────────────┐
│                Worker Nodes                   │
│  ┌──────────────────────────────────────────┐│
│  │ Node 1                                   ││
│  │  ┌──────┐ ┌──────┐ ┌──────┐             ││
│  │  │ Pod  │ │ Pod  │ │ Pod  │             ││
│  │  └──────┘ └──────┘ └──────┘             ││
│  │  ┌────────────────────────────────────┐ ││
│  │  │ kubelet ││ kube-proxy ││ container │ ││
│  │  │         ││            ││  runtime  │ ││
│  │  └────────────────────────────────────┘ ││
│  └──────────────────────────────────────────┘│
│  ┌──────────────────────────────────────────┐│
│  │ Node 2 (same structure)                  ││
│  └──────────────────────────────────────────┘│
└──────────────────────────────────────────────┘

Çekirdek Kubernetes Nesneleri

Pod — En Küçük Konuşlandırılabilir Birim

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
    - name: myapp-container
      image: nginx:1.25
      ports:
        - containerPort: 80
      resources:
        requests:
          memory: "128Mi"
          cpu: "250m"
        limits:
          memory: "256Mi"
          cpu: "500m"

Dağıtım - Bildirime Dayalı Kapsül Yönetimi

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:1.0
          ports:
            - containerPort: 3000
          livenessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /ready
              port: 3000
            initialDelaySeconds: 3
            periodSeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1

Hizmet — Kararlı Ağ Erişimi

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 3000
      protocol: TCP
  type: ClusterIP  # Internal access only
---
# For external access:
apiVersion: v1
kind: Service
metadata:
  name: myapp-loadbalancer
spec:
  selector:
    app: myapp
  ports:
    - port: 80
      targetPort: 3000
  type: LoadBalancer

Giriş — HTTP/HTTPS Yönlendirmesi

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web-service
                port:
                  number: 80

ConfigMap ve Gizli — Yapılandırma

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  DB_HOST: postgres-service
  LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: c3VwZXJzZWNyZXQ=  # base64 encoded

Bir Uygulamayı Dağıtma

# Apply configurations
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

# Check status
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get ingress

# View logs
kubectl logs -f deployment/myapp-deployment

# Scale
kubectl scale deployment/myapp-deployment --replicas=5

# Rollout update
kubectl set image deployment/myapp-deployment myapp=myapp:2.0
kubectl rollout status deployment/myapp-deployment

# Rollback if needed
kubectl rollout undo deployment/myapp-deployment

Kubernetes Gelişmiş Özellikleri

Yatay Kapsül Otomatik Ölçekleyici (HPA)

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: myapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp-deployment
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 80

Kalıcı Hacimler

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-claim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: standard
---
apiVersion: v1
kind: Pod
metadata:
  name: postgres
spec:
  containers:
    - name: postgres
      image: postgres:16-alpine
      volumeMounts:
        - mountPath: /var/lib/postgresql/data
          name: postgres-storage
  volumes:
    - name: postgres-storage
      persistentVolumeClaim:
        claimName: data-claim

Ad alanları

# Create namespaces for environment isolation
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production

# Deploy to specific namespace
kubectl apply -f deployment.yaml -n production

# Resource quotas per namespace
kubectl create quota prod-quota --hard=cpu=40,memory=80Gi,pods=50 -n production

Docker vs. Kubernetes — Ne Zaman Kullanılmalı?

Senaryo Yalnız Docker Kubernetes'i ekleyin
Yerel kalkınma ✅ Evet ❌ Aşırı öldürme
Tek sunucu dağıtımı ✅ Evet ❌ Aşırı öldürme
2-3 mikro hizmet ✅ Docker Oluşturma ❌ Genellikle aşırı
Yüksek kullanılabilirlik gerekli ❌ Manuel yük devretme ✅ Otomatik iyileştirme
Otomatik ölçeklendirme gerekiyor ❌ Manuel ✅HPA
Çok düğümlü küme ❌ Sınırlı ✅ Yerleşik
Devam eden güncellemeler ❌ Manuel ✅ Yerleşik
Kanarya dağıtımları ❌ Kompleks ✅ Yerel destek
Çoklu bulut ❌ Taşınabilir değil ✅ Taşınabilir

Karar çerçevesi:

  1. Docker ile başlayın - Her zaman. Konteynerler temeldir.
  2. Docker Compose'u kullanın — Yerel geliştirme, CI ve tek ana bilgisayar dağıtımları için.
  3. Kubernetes'i şu durumlarda kullanın: HA'ya, ölçeklendirmeye, çok düğümlü veya karmaşık düzenlemeye ihtiyacınız varsa.
  4. Yönetilen Kubernetes'i kullanın (EKS, AKS, GKE) — Kontrol düzlemini kendi kendine yönetmekten kaçının.

En İyi Uygulamalar

İmaj Oluşturma

  • Belirli temel resim etiketleri kullanın ("node:20-alpine", "node:latest" değil).
  • Görüntü boyutunu en aza indirmek için çok aşamalı derlemeler uygulayın.
  • Görüntüleri güvenlik açıklarına karşı tarayın: docker tarama myapp:1.0.
  • İmza görselleri: cosign işareti --key cosign.key uygulamam:1.0.

Güvenlik

  • Kapsayıcıları root olmayan kullanıcılar olarak çalıştırın.
  • Salt okunur kök dosya sistemini ayarlayın: readOnlyRootFilesystem: true.
  • Hassas veriler için ortam değişkenleri yerine gizli dizileri kullanın.
  • Kapsüller arasındaki trafiği kısıtlamak için ağ politikalarını uygulayın.
  • Kubernetes API erişimi için RBAC'i etkinleştirin.

Kaynak Yönetimi

  • Her zaman kaynak isteklerini ve sınırlarını ayarlayın.
  • Ad alanı başına kaynak kotalarını kullanın.
  • Otomatik ölçeklendirme için HPA uygulayın.
  • Bakım sırasında kullanılabilirlik için PodDisruptionBudget'ı kullanın.

İzleme ve Gözlemlenebilirlik

# Sidecar pattern for logging
spec:
  containers:
    - name: app
      image: myapp:latest
    - name: log-collector
      image: fluentd:latest
      volumeMounts:
        - name: logs
          mountPath: /var/log/app

CI/CD Boru Hattı

# GitHub Actions — Build + Deploy to Kubernetes
name: CI/CD
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t registry.example.com/myapp:${{ github.sha }} .
      - name: Push to registry
        run: docker push registry.example.com/myapp:${{ github.sha }}
      - name: Deploy to Kubernetes
        run: |
          kubectl set image deployment/myapp-deployment \
            myapp=registry.example.com/myapp:${{ github.sha }}

Ekosistem

Kategori Aletler
Konteyner Çalışma Süresi Docker, konteyner, CRI-O
Orkestrasyon Kubernetes, Göçebe, Docker Swarm
Paket Yöneticisi Dümen, Özelleştir
Hizmet Ağı Istio, Linkerd, Cilium
İzleme Prometheus + Grafana, Datadog
Günlük kaydı ELK Yığını, Grafana Loki, Fluentd
Güvenlik Trivy, Falco, DPA/Gatekeeper, Kyverno
GitOps ArgoCD, Akı
Geliştirici Araçları Skaffold, Tilt, DevSpace
Depolamak Kale/Ceph, Longhorn, Portworx
K8'lerde sunucusuz Knative, OpenFaaS, KEDA

Çözüm

Docker ve Kubernetes birlikte modern uygulamalar oluşturmak, dağıtmak ve ölçeklendirmek için güçlü bir platform sağlar:

  1. Docker ile başlayın — Uygulamaları kapsayıcı hale getirin, Dockerfiles ve Compose'da uzmanlaşın.
  2. Kubernetes'in temellerini öğrenin - Kapsüller, Dağıtımlar, Hizmetler, ConfigMaps.
  3. Yönetilen Kubernetes'i kullanın — Kontrol düzlemini bulut sağlayıcıların yönetmesine izin verin.
  4. GitOps'u benimseyin — Bildirime dayalı, sürüm kontrollü dağıtımlar için ArgoCD veya Flux.
  5. Gözlemlenebilirliğe yatırım yapın — Geniş ölçekte izleme, günlüğe kaydetme ve izleme önemlidir.

Öğrenme kapsayıcılaştırma ve düzenlemeye yapılan yatırım, dağıtım güvenilirliği, operasyonel verimlilik ve ortamlar arasında uygulama taşınabilirliği açısından fayda sağlar.

Öne Çıkan Makaleler

2026’da Oluşturmaya Değer 50 Claude Skill
EditoryalTR
8 dkÜcretsiz

2026’da Oluşturmaya Değer 50 Claude Skill

Claude Skills, tekrarlanan promptları yeniden kullanılabilir workflow’lara dönüştürebilir. İşte yazma, kodlama, araştırma, iş, üretkenlik, tasarım, analiz ve destek için 50 pratik Claude Skill.

TeknolojiAIAi GuidesAI Agents
0 alkış
Oku
Senior Engineer’lardan Öğrendiğim 6 Kodlama Pattern’i
EditoryalTR
8 dkÜcretsiz

Senior Engineer’lardan Öğrendiğim 6 Kodlama Pattern’i

TeknolojiCodeProgrammingCoding
0 alkış
Oku
Özel Bir Yapay Zeka Not Asistanı Kurun
Öne çıkanTR
9 dkÜcretsiz

Özel Bir Yapay Zeka Not Asistanı Kurun

Markdown notlarını özel taslakları açığa çıkarmadan aranabilir bir asistana dönüştürün.

TeknolojiPlatform RehberleriYapay Zeka YazımıAIAutomationData
0 alkış
Oku

Yorumlar

0 yorum

Henüz onaylı yorum yok. Yeni yanıtlar moderasyon bekleyebilir.