A'dan Z'ye Docker ile Web Uygulaması Dağıtımı Rehberi: Container Mimarisi ve Modern DevOps Stratejileri
Modern yazılım dağıtım süreçlerinde Docker ve container mimarisini kullanarak web uygulamalarınızı sıfırdan canlıya nasıl alacağınızı adım adım keşfedin.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Modern Yazılım Dünyasında Container Mimarisi ve Önemi
Geleneksel sunucu mimarilerinde karşılaşılan 'benim makinemde çalışıyordu, sunucuda neden çalışmıyor?' problemi, modern yazılım geliştirme süreçlerinin en büyük darboğazlarından biriydi. Günümüzde güçlü bir dijital strateji oluşturan kurumlar, bu operasyonel riskleri en aza indirmek ve dağıtım hızını artırmak için container mimarilerini tercih etmektedir. Docker, uygulamanızı tüm bağımlılıkları, kütüphaneleri ve yapılandırma dosyalarıyla birlikte izole bir paket haline getirerek her ortamda tutarlı çalışmasını garanti altına alır.
Bu kapsamlı rehber, bir web uygulamasının Docker mimarisi kullanılarak sıfırdan production (canlı) ortamına nasıl taşınacağını adım adım ele almaktadır.
Temel Kavramlar: Docker Ekosistemini Anlamak
Dağıtım sürecine geçmeden önce Docker mimarisinin yapı taşlarını netleştirmek gerekir:
- Docker Image (İmaj): Uygulamanızın çalışması için gereken kod, runtime, sistem araçları ve kütüphaneleri içeren salt okunur (read-only) şablondur.
- Docker Container: İmajın çalışan, yaşayan ve izole edilmiş örneğidir.
- Dockerfile: Bir Docker imajının nasıl oluşturulacağını adım adım belirten yapılandırma dosyasıdır.
- Docker Compose: Birden fazla container'dan oluşan (örneğin Web + Veritabanı + Redis) çoklu servisleri tek bir yapılandırmayla yönetmeyi sağlayan araçtır.
- Docker Volume: Container'lar geçici (ephemeral) olduğu için verilerin kalıcı hale getirilmesini sağlayan depolama katmanıdır.
Adım Adım Docker ile Web Uygulaması Dağıtımı
Adım 1: Uygulama Mimarisi ve Dockerfile Hazırlığı
İlk adımda, web uygulamanızın kök dizininde bir Dockerfile oluşturmanız gerekir. Kaynak tüketimini düşürmek ve güvenlik açıklarını azaltmak amacıyla hafif (lightweight) base imajlar (örneğin Alpine veya Slim sürümleri) tercih edilmelidir.
Aşağıda tipik bir Node.js web uygulaması için optimize edilmiş Dockerfile örneği yer almaktadır:
# 1. Aşama: Build Ortamı FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 2. Aşama: Production Ortamı FROM node:18-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/index.js"]
Önemli İpucu: Multi-stage build yaklaşımı sayesinde, geliştirme ve derleme araçları üretim imajına dahil edilmez. Bu sayede imaj boyutu yüzlerce megabayttan onlarca megabayta düşer.
Adım 2: .dockerignore Dosyası ile Gereksiz Dosyaları Filtreleme
Docker build sürecini hızlandırmak ve imaj boyutunu şişirmemek için projenizin kök dizinine bir .dockerignore dosyası ekleyin. Bu dosya, .git, node_modules, loglar ve yerel ortam değişkenleri (.env) gibi dosyaların imaja kopyalanmasını engeller.
Adım 3: Docker Compose ile Çok Katmanlı Servisleri Yapılandırma
Gerçek dünya senaryolarında web uygulamaları genellikle bir veritabanı (PostgreSQL, MySQL) ve bir önbellek mekanizması (Redis) ile birlikte çalışır. Bu servisleri koordine etmek için docker-compose.yml dosyası kullanılır:
version: '3.8' services: web: build: . ports: - "3000:3000" environment: - DATABASE_URL=postgres://user:password@db:5432/appdb depends_on: - db restart: always db: image: postgres:15-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: appdb volumes: - pgdata:/var/lib/postgresql/data restart: always volumes: pgdata:
Adım 4: İmajı Derleme ve Yerel Testleri Gerçekleştirme
Yapılandırma tamamlandıktan sonra servislerinizi yerel ortamda test etmek için terminalde şu komutu çalıştırın:
docker-compose up --build -d
Bu komut servisleri arka planda (detached mode) başlatır. docker ps komutu ile container durumlarını, docker-compose logs -f komutu ile uygulama loglarını canlı olarak izleyebilirsiniz.
Adım 5: Canlı Sunucuya Dağıtım (Production Deployment)
Uygulamanızı canlı sunucuya taşırken modern CI/CD (GitHub Actions, GitLab CI) süreçleri devreye girer:
- Container Registry'e Gönderim: Derlenen Docker imajı Docker Hub, AWS ECR veya GitHub Container Registry (GHCR) üzerine
docker pushile gönderilir. - Sunucu Yapılandırması: Canlı sunucuda (VPS, Bulut VM) Nginx veya Traefik gibi bir ters tersine proxy (Reverse Proxy) kurularak SSL/TLS sertifikaları yönetilir.
- Canlıya Alma (Zero-Downtime Deployment): Yeni imaj sunucuya çekilir (
docker pull) ve kesintisiz şekilde eski container'lar yenileriyle değiştirilir.
Üretim Ortamında Güvenlik ve Performans İpuçları
- Root Yetkisini Sınırlandırın: Container içinde uygulamayı asla varsayılan
rootkullanıcısıyla çalıştırmayın; daima özel bir servis kullanıcısı (örneğinUSER node) tanımlayın. - Kaynak Sınırlandırması (Resource Limits): Bellek sızıntılarına karşı container'lara CPU ve RAM sınırları (
mem_limit,cpus) tanımlayın. - Healthcheck Mekanizmaları: Docker'ın çöken ya da yanıt vermeyen servisleri otomatik olarak yeniden başlatabilmesi için
HEALTHCHECKdirektiflerini aktif kullanın. - Secret Yönetimi: API anahtarları ve veritabanı şifreleri gibi hassas verileri asla Dockerfile içerisine sabit (hard-coded) olarak yazmayın. Docker Secrets veya ortam değişkenlerini kullanın.
Container Ekosisteminde Öne Çıkan Trendler
Yazılım dünyasında hızla evrilen trendler, mikroservis ve container mimarilerini standart bir gereklilik haline getirmiştir. Günümüzde öne çıkan bazı başlıklar şunlardır:
- Kubernetes ve Orchestration: Yüzlerce container'ın yönetildiği büyük ölçekli sistemlerde Kubernetes ve k3s kullanımı endüstri standardı haline gelmiştir.
- Serverless Containers: AWS Fargate, Google Cloud Run ve Azure Container Apps gibi sunucusuz mimariler, sunucu yönetimi ihtiyacını ortadan kaldırarak maliyet ve operasyon optimizasyonu sunmaktadır.
- DevSecOps Entegrasyonu: Dağıtım boru hattına (pipeline) entegre edilen Trivy veya Snyk gibi araçlarla imaj güvenlik taramaları derleme aşamasında otomatikleştirilmektedir.
Sonuç
Docker ve container mimarisi, yalnızca bir sanallaştırma aracı değil; yazılım geliştirme döngüsünü hızlandıran, dağıtım risklerini ortadan kaldıran ve ekipler arası entegrasyonu güçlendiren kritik bir altyapı çözümüdür. Bu rehberdeki adımları ve güvenlik ilkelerini uygulayarak web projelerinizi güvenli, ölçeklenebilir ve modern DevOps standartlarına tam uyumlu bir biçimde canlıya alabilirsiniz.