Docker ve Container Mimarisi ile Web Uygulaması Dağıtımı Rehberi
Modern web projelerinde Docker container mimarisi ile güvenli, ölçeklenebilir ve hızlı deployment adımları içeren kapsamlı rehber.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Web ve Container Standardı
Container mimarisi, kod ile altyapıyı birleştirir. "Benim makinemde çalışıyordu" sorununu çözer. Dijital ajans ekipleri için çoklu müşteri projelerinde ortam izolasyonu sağlar. Modern web trendleri, hafif container imajları ve otomatik deployment süreçleri üzerine kuruludur.
Gereksinimler
- Linux/macOS terminal erişimi
- Docker Engine ve Docker Compose v2+
- Örnek web uygulaması (Node.js, Go veya Python)
- Temel Git bilgisi
Adım 1: Multi-Stage Dockerfile Hazırlığı
Multi-stage build, imaj boyutunu küçültür ve derleme araçlarını nihai imajdan temizler.
# 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 AS runner
WORKDIR /app
ENV NODE_ENV=production
USER node
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/main.js"]Kritik kural: Root kullanıcısı çalıştırma. USER node ile yetkileri kısıtla.
Adım 2: .dockerignore Dosyası ile Gereksiz Dosyaları Eleme
Build bağlamını hafif tutmak için .dockerignore dosyası oluştur:
node_modules
.git
.env
dist
*.logAdım 3: Docker Compose ile Prodüksiyon Mimarisi
Web servisi ve ters proxy (Nginx) tek konfigürasyonda tanımlanır.
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
restart: always
environment:
- PORT=3000
networks:
- app-net
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/ssl/certs:ro
depends_on:
- web
networks:
- app-net
networks:
app-net:
driver: bridgeAdım 4: Nginx Reverse Proxy Konfigürasyonu
Gelen HTTP isteklerini Node.js servisine yönlendir:
events { worker_connections 1024; }
http {
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://web:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}Adım 5: Sunucu Üzerinde Dağıtım (Deployment)
- Sunucuya bağlan:
ssh user@server_ip - Projeyi klonla:
git clone repo_url /opt/app - Çevresel değişkenleri ayarla:
.envdosyasını oluştur. - Servisleri başlat:
docker compose up -d --build - Logları izle:
docker compose logs -f
Dijital Ajans İş Akışları İçin Trendler ve İpuçları
Minimal imaj, az saldırı yüzeyi demektir. Alpine veya Distroless tabanlı imajlar tercih et.
- Healthcheck: Docker Compose içine
healthcheckbloğu ekle, çöken servisin otomatik yeniden başlatılmasını sağla. - Secrets Yönetimi: API anahtarlarını imaja gömme. Runtime sırasında env dosyası veya Docker Secrets ile ilet.
- Log Rotasyonu: Disk dolmasını önlemek için
json-filelog sürücüsüne limit koy (max-size: 10m,max-file: 3).