Docker ve Kubernetes

Modern konteyner teknolojileri ve orkestrasyon platformları

Docker Nedir?

Docker, uygulamaları konteynerler içinde geliştirmeyi, dağıtmayı ve çalıştırmayı sağlayan açık kaynaklı bir platformdur. Docker, uygulamaları ve bağımlılıklarını bir araya getirerek, taşınabilir ve izole bir birim olarak paketler.

Docker, "bir kez oluştur, her yerde çalıştır" prensibini mümkün kılar ve geliştirme, test ve üretim ortamları arasındaki tutarsızlıkları ortadan kaldırır. Docker'ın temel bileşenleri şunlardır:

  • Docker Engine: Konteyner oluşturma ve çalıştırma işlemlerini gerçekleştiren ana bileşen
  • Docker CLI: Docker ile etkileşim kurmak için kullanılan komut satırı arayüzü
  • Dockerfile: Konteyner imajı oluşturmak için kullanılan yapılandırma dosyası
  • Docker Hub: Konteyner imajlarını depolamak ve paylaşmak için kullanılan merkezi kayıt defteri

Kubernetes Nedir?

Kubernetes (K8s), konteynerleştirilmiş uygulamaları otomatikleştiren, ölçeklendiren ve yöneten açık kaynaklı bir orkestrasyon platformudur. Google tarafından geliştirilen Kubernetes, büyük ölçekli konteyner dağıtımlarını yönetmek için tasarlanmıştır.

Kubernetes, konteyner uygulamalarının dağıtımını, ölçeklendirilmesini, güncellenmesini ve izlenmesini otomatikleştirir. Kubernetes'in temel bileşenleri şunlardır:

  • Control Plane: Kubernetes kümesini yöneten bileşenler (API Server, etcd, Scheduler, Controller Manager)
  • Node: Konteyner uygulamalarını çalıştıran işçi makineler
  • Pod: Kubernetes'in en küçük dağıtım birimi, bir veya daha fazla konteyner içerebilir
  • Service: Podlara erişim sağlayan soyutlama katmanı
  • Deployment: Podların istenen durumunu tanımlayan ve yöneten kaynak

Docker Temel Kavramlar

Docker İmajları

Docker imajları, uygulamanın çalışması için gereken tüm bileşenleri içeren salt okunur şablonlardır. Bir imaj, bir Dockerfile kullanılarak oluşturulur ve katmanlı bir yapıya sahiptir.

Her katman, Dockerfile'daki bir komutun sonucudur ve değişmez. Bu katmanlı yapı, imajların verimli bir şekilde depolanmasını ve dağıtılmasını sağlar.

Docker Konteynerler

Docker konteynerleri, Docker imajlarının çalıştırılabilir örnekleridir. Bir konteyner, bir imajın üzerine yazılabilir bir katman ekler ve uygulamayı izole bir ortamda çalıştırır.

Konteynerler, kısa ömürlü ve değiştirilebilir olacak şekilde tasarlanmıştır. Bir konteyner çalıştırıldığında, imajın içeriği değişmez, ancak konteyner çalışırken oluşturulan veriler yazılabilir katmanda saklanır.

Docker Volumes

Docker volumes, konteynerlerin oluşturduğu verileri kalıcı hale getirmek için kullanılır. Volumeler, konteyner silinse bile verilerin korunmasını sağlar.

Volumeler, konteynerlerin dosya sisteminden bağımsızdır ve konteynerlerin yeniden başlatılması veya güncellenmesi durumunda verilerin korunmasını sağlar.

Docker Networks

Docker networks, konteynerlerin birbirleriyle ve dış dünya ile iletişim kurmasını sağlar. Docker, farklı ağ modları sunar:

  • Bridge: Varsayılan ağ modu, konteynerlerin birbirleriyle ve ana bilgisayarla iletişim kurmasını sağlar
  • Host: Konteyner, ana bilgisayarın ağ alanını kullanır
  • Overlay: Farklı Docker ana bilgisayarlarındaki konteynerlerin iletişim kurmasını sağlar
  • Macvlan: Konteynerlere fiziksel ağ arayüzü gibi davranır

Kubernetes Temel Kavramlar

Pods

Pod, Kubernetes'in en küçük dağıtım birimidir. Bir pod, bir veya daha fazla konteyner içerebilir ve bu konteynerler aynı ağ alanını ve depolama alanını paylaşır.

