Docker, uygulamaları ve tüm bağımlılıklarını izole "container"lar içinde çalıştıran platformdur. "Bende çalışıyordu" sorununu ortadan kaldırır; geliştirme, test ve üretim ortamlarını birbirine eşitler.
Temel Kavramlar
Kavram
Açıklama
Image
Container'ın şablonu; değiştirilemez katmanlar
Container
Image'dan oluşturulan çalışan örnek
Dockerfile
Image'ı tarif eden talimatlar dosyası
Registry
Image'ların depolandığı yer (Docker Hub, GHCR)
Volume
Container dışında kalıcı veri depolama
Network
Container'lar arası iletişim katmanı
İlk Container
Dockerfile Yazımı
// DOCKERFILE //
# Node.js uygulaması için Dockerfile# Base image — mümkün olan en küçüğünü seçinFROM node:22-alpine AS base# Çalışma diziniWORKDIR /app# Bağımlılıkları önce kopyala — Docker cache içinCOPY package*.json ./# Dependencies katmanıFROM base AS depsRUN npm ci --only=production# Development dependencies (build için)FROM base AS build-depsRUN npm ci# Build aşamasıFROM build-deps AS builderCOPY . .RUN npm run build# Production image — mümkün olan en küçükFROM node:22-alpine AS runnerWORKDIR /app# Güvenlik: root olmayan kullanıcıRUN addgroup -S appgroup && adduser -S appuser -G appgroupUSER appuser# Sadece gerekli dosyaları kopyalaCOPY --from=deps /app/node_modules ./node_modulesCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package.json ./# Port ve başlatmaEXPOSE 3000ENV NODE_ENV=productionCMD ["node", "dist/server.js"]
.dockerignore
// PLAINTEXT //
# .dockerignore — .gitignore gibi ama Docker içinnode_modules/dist/.git/.gitignore*.log.env.env.*README.mdDockerfile*docker-compose*.ymlcoverage/__tests__/.nyc_output/
# Named volume oluşturdocker volume create uygulama-verisi# Volume listesidocker volume ls# Volume içeriğini inceledocker run --rm -v uygulama-verisi:/data alpine ls -la /data# Volume yedekledocker run --rm \ -v uygulama-verisi:/data \ -v $(pwd)/yedek:/yedek \ alpine tar czf /yedek/yedek-$(date +%Y%m%d).tar.gz /data# Bind mount — geliştirme için (hot reload)docker run -v $(pwd)/src:/app/src -p 3000:3000 uygulama:dev
Network Yönetimi
// BASH //
# Custom network oluşturdocker network create --driver bridge uygulama-agi# Container'ı ağa bağladocker run --network uygulama-agi --name api uygulama:latest# Container'dan container'a erişim (container ismi ile)# api container içinden db'ye:curl http://db:5432# Network'ü inceledocker network inspect uygulama-agi
Geliştirme Ortamı (Dev Compose)
// YAML //
# docker-compose.dev.yml — sadece geliştirme içinservices: app: build: context: . target: build-deps # Dev bağımlılıkları da yükle command: npm run dev # Hot reload volumes: - .:/app # Kaynak kodu bind mount - /app/node_modules # node_modules override'ı engelle environment: - NODE_ENV=development ports: - "3000:3000" - "9229:9229" # Node.js debugger
Sonuç
Docker, uygulamanızı ve tüm bağımlılıklarını kapsülleyerek her ortamda aynı şekilde çalışmasını sağlar. Multi-stage build, Compose ve Volume yönetimini kavradığınızda geliştirme ve dağıtım süreçleriniz dramatik şekilde kolaylaşır. Bir sonraki derste Kubernetes ile container orchestration'a giriş yapacağız.