Docker ile Web Gelistirme: Konteyner Teknolojisi
Docker konteynerlerini kullanarak tutarli gelistirme ortamlari olusturun ve uygulamalarinizi izole edin.
Docker Nedir?
Docker, uygulamalari konteynerler (containers) icinde paketleyerek calistirmanizi saglayan bir platformdur. Bir konteyner, uygulamanizi ve tum bagimliklarini (runtime, kutuphaneler, sistem araclari, konfigurasyonlar) tek bir izole birim icinde barindirır. Bu sayede "benim bilgisayarimda calisiyor" problemini tamamen ortadan kaldirir — uygulama her ortamda (gelistirme, test, uretim) ayni sekilde calisir.
Web gelistirme dunyasinda Docker, hem bireysel gelisitiriciler hem de ekipler icin devrim niteliginde bir arac haline gelmistir. Farkli Node.js versiyonlari, veritabanlari, cache servisleri ve diger bagimliliklar konteyner olarak yonetilir. Yeni bir ekip uyesinin projeyi calistirmasi, tek bir komutla dakikalar icinde gerceklesir. Bu rehberde, Docker'in web gelistirme sureclerinde nasil kullanilacagini, Dockerfile yapisindan Docker Compose'a, gelistirme ortamlarindan multi-stage build'lere kadar detayli olarak inceleyecegiz.
Docker'in Temel Kavramlari
Image (Goruntu)
Docker image, bir konteynerin sablonudur. Uygulamanizin calisması icin gereken her seyi icerir: isletim sistemi katmani, runtime, kutuphaneler, uygulama kodu ve konfigurasyonlar. Imagelar katmanli (layered) bir yapida olusturulur ve her katman onbellekelenir.
Container (Konteyner)
Bir image'in calisir haldeki ornegi. Hafif, izole ve hizli baslatilir. Sanal makinelerden farkli olarak, konteynerler host isletim sisteminin cekirdegini paylasr ve milisaniyeler icinde baslatilabilir.
Dockerfile
Image olusturmak icin kullanilan talimat dosyasi. Her satir bir katman olusturur: temel image secimi, bagimliliklarin yuklenmesi, kodun kopyalanmasi, derleme komutlari ve calistirma talimatlari.
Docker Compose
Birden fazla konteyneri tanimlayip birlikte yonetmenizi saglayan bir aractir. Bir web uygulamasi, veritabani, cache servisi ve message queue gibi bilesenleri tek bir YAML dosyasinda tanimlayip tek komutla baslatabilirsiniz.
Volume
Konteynerler arasinda veya konteyner ile host sistem arasinda veri paylasimini saglayan kalici depolama mekanizmasi. Veritabani verileri, yuklenilen dosyalar ve konfigurasyonlar icin kullanilir.
Dockerfile Yazimi
Etkili bir Dockerfile yazmak, Docker kullanmanin temelidir. Asagidaki ilkelere dikkat etmek, hem build surelerini kisaltir hem de image boyutunu minimize eder.
Temel Ilkeler
- Kucuk base image secin:
node:20-alpinegibi Alpine tabanli imagelar, standart imagelarin yaklasik 5'te 1'i boyutundadir. - Katman onbelleklemesini optimize edin: Sik degisen dosyalari (kaynak kodu) sona, nadir degisenleri (package.json) basa koyun. Bu sayede bagimlilk yukleme katmani cache'te kalir.
- Once bagimliliklari yukleyin:
package.jsonvepackage-lock.jsondosyalarini kopyalayipnpm ciile bagimliliklari yukleyin. Ardindan kaynak kodunu kopyalayin. - .dockerignore kullanin:
node_modules,.git,.envve diger gereksiz dosyalari build kontekstinden cikararak build suresini kisaltin. - Root olmayan kullanici: Guvenlik icin uygulamayi root kullanicisi olarak degil, ozel bir kullanici ile calistirin.
Ornek: Next.js Dockerfile
Bir Next.js projesi icin tipik bir Dockerfile su adimlari icerir: Alpine tabanli Node.js image secimi, calisma dizini olusturma, paket dosyalarini kopyalama, npm ci ile bagimliliklari yukleme, kaynak kodunu kopyalama, npm run build ile uygulamayi derleme ve son olarak npm start ile uygulamayi baslatma.
Docker Compose ile Gelistirme Ortami
Gercek dunya projelerinde uygulama genellikle tek basina calismaz. Bir veritabanina, cache servisine, arama motoruna veya diger mikro servislere ihtiyac duyar. Docker Compose, tum bu servisleri tek bir docker-compose.yml dosyasinda tanimlayarak birlikte yonetmenizi saglar.
Tipik Web Projesi Servisleri
- app: Ana web uygulamaniz (Next.js, Express, vb.)
- db: Veritabani (PostgreSQL, MySQL, MongoDB)
- redis: Cache ve oturum yonetimi
- nginx: Reverse proxy ve statik dosya sunumu
- mailhog: Gelistirme ortaminda e-posta test araci
Docker Compose Ozellikleri
- depends_on: Servisler arasi bagimliliklari tanimlar. Veritabani, uygulama baslamadan once hazir olur.
- volumes: Kaynak kodu bind mount ile konteynere baglanir, dosya degisiklikleri aninda yansir.
- ports: Konteyner portlarini host'a esler. Uygulamaya
localhost:3000uzerinden erisebilirsiniz. - environment: Ortam degiskenlerini tanimlar. Veritabani baglanti bilgileri, API anahtarlari vb.
- networks: Servisler arasi iletisim icin ozel aglar tanimlayabilirsiniz.
- healthcheck: Servisin saglikli olup olmadigini periyodik olarak kontrol eder.
Gelistirme Ortami Optimizasyonlari
Hot Reload
Gelistirme sirasinda kod degisikliklerinin aninda yansimasi icin bind mount kullanilir. Kaynak kod dizininiz konteynere baglanir ve dosya sistemi degisiklikleri konteyner icinden de gorunur. Next.js, Vite gibi araclarin hot reload ozelligi Docker icinde de sorunsuz calisir.
Ayri Gelistirme ve Uretim Konfigurasyonlari
Gelistirme ve uretim ortamlari icin ayri Docker Compose dosyalari kullanmak en iyi pratiktir. docker-compose.yml temel konfigurasyonu, docker-compose.override.yml gelistirmeye ozel ayarlari (volume mountlar, debug portlari, hot reload), docker-compose.prod.yml uretim ayarlari (optimizasyon, replika sayisi, kaynak limitleri) icerir.
Performans Ipuclari
- macOS ve Windows: Dosya sistemi performans farklari nedeniyle, buyuk projelerde
node_modulesicin anonim volume kullanarak performansi artirabilirsiniz. - BuildKit:
DOCKER_BUILDKIT=1ile paralel katman derleme ve gelismis onbellekleme mekanizmasini etkinlestirin. - Cache mount: npm/yarn cache'ini build arasinda korumak icin BuildKit cache mount ozelligini kullanin.
Multi-Stage Build
Multi-stage build, tek bir Dockerfile icinde birden fazla build asamasi tanimlayarak son image boyutunu minimize etmenin en etkili yoludur. Derleme araclari, gelistirme bagimliliklari ve ara dosyalar son image'a dahil edilmez.
Asamalar
- Dependencies asamasi: Tum bagimliliklari yukler. Bu katman, yalnizca package.json degistiginde yeniden calisir.
- Build asamasi: Kaynak kodu kopyalar ve uygulamayi derler. TypeScript derleme, CSS optimizasyonu, JavaScript bundling burada gerceklesir.
- Production asamasi: Yalnizca derlenmis ciktiyi ve uretim bagimliklarini alir. Gelistirme araclari, kaynak kodlar ve ara dosyalar dahil edilmez.
Multi-Stage Build Avantajlari
- Kucuk Image Boyutu: Son image yalnizca calisma icin gereken dosyalari icerir. 1GB'lik bir build image'i, 100MB'lik bir production image'a donusebilir.
- Guvenlik: Kaynak kod, gelistirme araclari ve derleme sirlari (build secrets) son image'da bulunmaz.
- Verimli Onbellekleme: Her asama bagimsiz olarak onbellekelenir, yalnizca degisen asamalar yeniden calistirilir.
Docker ile CI/CD Entegrasyonu
Docker, CI/CD (Surekli Entegrasyon / Surekli Dagitim) pipeline'larinin temel tasidir. Her commit'te ayni Docker image olusturulur, test edilir ve deploy edilir.
- Tutarli build ortami: CI sunucusundaki farklilklar soruna yol acmaz, Docker image her yerde ayni sekilde calisir.
- Paralel test: Farkli servislerin testleri ayri konteynerlerde paralel calistirilabilir.
- Image registry: Docker Hub, GitHub Container Registry veya AWS ECR gibi registrylerde imagelarinizi saklayabilirsiniz.
- Otomatik deploy: CI/CD pipeline'i basarili build sonrasi image'i registry'ye push eder ve hedef ortama deploy eder.
Guvenlik En Iyi Uygulamalari
- Resmi ve guvenilir base imagelar kullanin.
node:20-alpinegibi minimal imagelar tercih edin. - Root kullanicisi yerine ozel bir kullanici ile uygulamayi calistirin.
.envdosyalarini ve sirlari image icine koymaktan kacinin. Docker secrets veya ortam degiskenleri kullanin.- Image'larini duzenli olarak guncelleyin ve guvenlik taramasi yapin (
docker scout, Trivy, Snyk). - Yalnizca gerekli portlari aciga cikarin.
- Read-only dosya sistemi kullanmayi degerlendirin.
- Multi-stage build ile kaynak kodu ve derleme araclarini son image'dan temizleyin.
Kontrol Listesi: Docker ile Web Projesi
- Projeniz icin uygun base image secin (Node.js Alpine onerliir).
.dockerignoredosyasi olusturun.- Katman onbelleklemesini optimize eden bir Dockerfile yazin.
- Multi-stage build ile uretim image boyutunu minimize edin.
- Docker Compose ile veritabani ve diger servisleri tanimlayin.
- Gelistirme ortami icin volume mount ve hot reload yapilandirin.
- Uretim ve gelistirme icin ayri Compose konfigurasyonlari olusturun.
- Guvenlik en iyi uygulamalarini uygulyin.
- CI/CD pipeline'ina Docker build ve push adimlarini entegre edin.
- Image boyutunu ve build surelerini duzenli olarak izleyip optimize edin.
Sonuc:Docker, modern web gelistirme is akislarinin vazgecilmez bir parcasidir. Tutarli gelistirme ortamlari, hizli onboarding, tekrarlanabilir build'ler ve guvenli deployment surecileri saglar. Megis olarak, projelerimizde Docker tabanli gelistirme ortamlari ve optimize edilmis deployment pipeline'lari kurarak verimli ve guvenilir yazilim teslimi gerceklestiriyoruz.