Docker ve Container Mimarisi ile Web Uygulaması Dağıtımı Rehberi
Modern web uygulamalarını Docker ile dağıtma adımları. Dijital ajans iş akışları, trendler, multi-stage build ve docker-compose yapılandırması.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Container Mimarisi ve Modern Web Trendleri
Eski yöntem: sunucuya doğrudan kod atma. Sorun: ortam farkı, sürüm çakışması. Modern web standardı: container mimarisi. Kod, kütüphane, runtime tek paket. Dijital ajans ekipleri için fayda: yerelde çalışan kod sunucuda da çalışır. Deployment süresi düşer, izolasyon artar.
Adım 1: Minimal Dockerfile Hazırlama
Amaç: küçük imaj boyutu, hızlı derleme. Multi-stage build kullan. Gereksiz bağımlılıkları üretim imajına alma.
# Build aşaması
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Üretim aşaması
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]İpucu: USER node ile root yetkisini bırak. Güvenlik açığı riskini azalt.Adım 2: .dockerignore Dosyası Ekleme
Gereksiz dosyalar imaja girmemeli. İmaj boyutu şişer, build uzar. Kök dizine .dockerignore aç:
node_modules.git.envdistnpm-debug.log
Adım 3: Docker Compose ile Servisleri Tanımlama
Web servisi ve ters vekil sunucu (Reverse Proxy) tek dosyada topla. docker-compose.yml:
version: '3.8'
services:
web:
build: .
restart: always
environment:
- PORT=3000
networks:
- app-network
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- web
networks:
- app-network
networks:
app-network:
driver: bridgeAdım 4: Sunucuda Dağıtım (Deployment)
Üretim sunucusunda çalıştırma sırası:
- Kodu sunucuya çek:
git pull origin main - İmajı inşa et ve arka planda başlat:
docker compose up -d --build - Log kontrolü yap:
docker compose logs -f web - Kullanılmayan eski imajları temizle:
docker image prune -f
Optimizasyon ve Hata Önleme İpuçları
- Layer Caching:
package.jsondosyasını kaynak koddan önce kopyala. Bağımlılık değişmediyse cache kullanılır, build saniyeler sürer. - Restart Policy: Çöken konteyner için
restart: alwaysveyaunless-stoppedtanımla. - Statik Dosyalar: Node.js yerine Nginx üzerinden sun. CPU yükü düşer.