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