Podlar, geçici ve değiştirilebilir olacak şekilde tasarlanmıştır. Bir pod başarısız olduğunda, Kubernetes otomatik olarak yeni bir pod oluşturabilir.

Services

Service, podlara erişim sağlayan soyutlama katmanıdır. Serviceler, podların IP adreslerinin ve yaşam döngülerinin değişmesine rağmen, uygulamalara tutarlı bir erişim noktası sağlar.

Kubernetes, farklı service türleri sunar:

  • ClusterIP: Küme içi erişim için
  • NodePort: Küme dışından erişim için
  • LoadBalancer: Dış yük dengeleyici kullanarak erişim için
  • ExternalName: DNS adı kullanarak erişim için

Deployments

Deployment, podların istenen durumunu tanımlayan ve yöneten kaynaktır. Deploymentlar, podların sayısını, imajını ve yapılandırmasını belirtir.

Deploymentlar, uygulamaların güncellenmesi, ölçeklendirilmesi ve geri alınması gibi işlemleri kolaylaştırır. Bir deployment güncellendiğinde, Kubernetes otomatik olarak podları günceller ve eski podları yenileriyle değiştirir.

ConfigMaps ve Secrets

ConfigMap ve Secret, uygulamaların yapılandırma verilerini ve hassas bilgilerini depolamak için kullanılan kaynaklardır.

  • ConfigMap: Yapılandırma verilerini anahtar-değer çiftleri olarak depolar
  • Secret: Hassas bilgileri (şifreler, API anahtarları vb.) base64 kodlanmış olarak depolar

Bu kaynaklar, uygulamaların yapılandırma verilerini ve hassas bilgilerini konteyner imajlarından ayırmayı sağlar.

Docker vs. Kubernetes

Özellik Docker Kubernetes
Temel İşlev Konteyner oluşturma ve çalıştırma Konteyner orkestrasyonu ve yönetimi
Ölçeklenebilirlik Sınırlı, Docker Swarm ile temel orkestrasyon Yüksek, otomatik ölçeklendirme ve yük dengeleme
Yüksek Kullanılabilirlik Sınırlı, manuel müdahale gerektirir Otomatik yeniden başlatma, kendini iyileştirme
Dağıtım Stratejileri Temel dağıtım yetenekleri Gelişmiş dağıtım stratejileri (rolling update, blue-green, canary)
Karmaşıklık Daha basit, öğrenmesi kolay Daha karmaşık, öğrenmesi zor
Kullanım Senaryosu Küçük ölçekli uygulamalar, geliştirme ortamları Büyük ölçekli, karmaşık uygulamalar, üretim ortamları

Docker Komut Örnekleri

Temel Docker Komutları

# İmaj oluşturma
docker build -t myapp:1.0 .

# Konteyner çalıştırma
docker run -d -p 8080:80 --name mycontainer myapp:1.0

# Çalışan konteynerleri listeleme
docker ps

# Tüm konteynerleri listeleme
docker ps -a

# Konteyner durdurma
docker stop mycontainer

# Konteyner silme
docker rm mycontainer

# İmaj listeleme
docker images

# İmaj silme
docker rmi myapp:1.0

# Konteyner loglarını görüntüleme
docker logs mycontainer

# Konteynere bağlanma
docker exec -it mycontainer bash

Kubernetes Komut Örnekleri

Temel Kubernetes Komutları

# Pod oluşturma
kubectl create -f pod.yaml

# Deployment oluşturma
kubectl apply -f deployment.yaml

# Service oluşturma
kubectl apply -f service.yaml

# Kaynakları listeleme
kubectl get pods
kubectl get deployments
kubectl get services

# Pod detaylarını görüntüleme
kubectl describe pod mypod

# Pod loglarını görüntüleme
kubectl logs mypod

# Poda bağlanma
kubectl exec -it mypod -- bash

# Ölçeklendirme
kubectl scale deployment myapp --replicas=5

# Güncelleme
kubectl set image deployment/myapp myapp=myapp:2.0

# Güncelleme durumunu kontrol etme
kubectl rollout status deployment/myapp

# Güncellemeyi geri alma
kubectl rollout undo deployment/myapp

Kubernetes YAML Örnekleri

Deployment YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "1"
            memory: "512Mi"
          requests:
            cpu: "0.5"
            memory: "256Mi"

Service YAML

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer

DevOps Bültenimize Abone Olun

En son DevOps haberleri, araçları ve best practice'leri hakkında güncel kalın.