Adım Adım Docker ve Container Mimarisi ile Web Uygulaması Dağıtımı Rehberi
Modern yazılım dünyasında web uygulamalarını Docker ve container mimarisiyle güvenli, ölçeklenebilir ve hızlı bir şekilde dağıtmayı (deployment) adım adım öğrenin.
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
Giriş: Modern Yazılım Dağıtımında Container Dönemi
Yazılım geliştirme süreçlerinde karşılaşılan en büyük problemlerden biri olan "Benim bilgisayarımda çalışıyordu ama sunucuda çalışmıyor" sendromu, container teknolojileri sayesinde tarihe karıştı. Günümüzün modern yazılım geliştirme ekosisteminde, çeviklik ve süreklilik en kritik unsurlar haline gelmiştir. Bu doğrultuda hazırladığımız bu kapsamlı rehber, Docker ve container mimarisini kullanarak bir web uygulamasının sıfırdan üretim (production) ortamına nasıl dağıtılacağını tüm detaylarıyla ele almaktadır.
Bulut bilişim ve mikroservis mimarilerinin yükselişiyle birlikte, kurumların benimsediği dijital strateji yaklaşımları artık tamamen konteynerleştirilmiş altyapılar üzerine kurulmaktadır. DevOps süreçlerindeki güncel trendler, yazılım yaşam döngüsünü otomatikleştirerek hata payını minimuma indirmeyi hedefler.
Temel Kavramlar: Docker Ekosistemini Anlamak
Dağıtım adımlarına geçmeden önce Docker mimarisinin temel yapı taşlarını kavramak kritik öneme sahiptir:
- Docker Image (İmaj): Uygulamanızın kaynak kodunu, bağımlılıklarını, çalışma zamanını ve sistem kütüphanelerini içeren salt okunur (read-only) şablondur.
- Docker Container: İmajın çalışan, izole edilmiş canlı örneğidir. Her container kendi dosya sistemi, ağı ve işlem alanına sahiptir.
- Dockerfile: Bir Docker imajının nasıl oluşturulacağını adım adım belirten talimatlar dosyasıdır.
- Docker Compose: Çoklu container içeren karmaşık uygulamaları (örneğin Web API + Veritabanı + Redis) tek bir yapılandırma dosyası üzerinden yönetmeyi sağlayan araçtır.
- Container Registry: Docker imajlarının depolandığı ve paylaşıldığı merkezi depolardır (Docker Hub, GitHub Container Registry, AWS ECR vb.).
Adım Adım Web Uygulaması Dağıtımı (Deployment)
Adım 1: Optimize Edilmiş Bir Dockerfile Hazırlama
Başarılı bir dağıtımın ilk adımı, hafif ve güvenli bir Docker imajı üretmektir. Üretim ortamları için Multi-Stage Build (çok aşamalı derleme) yaklaşımını kullanmak imaj boyutunu ciddi oranda düşürür.
İpucu: Alpine veya Slim tabanlı resmi imajları tercih ederek hem güvenlik açıklarını azaltabilir hem de indirme/yükleme sürelerini kısaltabilirsiniz.
Örnek bir Node.js veya Go uygulaması için Multi-stage Dockerfile mantığı:
# Derleme Aşaması (Build Stage)
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Üretim Aşaması (Production Stage)
FROM node:18-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
USER node
CMD ["node", "dist/main.js"]Adım 2: .dockerignore Dosyası Oluşturma
Gereksiz dosyaların imaj içerisine dahil edilmesi, derleme süresini uzatır ve güvenlik zaafiyetleri oluşturabilir. Proje ana dizininde bir .dockerignore dosyası oluşturarak aşağıdaki dizinleri hariç tutun:
node_modulesveyavendor.gitve.github.envve yerel kimlik doğrulama dosyaları- Log dosyaları ve geçici test dizinleri
Adım 3: Çoklu Servisler için Docker Compose Yapılandırması
Web uygulamanız genellikle bir veritabanı (PostgreSQL, MySQL vb.) veya önbellek mekanizması (Redis) ile birlikte çalışır. Bu servisleri koordine etmek için bir docker-compose.yml dosyası hazırlayın:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:password@db:5432/app_db
depends_on:
- db
restart: always
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=app_db
volumes:
- db_data:/var/lib/postgresql/data
restart: always
volumes:
db_data:Adım 4: İmajı Derleme ve Yerel Ortamda Doğrulama
Uygulamanızı uzak sunucuya göndermeden önce mutlaka yerel makinenizde test edin:
- Terminalden
docker compose buildkomutu ile imajları derleyin. docker compose up -dile servisleri arka planda başlatın.docker compose psvedocker compose logs -fkomutları ile konteynerlerin sağlıklı çalıştığından emin olun.
Adım 5: Container Registry Entegrasyonu
Uygulama imajınızı dağıtılacağı sunucuya ulaştırmak için merkezi bir imaj deposuna yüklemeniz gerekir:
- Kayıt defterine giriş yapın:
docker login - İmajınızı etiketleyin (tag):
docker tag my-web-app:latest username/my-web-app:v1.0.0 - İmajı uzak depoya gönderin:
docker push username/my-web-app:v1.0.0
Adım 6: Üretim Sunucusuna Dağıtım ve Tersine Dizinleme (Reverse Proxy)
Uzak sunucunuza (AWS EC2, DigitalOcean Droplet, Hetzner vb.) bağlandıktan sonra:
- Sunucuya Docker ve Docker Compose kurulumunu yapın.
- Uygulamanızı çalıştırmak için Nginx veya Traefik gibi bir Tersine Proxy (Reverse Proxy) yapılandırın.
- Let's Encrypt (Certbot) kullanarak ücretsiz SSL sertifikası tanımlayın ve HTTPS trafiğini güvene alın.
docker pull username/my-web-app:v1.0.0komutu ile imajı çekip ayağa kaldırın.
Üretim Ortamında En İyi Uygulamalar (Best Practices)
Container dağıtımında kurumsal seviyede güvenilirlik sağlamak için şu prensipleri göz önünde bulundurun:
- Root Yetkilerini Sınırlandırın: Container'ları asla varsayılan 'root' kullanıcısı ile çalıştırmayın. Dockerfile içerisinde
USERtanımlayın. - Kaynak Limitleri Belirleyin: Bir container'ın sunucudaki tüm CPU ve RAM'i tüketmesini engellemek için Docker Compose üzerinde bellek ve işlemci sınırları tanımlayın.
- Health Check Mekanizması: Container sağlığını izlemek için
HEALTHCHECKdirektiflerini aktif edin; böylece çöken servisler otomatik olarak yeniden başlatılabilir. - Gizli Bilgileri (Secrets) Güvende Tutun: API anahtarlarını ve veritabanı şifrelerini asla Dockerfile içine yazmayın; ortam değişkenleri (environment variables) veya Docker Secrets kullanın.
Geleceğin Trendleri: CI/CD ve Orkestrasyon
Sektördeki en güncel trendler, manuel dağıtımların yerini tamamen otomatik CI/CD (Sürekli Entegrasyon / Sürekli Dağıtım) boru hatlarına bıraktığını göstermektedir. GitHub Actions veya GitLab CI araçları ile kodunuz ana dala (main branch) gönderildiği anda otomatik olarak test edilebilir, Docker imajı derlenebilir ve sunucuya sıfır kesintiyle (zero-downtime) dağıtılabilir.
Eğer uygulamanız yüzlerce konteynere ölçeklenecek seviyeye geldiyse, uzun vadeli dijital strateji kapsamında Kubernetes veya Docker Swarm gibi orkestrasyon sistemlerine geçiş yapmak kaçınılmaz bir adım olacaktır.
Sonuç
Docker ve container mimarisi, web uygulaması dağıtımını standartlaştırarak geliştirme ile operasyon arasındaki sürtüşmeyi ortadan kaldırır. Bu rehber içerisindeki adımları ve en iyi uygulamaları takip ederek, projelerinizi modern, güvenli ve kolayca ölçeklenebilir bir mimari üzerinde canlıya alabilirsiniz.