Docker Compose, birden fazla container''ı tek komutla çalıştırmanın ve aralarındaki ağ, volume, depend-on ilişkilerini tek dosyada tanımlamanın standart yoludur. Development''tan production''a kadar her aşamada vazgeçilmezdir. Bu rehber tipik bir web uygulaması kümesinin kuruluşunu anlatır.

Temel compose.yml

İlgili rehberler: DNS nedir, ayarları değiştirme · Domain adı ve WHOIS sorgulama · Hosting türleri rehberi · Nginx yapılandırma · Plesk panel yönetimi

# compose.yml (docker-compose.yml de çalışır)
services:
  app:
    build: .
    ports: ['3000:3000']
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://app:secret@db:5432/appdb
      REDIS_URL: redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ['CMD', 'pg_isready', '-U', 'app']
      interval: 5s
      retries: 10
    restart: unless-stopped

  cache:
    image: redis:7-alpine
    volumes:
      - redisdata:/data
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports: ['80:80', '443:443']
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/letsencrypt:ro
    depends_on: [app]
    restart: unless-stopped

volumes:
  pgdata:
  redisdata:

Temel Komutlar

# Build + başlat (detached)
docker compose up -d --build

# Log'ları izle
docker compose logs -f app
docker compose logs --since 10m

# Tek servisi yeniden başlat
docker compose restart app

# Servisi rebuild et ve başlat
docker compose up -d --build app

# Durum
docker compose ps

# Tüm servisleri kapat
docker compose down
# Volume'leri de sil (veri gider!)
docker compose down -v

Environment Dosyaları

Hassas veriyi compose.yml''de bırakmayın. .env dosyası kullanın — Compose otomatik okur.

# compose.yml
services:
  app:
    environment:
      DATABASE_URL: ${DATABASE_URL}
      JWT_SECRET: ${JWT_SECRET}

# .env (git-ignore!)
DATABASE_URL=postgres://...
JWT_SECRET=supersecret

# Farklı env dosyası
docker compose --env-file .env.production up -d

Network Yönetimi

Default olarak Compose projeye özel bir bridge network oluşturur; servisler birbirini servis adı ile bulur (postgres://db:5432). Özel network tanımları ile izolasyon sağlayabilirsiniz.

services:
  frontend:
    networks: [public]
  backend:
    networks: [public, internal]
  db:
    networks: [internal]  # dış dünyadan izole

networks:
  public:
  internal:
    internal: true  # internet erişimi yok

Volume Tipleri

  • Named volume: pgdata:/var/lib/postgresql/data — Docker yönetir, taşınabilir
  • Bind mount: ./config:/etc/app — host dizini, dev için ideal
  • tmpfs: type: tmpfs — sadece RAM, sensitive temp data
services:
  app:
    volumes:
      - ./src:/app/src           # bind (hot reload)
      - node_modules:/app/node_modules  # named
      - type: tmpfs
        target: /tmp

Production Best Practices

services:
  app:
    image: ghcr.io/user/app:v1.2.3  # tag'li, :latest değil
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          memory: 128M
    logging:
      driver: json-file
      options:
        max-size: '10m'
        max-file: '5'
    read_only: true
    tmpfs: ['/tmp', '/var/run']
    security_opt:
      - no-new-privileges:true
    cap_drop: [ALL]
Uyarı
Production''da :latest tag''i yerine her zaman pinned version (:v1.2.3 veya SHA) kullanın. Aksi halde yeniden başlatma beklenmedik değişiklik getirir.

Override Dosyaları (Dev vs Prod)

# compose.yml (baz)
services:
  app:
    image: myapp:latest
    restart: unless-stopped

# compose.override.yml (default yüklenir, dev için)
services:
  app:
    build: .
    volumes: ['./src:/app/src']
    command: npm run dev

# compose.prod.yml
services:
  app:
    image: ghcr.io/user/app:v1.2.3
    environment:
      NODE_ENV: production

# Kullanım
docker compose up                             # override'ı otomatik yükler
docker compose -f compose.yml -f compose.prod.yml up -d

Healthcheck ve Depends-on

depends_on sadece başlangıç sırasını garantiler, servis hazır olduğunu değil. Hazır olma için condition: service_healthy ve healthcheck tanımı şart.

services:
  app:
    depends_on:
      db:
        condition: service_healthy
  db:
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U app']
      interval: 5s
      timeout: 3s
      retries: 10
      start_period: 10s

Profiles

services:
  app: {}
  db: {}
  monitoring:
    image: prom/prometheus
    profiles: [monitoring]  # default olarak başlamaz

# Kullanım
docker compose up                          # app, db
docker compose --profile monitoring up     # + monitoring

Modern Web Hosting ve Sunucu Altyapısı

Performanslı bir web hosting hizmeti üç temel altyapı kararına dayanır: NVMe SSD diskler (klasik SATA SSD'ye göre 4-6 kat IOPS), LiteSpeed Web Server veya Nginx + LSCache kombinasyonu (Apache'ye göre 9 kat istek kapasitesi) ve CloudLinux + Imunify360 izolasyonu. Hosting sağlayıcısının kontrol paneli (cPanel, Plesk, DirectAdmin), günlük yedek politikası, veri merkezi konumu ve destek ekibi yanıt süresi de büyük fark yaratır. Türkiye lokasyonu yerli ziyaretçilere düşük gecikme verirken; Hetzner Frankfurt veya OVH Roubaix gibi Avrupa lokasyonları global trafik için daha uygundur. Site büyüdükçe paylaşımlı hosting'ten VPS, ardından dedicated server'a geçiş; CPU/RAM/disk kaynaklarının web sitemizin ihtiyaçlarına göre ölçeklenmesini sağlar.

Docker Compose kurulumu

Mevcut uygulamanızı containerize etmek ve Compose ile production deploy için iletişime geçin

WhatsApp