Docker: Web Geliştiriciler İçin Kapsamlı Rehber

Docker: Web Geliştiriciler İçin Kapsamlı Rehber
Docker, uygulamalarınızı container'lar içinde paketleyerek geliştirme, test ve production ortamları arasındaki tutarsızlıkları ortadan kaldıran devrimsel bir teknolojidir. "Benim bilgisayarımda çalışıyor" sorununa kesin çözüm sunan Docker, web geliştiricilerin günlük iş akışını temelden değiştirir. Bu rehberde Docker'ın temellerinden multi-stage build'lere, Docker Compose ile çoklu servis yönetimine kadar her şeyi web geliştirici perspektifinden inceliyoruz.
Docker Nedir ve Neden Önemlidir?
Docker, bir uygulamayı ve tüm bağımlılıklarını (runtime, sistem kütüphaneleri, ayarlar) hafif ve taşınabilir bir container içinde paketler. Sanal makinelerden farklı olarak container'lar işletim sistemi çekirdeğini paylaşır, bu da onları çok daha hafif ve hızlı yapar.
- Tutarlı ortam: Geliştirme, test ve production aynı ortamda çalışır
- Hızlı başlatma: Container'lar saniyeler içinde ayağa kalkar
- İzolasyon: Her servis kendi container'ında bağımsız çalışır
- Ölçeklenebilirlik: Yatay ölçekleme kolayca yapılabilir
- Versiyon kontrolü: Docker image'ları versiyonlanabilir
Docker Kurulumu ve İlk Container
Docker Desktop'ı yükledikten sonra ilk container'ınızı çalıştıralım:
# Docker versiyonunu kontrol et
docker --version
# Docker version 27.x.x
# İlk container'ınızı çalıştırın
docker run hello-world
# Node.js container'ı ile interaktif çalışma
docker run -it node:20-alpine node
> console.log("Docker'dan merhaba!")
> Docker'dan merhaba!
> .exit
# Nginx web sunucusu başlat
docker run -d -p 8080:80 --name my-nginx nginx:alpine
# Tarayıcıda http://localhost:8080 adresini açın
Dockerfile ile Kendi Image'ınızı Oluşturma
Bir Next.js projesi için optimize edilmiş Dockerfile yazalım:
# Dockerfile
FROM node:20-alpine AS base
# Bağımlılıkları yükle
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
# Build aşaması
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
# Production aşaması
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
# Güvenlik: root olmayan kullanıcı oluştur
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
CMD ["node", "server.js"]
Docker Compose ile Çoklu Servis Yönetimi
Gerçek dünya projelerinde genellikle birden fazla servis birlikte çalışır. Docker Compose ile tüm servisleri tek bir dosyada tanımlayabilirsiniz:
# docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
volumes:
- .:/app
- /app/node_modules
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
interval: 10s
timeout: 5s
retries: 5
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
# Tüm servisleri başlat
docker compose up -d
# Logları izle
docker compose logs -f app
# Servislerin durumunu kontrol et
docker compose ps
# Tüm servisleri durdur ve temizle
docker compose down -v
volumes tanımında /app/node_modules satırı önemlidir. Bu, host'taki node_modules'un container'daki node_modules'u ezmesini engeller. Özellikle farklı işletim sistemlerinde (macOS/Windows host, Linux container) native modüller sorun yaratabilir.
.dockerignore Dosyası
Build context'ten gereksiz dosyaları hariç tutarak build süresini ve image boyutunu azaltın:
# .dockerignore
node_modules
.next
.git
.gitignore
*.md
.env*.local
.vscode
coverage
.husky
__tests__
cypress
docker-compose*.yml
Dockerfile*
Geliştirme Ortamı İçin Docker
Production Dockerfile'dan farklı olarak, geliştirme ortamında hot reload ve debug desteği gerekir:
# Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
# docker-compose.dev.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- .:/app
- /app/node_modules
environment:
- WATCHPACK_POLLING=true
# Geliştirme ortamını başlat
docker compose -f docker-compose.dev.yml up
WATCHPACK_POLLING=true environment variable'ı, Docker volume mount'larında dosya değişikliklerinin algılanmasını sağlar. Özellikle Windows ve macOS'ta file system event'leri container'a iletilmediğinde bu ayar gereklidir.
Faydalı Docker Komutları
# Çalışan container'ları listele
docker ps
# Tüm container'ları listele (durmuş olanlar dahil)
docker ps -a
# Container loglarını görüntüle
docker logs -f container_name
# Container'a shell ile bağlan
docker exec -it container_name sh
# Kullanılmayan image, container ve volume'ları temizle
docker system prune -a --volumes
# Image boyutlarını görüntüle
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# Container resource kullanımını izle
docker stats
Docker Best Practices
- Alpine image'ları tercih edin:
node:20-alpine(~50MB) vsnode:20(~1GB) - Multi-stage build kullanın: Build bağımlılıkları production image'ında olmasın
- Root kullanıcı ile çalışmayın: Güvenlik için non-root user oluşturun
- Layer caching'den faydalanın: Sık değişen dosyaları Dockerfile'ın sonuna koyun
.dockerignorekullanın: Gereksiz dosyaları build context'ten hariç tutun- Health check tanımlayın: Container'ın sağlık durumunu izleyin
- Environment variable'lar için secret management kullanın: Hassas verileri image'a gömmeyin
Sonuç
Docker, web geliştirme sürecinizi standartlaştırır ve ortam tutarsızlıklarını ortadan kaldırır. Dockerfile ile tekrarlanabilir build'ler, Docker Compose ile çoklu servis yönetimi ve multi-stage build'ler ile optimize edilmiş production image'ları oluşturabilirsiniz. Yerel geliştirme ortamınızda Docker kullanmaya başlayın, ardından CI/CD pipeline'larınıza ve production deployment'larınıza entegre edin.