Konteyner teknolojisi, "bende çalışıyor" sorununu kökünden çözdü. Docker, uygulamanı ve tüm bağımlılıklarını izole bir ortama paketler; geliştirme, test ve prodüksiyon ortamları birebir aynı davranır. Bu derste Docker'ın temel kavramlarını öğrenip gerçek bir uygulama konteynerize edeceksin.
Konteyner vs Sanal Makine
// PLAINTEXT //
Sanal Makine: Konteyner:┌─────────────┐ ┌─────────────┐│ App A │ │ App A │├─────────────┤ ├─────────────┤│ Guest OS │ │ │├─────────────┤ │ Container ││ Hypervisor │ │ Runtime │├─────────────┤ ├─────────────┤│ Host OS │ │ Host OS │└─────────────┘ └─────────────┘ ~GB boyut ~MB boyut ~dakika başlangıç ~saniye başlangıç
Konteynerler OS kernel'i paylaşır, bu yüzden çok daha hafif ve hızlıdır.
Docker Kurulum ve İlk Adımlar
// BASH //
# Versiyon kontroldocker --versiondocker compose version# İlk konteyner — Ubuntu shell'idocker run -it ubuntu:24.04 bash# Arka planda çalıştırdocker run -d --name web nginx:alpine# Logları takip etdocker logs -f web# Konteyneri durdur ve sildocker stop web && docker rm web
Dockerfile: Uygulama Paketleme
// DOCKERFILE //
# Node.js API için Dockerfile# Aşama 1: Bağımlılıkları kur (önbellek katmanı)FROM node:20-alpine AS depsWORKDIR /appCOPY package*.json ./RUN npm ci --only=production# Aşama 2: Uygulamayı derleFROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build# Aşama 3: Prodüksiyon imajı (küçük boyut)FROM node:20-alpine AS runnerWORKDIR /app# Güvenlik: root olmayan kullanıcıRUN addgroup --system appgroup && adduser --system --ingroup appgroup appuserCOPY --from=deps /app/node_modules ./node_modulesCOPY --from=builder /app/dist ./distUSER appuserEXPOSE 3000# Healthcheck — konteyner sağlık durumunu raporlarHEALTHCHECK --interval=30s --timeout=3s --start-period=10s \ CMD wget -qO- http://localhost:3000/health || exit 1CMD ["node", "dist/main.js"]
# Named volume — Docker yönetirdocker volume create pgdata# PostgreSQL ile volume kullandocker run -d \ --name postgres \ -e POSTGRES_PASSWORD=gizli \ -e POSTGRES_DB=codeforge \ -v pgdata:/var/lib/postgresql/data \ -p 5432:5432 \ postgres:16-alpine# Bind mount — host dizinini bağla (geliştirme)docker run -d \ --name app \ -v $(pwd)/src:/app/src \ # kaynak kodu canlı güncelle -p 3000:3000 \ codeforge-api:dev
Network: Konteynerler Arası İletişim
// BASH //
# Özel ağ oluşturdocker network create codeforge-net# Aynı ağda çalıştırdocker run -d --name db --network codeforge-net postgres:16-alpinedocker run -d --name redis --network codeforge-net redis:7-alpine# App konteyneri DB ve Redis'e isim ile ulaşırdocker run -d \ --name api \ --network codeforge-net \ -e DATABASE_URL=postgresql://postgres:gizli@db:5432/codeforge \ -e REDIS_URL=redis://redis:6379 \ codeforge-api:1.0.0# İki konteyner arası bağlantı test etdocker exec api ping -c3 db
# Tüm servisleri başlat (arka planda)docker compose up -d# Logları takip etdocker compose logs -f api# Sadece api servisini yeniden başlatdocker compose restart api# Prodüksiyona deploy: imajı güncelledocker compose pull && docker compose up -d# Her şeyi durdur ve temizle (volume hariç)docker compose down# Volume dahil komple temizledocker compose down -v
Geliştirme Ortamı: Hot Reload
// YAML //
# docker-compose.dev.ymlservices: api: build: context: . target: builder # geliştirme aşaması command: npm run dev # nodemon / ts-node-dev volumes: - .:/app - /app/node_modules # node_modules'ü override etme ports: - "3000:3000" - "9229:9229" # Node.js debugger environment: NODE_ENV: development
// BASH //
# Dev compose ile başlatdocker compose -f docker-compose.yml -f docker-compose.dev.yml up
Güvenlik İpuçları
// DOCKERFILE //
# 1. Minimal base imageFROM node:20-alpine # debian değil alpine# 2. Root olmayan kullanıcıUSER node# 3. Read-only filesystem# docker run --read-only --tmpfs /tmp ...# 4. Secret yönetimi — ENV değil secretsRUN --mount=type=secret,id=npm_token \ npm config set //registry.npmjs.org/:_authToken=$(cat /run/secrets/npm_token)# 5. İmaj tarama# docker scout cves codeforge-api:1.0.0
Özet
Docker, konteyner ile VM arasındaki farkı anlayarak başlar. Dockerfile'da çok aşamalı build (AS deps → AS builder → AS runner) imaj boyutunu %70 küçültür. Docker Compose, çok servisli geliştirme ortamını tek docker compose up ile hazır hale getirir. Prodüksiyonda healthcheck, named volume ve non-root kullanıcı üçgeni vazgeçilmezdir.