Genel
2026-03-18
9 dk okuma
9 görüntülenme
Docker ve Kubernetes ile Uygulama Nasıl Deploy Edilir?
Docker ve Kubernetes ile bir uygulamayı deploy etmek, modern bulut-native geliştirme akışının en yaygın yollarından biridir. Aşağıda 2025-2026 yıllarında en çok kullanılan pratik akışı adım adım anlatıyorum (hem öğrenme hem de üretim ortamı için geçerli).
Docker ve Kubernetes ile bir uygulamayı deploy etmek, modern bulut-native geliştirme akışının en yaygın yollarından biridir. Aşağıda 2025-2026 yıllarında en çok kullanılan pratik akışı adım adım anlatıyorum (hem öğrenme hem de üretim ortamı için geçerli).
Gerçekçi Modern Deploy Akışı (En Yaygın Yol – 2025/2026)
| Adım | Ne Yapılır? | Araçlar / Komut Örnekleri | Notlar / Önemli Noktalar |
|---|---|---|---|
| 1 | Uygulamayı containerize et | Dockerfile → docker build | En kritik adım burası |
| 2 | Image'ı registry'ye push et | Docker Hub, GitHub Container Registry, Harbor, ECR, ACR, GCR… | Kubernetes private registry kullanıyorsa secret gerekir |
| 3 | Kubernetes cluster hazırla | Minikube, kind, k3s, Docker Desktop K8s, GKE, EKS, AKS… | Yerelde test → Minikube veya kind önerilir |
| 4 | Deployment YAML oluştur | deployment.yaml | Replicas, image tag, env, resources tanımlanır |
| 5 | Service YAML oluştur | service.yaml (genelde ClusterIP → LoadBalancer/NodePort) | Dışarıya açmak istiyorsan type: LoadBalancer |
| 6 | kubectl ile uygula | kubectl apply -f deployment.yaml | --dry-run=client -o yaml ile test etmeyi unutma |
| 7 | Durumu kontrol et | kubectl get all, kubectl describe pod/xxx, kubectl logs | Pod'lar CrashLoopBackOff olmamalı |
| 8 | Uygulamaya ulaş | minikube service ..., kubectl port-forward veya Ingress | Gerçek ortamda Ingress + cert-manager kullanılır |
Basit Bir Örnek – Node.js Uygulaması (Tam Akış)
1. Proje yapısı (örnek)
text
my-app/
├── src/
│ └── index.js
├── package.json
└── Dockerfile
index.js
JavaScript
const http = require('http');
const os = require('os');
const server = http.createServer((req, res) => {
res.writeHead(200);
res.end(`Merhaba! Host: ${os.hostname()} - ${new Date().toISOString()}`);
});
server.listen(3000, () => console.log("3000 portunda çalışıyor..."));
Dockerfile (multi-stage önerilir ama basit hali)
dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]
2. Image oluştur ve push et
Bash
# Build
docker build -t ayhan/my-node-app:1.0.0 .
# Test et
docker run -p 3000:3000 ayhan/my-node-app:1.0.0
# Push (önce docker login yapmış olmalısın)
docker push ayhan/my-node-app:1.0.0
3. Kubernetes manifest dosyaları
deployment.yaml
YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-node-app
labels:
app: node-app
spec:
replicas: 3
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: app
image: ayhan/my-node-app:1.0.0
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
service.yaml (dışarı açmak için)
YAML
apiVersion: v1
kind: Service
metadata:
name: my-node-app-service
spec:
type: LoadBalancer # Minikube'da LoadBalancer → NodePort gibi davranır
selector:
app: node-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
4. Deploy etme komutları
Bash
# Yerelde kubernetes çalıştır (örnek: minikube)
minikube start
# Uygula
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
# İzle
kubectl get pods -w
kubectl get svc
# Minikube ile aç
minikube service my-node-app-service --url
# veya port-forward (her zaman çalışır)
kubectl port-forward svc/my-node-app-service 3000:80
# → tarayıcıda localhost:3000
En Sık Yapılan Hatalar & Çözümleri (2026'da hâlâ geçerli)
| Hata | Çözüm Önerisi |
|---|---|
| ImagePullBackOff | kubectl describe pod → secret yok / yanlış registry / tag hatalı |
| CrashLoopBackOff | kubectl logs pod-adi → uygulama içindeki hata (env eksik, port yanlış vs.) |
| Service'e ulaşamıyorum | type: LoadBalancer yerine NodePort dene veya minikube tunnel çalıştır |
| Podlar hazır olmuyor | readinessProbe / livenessProbe ekle, resources tanımla |
| Her deploy'da aynı tag kullanmak | :latest yerine semantic versioning :v1.2.3 veya Git SHA kullan |
Üretimde Kullanılan Modern Yaklaşımlar (2025-2026 trendleri)
- GitOps → ArgoCD / Flux
- Image tag stratejisi → :main-<short-sha> veya :v1.2.3
- Helm Chart veya Kustomize
- Ingress + cert-manager + external-dns
- HorizontalPodAutoscaler (HPA)
- Pod Disruption Budget (PDB)
- Canary / Blue-Green deployment (Argo Rollouts / Flagger)