MagmaNex LogoMagmaNex
Ana Sayfa/Blog/Docker Nedir? Konteyner Teknolojisine Giriş
Docker Nedir? Konteyner Teknolojisine Giriş
DevOps25 Mayıs 2026· 12 dk okuma

Docker Nedir? Konteyner Teknolojisine Giriş

Docker nedir, nasıl çalışır, neden kullanılır? Konteyner teknolojisini pratik örneklerle öğrenin — kurulumdan ilk container'a kadar.

#docker#konteyner#devops#linux#deployment

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ı:

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.


🛠 İlgili Araçlar

📚 İlgili Yazılar

← Tüm Yazılar🛠 Araçları Keşfet