
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.
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.
┌───────────────────────┐ ┌───────────────────────┐
│ 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) |
| 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 |
# 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"]
# 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-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 (K8s), bir küme genelinde kapsayıcıya alınmış uygulamaların dağıtımını, ölçeklendirilmesini ve yönetimini otomatikleştirir.
┌──────────────────────────────────────────────┐
│ 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) ││
│ └──────────────────────────────────────────┘│
└──────────────────────────────────────────────┘
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"
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
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
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
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
# 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
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
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
# 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
| 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:
docker tarama myapp:1.0.cosign işareti --key cosign.key uygulamam:1.0.readOnlyRootFilesystem: true.# Sidecar pattern for logging
spec:
containers:
- name: app
image: myapp:latest
- name: log-collector
image: fluentd:latest
volumeMounts:
- name: logs
mountPath: /var/log/app
# 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 }}
| 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 |
Docker ve Kubernetes birlikte modern uygulamalar oluşturmak, dağıtmak ve ölçeklendirmek için güçlü bir platform sağlar:
Öğ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.
Henüz onaylı yorum yok. Yeni yanıtlar moderasyon bekleyebilir.