Docker Nedir? Konteyner Teknolojisine Giriş
Docker, uygulamalarınızı bağımlılıklarıyla birlikte yalıtılmış ortamlarda (konteyner) çalıştırmanızı sağlayan açık kaynaklı bir platformdur. "Bende çalışıyor ama production'da çalışmıyor" sorununu ortadan kaldırmak için tasarlanmıştır.
Neden Docker?
Geleneksel sunucu yapılandırmasında her geliştirici farklı bir ortamda çalışabilir: farklı Node.js sürümleri, farklı Python kütüphaneleri, farklı işletim sistemi yapılandırmaları. Docker bu sorunları kökten çözer.
Docker'ın Avantajları:
- Taşınabilirlik: Geliştirme ortamından production'a aynı konteyner
- İzolasyon: Her uygulama kendi bağımlılıklarıyla birlikte çalışır
- Hız: VM'lere göre çok daha hızlı başlangıç süresi
- Kaynak verimliliği: Aynı host üzerinde onlarca konteyner çalışabilir
- Ölçeklenebilirlik: Kubernetes ile kolayca horizontal scaling
Temel Kavramlar
Image (İmaj)
Uygulamanızı çalıştırmak için gereken her şeyi içeren salt okunur şablon. Bir Docker image, katmanlardan (layer) oluşur.
Ubuntu 22.04 (base)
└── Node.js 20 (layer)
└── npm install (layer)
└── uygulama kodu (layer)
Container (Konteyner)
Çalışan bir image örneğidir. Image bir sınıf ise, container bu sınıfın bir nesnesidir (instance). Aynı image'dan yüzlerce container başlatabilirsiniz.
Dockerfile
Image'ın nasıl oluşturulacağını tanımlayan metin dosyasıdır.
Registry
Image'ların depolandığı ve paylaşıldığı yer. En popüleri Docker Hub'dır.
İlk Dockerfile'ınız
Basit bir Node.js uygulaması için:
# Temel image
FROM node:20-alpine
# Çalışma dizini
WORKDIR /app
# Bağımlılıkları önce kopyala (cache optimizasyonu)
COPY package*.json ./
RUN npm ci --only=production
# Uygulama kodunu kopyala
COPY . .
# 3000 portunu aç
EXPOSE 3000
# Başlatma komutu
CMD ["node", "server.js"]
Neden package*.json'ı önce kopyalıyoruz? Docker her katmanı cache'ler. Bağımlılıkları kod değişikliklerinden önce kopyalarsak, sadece package.json değiştiğinde npm ci yeniden çalışır. Kod değişikliklerinde cache'den devam eder — build çok daha hızlı olur.
Temel Docker Komutları
# Image oluştur
docker build -t benim-uygulama:1.0 .
# Container başlat
docker run -d -p 3000:3000 --name api benim-uygulama:1.0
# Çalışan container'ları listele
docker ps
# Tüm container'ları listele (durdurulmuş dahil)
docker ps -a
# Container loglarını izle
docker logs -f api
# Container'a terminal aç
docker exec -it api sh
# Container'ı durdur ve sil
docker stop api && docker rm api
# Image'ları listele
docker images
# Kullanılmayan kaynakları temizle
docker system prune -a
Docker Compose
Birden fazla servisi (uygulama + veritabanı + cache) birlikte yönetmek için:
# docker-compose.yml
version: '3.8'
services:
api:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
- redis
restart: unless-stopped
db:
image: postgres:16-alpine
volumes:
- pg_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
pg_data:
redis_data:
# Tüm servisleri başlat
docker compose up -d
# Logları izle
docker compose logs -f
# Servisleri durdur
docker compose down
# Volume'larla birlikte sil (DİKKAT: veri kaybı!)
docker compose down -v
Container vs Sanal Makine
| Özellik | Docker Container | Sanal Makine |
|---|---|---|
| Başlama süresi | Milisaniyeler | Dakikalar |
| Boyut | MB'lar | GB'lar |
| Kaynak kullanımı | Düşük | Yüksek |
| İzolasyon | Process seviyesi | Tam OS |
| Taşınabilirlik | Çok yüksek | Orta |
Best Practices
1. Alpine image kullan
# ❌ Büyük
FROM node:20
# ✅ ~70 MB daha küçük
FROM node:20-alpine
2. .dockerignore dosyası ekle
node_modules
.git
.env
*.log
dist
coverage
3. Root olmayan kullanıcı
# Güvenlik: root yerine düşük yetkili kullanıcı
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
4. Multi-stage build ile küçük image
# Build aşaması
FROM node:20-alpine AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
# Production aşaması — sadece çıktıyı al
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]
Yaygın Hatalar
1. Her şeyi tek katmana sıkıştırma:
# ❌ Kötü — cache çalışmaz
RUN apt-get update && apt-get install -y curl && npm install && npm run build
# ✅ İyi — her adım ayrı katman
RUN apt-get update && apt-get install -y curl
RUN npm install
RUN npm run build
2. ENV değişkenlerini image'a gömmek:
# ❌ Güvenlik açığı — image herkes görebilir
ENV DATABASE_PASSWORD=supersecret123
# ✅ Runtime'da geç
docker run -e DATABASE_PASSWORD=$DB_PASS myapp
Araçlarla Bağlantı
Docker ile çalışırken sık kullanılan MagmaNex araçları:
- Unix Timestamp Converter: Docker log tarihlerini çevirmek için
- Chmod Calculator: Container dosya izinleri için
- Cron Generator: Container içi zamanlanmış görevler için
- JSON Formatter: Docker Compose ve config dosyalarını düzenlemek için
Docker, modern yazılım geliştirmenin temel taşlarından biridir. Bu kılavuzu okuduktan sonra Kubernetes ve Docker Swarm ile ölçeklendirmeyi araştırmanızı tavsiye ederiz.

