Docker ile Web Uygulaması Dağıtım Rehberi: Container Mimarisi ve Dağıtım Adımları
Modern web uygulamalarını Docker ve container mimarisiyle production ortamına dağıtma rehberi. Adım adım Dockerfile, Compose ve dağıtım stratejileri.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Web Geliştirmede Container Mimarisi ve Trendler
Modern web mimarisinde container teknolojisi standart haline geldi. Bir dijital ajans veya yazılım ekibi için 'benim makinemde çalışıyordu' sorununu çözer. Altyapı maliyetini düşürür, dağıtım hızını artırır. Bulut bilişim trendler arasında mikroservisler, multi-stage build ve hafif imajlar öne çıkar. Bu rehber, bir web uygulamasını container mimarisiyle sıfırdan canlıya alma adımlarını içerir.
Adım 1: Doğru Base Image Seçimi ve Dockerfile Oluşturma
Gereksiz katmanları ve bağımlılıkları dışarıda tutun. Alpine veya distroless gibi minimal imajlar güvenlik açıklarını azaltır, disk kullanımını minimuma indirir.
Örnek: Multi-Stage Node.js Dockerfile
# Build aşaması
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production aşaması
FROM node:20-alpine AS runner
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/main.js"]Adım 2: .dockerignore Dosyası ile Gereksiz Dosyaları Ayıklama
İmaj boyutunu şişirmemek ve gizli anahtarların imaja sızmasını önlemek için kök dizine .dockerignore dosyası ekleyin.
- node_modules: Bağımlılıklar container içinde kurulmalı.
- .env: Gizli anahtarlar imaj katmanlarına yazılmamalı.
- .git: İmaj boyutunu artırır, üretimde gerek yoktur.
Adım 3: Docker Compose ile Servis Orchestration
Web sunucusu, veritabanı ve reverse proxy gibi servisleri tek dosyada tanımlayın. Modern web ortamında servislerin network izolasyonunu Compose sağlar.
version: '3.8'
services:
web:
build: .
restart: always
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/app_db
depends_on:
- db
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app_db
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:Adım 4: Production Deployment ve Reverse Proxy Entegrasyonu
Uygulama container'ını doğrudan dış dünyaya açmayın. Önüne Nginx veya Traefik gibi bir reverse proxy koyun. SSL sonlandırma, rate limiting ve gzip sıkıştırmayı proxy üzerinde halledin.
Nginx Konfigürasyon Örneği
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}En İyi Pratikler ve Güvenlik Kontrolleri
Container güvenliğinde temel kural: Asla root kullanıcısı ile uygulama çalıştırmayın ve container içine kalıcı veri yazmayın (stateless mimari uygulayın).
- Rootless Execution: Dockerfile içinde
USERtanımlayın. - Restart Policy: Çöken servislerin otomatik ayağa kalkması için
restart: unless-stoppedveyarestart: alwayskullanın. - Healthcheck: Docker'ın container sağlığını denetlemesi için
HEALTHCHECKkomutu ekleyin. - Log Yönetimi: Disk dolmasını engellemek için
json-filelog sürücüsünemax-sizevemax-filesınırları getirin.