⏱️
Süre
20-30 dakika
🎯
Seviye
Orta-İleri
🛠️
Araçlar
Docker, Node.js
💰
Maliyet
Ücretsiz - 50$/ay

🏗️ Production Ready Dockerfile Oluşturma

1
Temel Dockerfile Yapısı
DOCKERFILE Dockerfile
# Multi-stage build için Node.js base image
FROM node:18-alpine AS base

# Çalışma dizinini ayarla
WORKDIR /app

# Package.json ve package-lock.json'ı kopyala
COPY package*.json ./

# Dependencies kurulumu
RUN npm ci --only=production && npm cache clean --force

# Uygulama kodlarını kopyala
COPY . .

# Production stage
FROM node:18-alpine AS production

# Güvenlik için non-root user oluştur
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nextjs -u 1001

WORKDIR /app

# Sadece production dosyalarını kopyala
COPY --from=base --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --from=base --chown=nextjs:nodejs /app .

# Non-root user'a geç
USER nextjs

# Port ayarla
EXPOSE 3000

# Health check ekle
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node health-check.js

# Uygulamayı başlat
CMD ["node", "server.js"]
🚀 Multi-stage Build Avantajları
  • Docker image boyutu %60-80 oranında küçülür
  • Development dependencies production'a taşınmaz
  • Build süreci optimization için cache kullanır
  • Güvenlik açıkları minimize edilir
2
Docker Compose ile Orchestration

Kompleks uygulamalar için Docker Compose kullanarak servisleri yönetelim:

YAML docker-compose.yml
version: '3.8'

services:
  # Node.js App
  web:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    restart: unless-stopped
    networks:
      - app-network

  # PostgreSQL Database
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-network
    restart: unless-stopped

  # Redis Cache
  redis:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - app-network
    restart: unless-stopped

  # Nginx Reverse Proxy
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/ssl/certs
    depends_on:
      - web
    networks:
      - app-network
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:

networks:
  app-network:
    driver: bridge