Docker ve Container Mimarisi ile Web Uygulaması Dağıtımı: Kapsamlı Deployment Rehberi
Modern web uygulamalarını Docker ve container mimarisi kullanarak güvenli, ölçeklenebilir ve kesintisiz şekilde production ortamına dağıtma (deployment) adımlarını, en güncel trendleri ve kurumsal dijital strateji yaklaşımlarını bu rehberde keşfedin.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Yazılım geliştirme ve dağıtım süreçleri son yıllarda köklü bir değişimden geçti. Geleneksel sunucu kurulumları ve "benim bilgisayarımda çalışıyordu" krizleri, yerini standartlaştırılmış, hafif ve izole çalışma ortamları sunan konteyner teknolojilerine bıraktı. Günümüzde kurumsal bir dijital strateji inşa ederken operasyonel çeviklik (agility), güvenilirlik ve hızlı pazara çıkış süresi (time-to-market) en kritik hedefler arasında yer alır. Bu hedeflere ulaşmanın merkezinde ise Docker ve container mimarisi bulunur.
Bu kapsamlı rehber, modern web uygulamalarınızı Docker ile paketleyip sıfırdan production (canlı) ortamına başarıyla dağıtmanız için gereken tüm adımları, optimizasyon yöntemlerini ve güncel sektör trendler ışığında en iyi pratikleri sunmaktadır.
Container Mimarisi Nedir ve Neden Dijital Stratejinizin Merkezinde Olmalı?
Container (konteyner) mimarisi; bir uygulamanın kaynak kodunu, bağımlılıklarını, çalışma zamanı kütüphanelerini ve ortam değişkenlerini tek bir paket haline getirerek işletim sistemi düzeyinde sanallaştırma sağlayan bir yaklaşımdır. Sanal makinelerin (VM) aksine bağımsız bir işletim sistemi çekirdeği taşımayan container'lar, ana makinenin çekirdeğini paylaşır. Bu durum, saniyeler içinde ayağa kalkma, düşük kaynak tüketimi ve yüksek taşınabilirlik sağlar.
Stratejik Avantaj: Container mimarisi, şirketlerin bulut sağlayıcılarına (AWS, Google Cloud, Azure) olan bağımlılığını (vendor lock-in) azaltır ve hibrit ya da multi-cloud altyapılarını destekleyerek esnek bir dijital strateji yürütülmesini mümkün kılar.
Modern Deployment Trendleri ve DevOps Ekosistemi
Web dağıtım süreçlerindeki yeni trendler, konteynerleştirme süreçlerinin otomasyonla entegre edilmesini zorunlu kılmaktadır. Öne çıkan başlıca trendler şunlardır:
- CI/CD Entegrasyonu: Kod commit edildiği anda Docker imajının otomatik test edilip derlenmesi ve registry'e gönderilmesi.
- Multi-Stage Builds: Derleme ve çalışma aşamalarını ayırarak imaj boyutlarını megabayt seviyelerine indirme ve saldırı yüzeyini daraltma.
- GitOps ve Bildirimsel (Declarative) Altyapı: Tüm dağıtım konfigürasyonlarının Git deposunda tutulması ve altyapı durumunun otomatik senkronize edilmesi.
- Zero-Downtime Deployment: Blue-Green ve Canary dağıtım modelleri ile kullanıcılar kesinti hissetmeden yeni sürümlere geçiş yapılması.
Adım Adım Web Uygulaması Dağıtımı (Deployment) Rehberi
Aşağıdaki adımları takip ederek Node.js, Python, Go, PHP veya Java tabanlı modern bir web uygulamasını Dockerize edip canlı ortama taşıyabilirsiniz.
Adım 1: Multi-Stage Dockerfile ile İmaj Optimizasyonu
Production seviyesinde bir dağıtım için ilk adım, uygulamanın yalnızca gerekli bağımlılıkları içeren küçük ve güvenli bir imajını üretmektir. Multi-stage build tekniği bu noktada endüstri standardıdır.
# Aşama 1: Derleme (Build Stage)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Aşama 2: Üretim Çalışma Zamanı (Production Stage)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# Güvenlik için root olmayan kullanıcıya geçiş
USER node
COPY --chown=node:node package*.json ./
RUN npm ci --only=production
COPY --from=builder --chown=node:node /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/main.js"]Adım 2: .dockerignore Dosyasının Yapılandırılması
İmajın gereksiz yere büyümesini engellemek ve hassas dosyaların sızmasını önlemek adına proje kök dizininde bir .dockerignore dosyası oluşturulmalıdır:
node_modules/venv/vendor.gitve.githubdizinleri.envve yerel kimlik bilgileri içeren dosyalar- Derleme çıktıları, log kayıtları ve test raporları
Adım 3: Docker Compose ile Çok Katmanlı Servisleri Tanımlama
Bir web uygulaması nadiren tek başına çalışır; genellikle bir veritabanı (PostgreSQL, MySQL), önbellek (Redis) ve ters tersine vekil sunucu (Nginx/Traefik) ile birlikte çalışır. docker-compose.prod.yml dosyası ile bu yapıyı kolayca koordine edebilirsiniz:
version: '3.8'
services:
web_app:
image: registry.example.com/myapp:v1.2.0
restart: always
environment:
- DATABASE_URL=postgres://user:password@db:5432/appdb
- REDIS_HOST=cache
networks:
- app_network
depends_on:
- db
- cache
cache:
image: redis:7-alpine
restart: always
networks:
- app_network
db:
image: postgres:16-alpine
restart: always
environment:
POSTGRES_DB: appdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- app_network
volumes:
db_data:
networks:
app_network:
driver: bridgeAdım 4: İmajın Bir Container Registry'e Yüklenmesi
Oluşturulan imajı production sunucusuna ulaştırmak için Docker Hub, AWS ECR, GitHub Packages veya GitLab Registry gibi güvenli bir havuz kullanılır:
- Giriş Yapın:
docker login registry.example.com - İmajı Etiketleyin:
docker tag myapp:latest registry.example.com/myapp:v1.2.0 - İmajı Gönderin:
docker push registry.example.com/myapp:v1.2.0
Adım 5: Canlı Sunucuda Dağıtım ve Nginx Ters Vekil (Reverse Proxy) ile SSL Yapılandırması
Production sunucusunda container'ların doğrudan 80 veya 443 portunu dış dünyaya açması yerine, önlerine Nginx veya Traefik gibi bir reverse proxy yerleştirilerek SSL sertifikaları (Let's Encrypt), yük dengeleme (load balancing) ve HTTP başlık güvenlikleri yönetilmelidir.
# Sunucuda son sürümü çekme ve ayağa kaldırma
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d --remove-orphansProduction Ortamı İçin En İyi Pratikler ve Güvenlik Tavsiyeleri
Konteynerleştirilmiş uygulamalarınızın kesintisiz ve güvenli çalışması için aşağıdaki standartları uygulayın:
- Root Yetkilerini Sınırlandırın: Container içinde uygulamayı asla
rootkullanıcısı olarak çalıştırmayın. - Kaynak Sınırları Belirleyin: Bellek sızıntılarının (memory leak) ana sunucuyu çökertmemesi için Compose dosyasında CPU ve RAM limitleri (
mem_limit,cpus) tanımlayın. - Healthcheck Ekleyin: Uygulamanın sadece çalışıp çalışmadığını değil, istekleri yanıtlayıp yanıtlamadığını doğrulayan
HEALTHCHECKdirektiflerini kullanın. - Log Yönetimi Yapılandırın: Container loglarının sunucu diskini doldurmaması için
json-filelog sürücüsünemax-sizevemax-filesınırları getirin.
Sonuç: Container Mimarisi ile Geleceğe Hazır Altyapılar
Docker ve container mimarisi, yalnızca teknik bir dağıtım aracı değil; yazılım geliştirme döngüsünü hızlandıran, operasyonel riskleri minimize eden ve kurumsal dayanıklılığı artıran stratejik bir yatırımdır. Bu rehber içindeki adımları üretim süreçlerinize entegre ederek, değişen teknoloji trendler karşısında çevik kalabilir ve şirketinizin uzun vadeli dijital strateji hedeflerini sağlam temeller üzerine oturtabilirsiniz.