Bloglara Dön

Docker Compose Kullanımı ve Gerçek Dünya Örnekleri

Docker Compose, birden fazla konteyneri tek YAML dosyasıyla tanımlayıp ayağa kaldırmanızı sağlar. Modern web uygulamaları genelde app + veritabanı + cache + queue worker + reverse proxy gibi 4-6 servisten oluşur. Bu servisleri tek tek docker run ile yönetmek zaman kaybıdır. Compose ile docker compose up -d yazarak tüm stack’i saniyeler içinde ayağa kaldırırsınız.

Bu rehberde Laravel + MySQL + Redis + Nginx + Queue Worker + Scheduler örneğini uçtan uca göreceksiniz. Rehberin sonunda production için ek override dosyası, health check ve log yönetimi bulunacak.

Neden Compose?

  • Tek komutla tüm stack.
  • Servisler arası isim tabanlı ağ (DNS).
  • Ortama göre override (dev/staging/prod).
  • CI/CD entegrasyonu kolay.
  • Ekip üyeleri için “onboarding 5 dakika”.

Örnek docker-compose.yml

services:
  app:
    build: .
    volumes:
      - .:/var/www/html
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      DB_HOST: db
      REDIS_HOST: redis
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - .:/var/www/html
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app
    restart: unless-stopped

  db:
    image: mysql:8
    environment:
      MYSQL_DATABASE: app
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 5
    restart: unless-stopped

  redis:
    image: redis:alpine
    restart: unless-stopped

  queue:
    build: .
    command: php artisan queue:work --tries=3
    depends_on:
      - db
      - redis
    restart: unless-stopped

  scheduler:
    build: .
    command: php artisan schedule:work
    depends_on:
      - db
    restart: unless-stopped

volumes:
  db_data:

Komutlar

  • docker compose up -d — tüm stack’i ayağa kaldır.
  • docker compose logs -f app — app log’larını canlı izle.
  • docker compose exec app bash — app konteynerinde shell.
  • docker compose ps — servis durumları.
  • docker compose down — durdur ve kaldır.
  • docker compose down -v — volume’ları da sil.
  • docker compose build --no-cache — image’ı sıfırdan.

Best Practice

  • Env değişkenlerini .env dosyasında tutun.
  • Production’da restart: unless-stopped ekleyin.
  • Log driver’ı json-file yerine Loki, Vector veya Papertrail gibi merkezi bir sisteme yönlendirin.
  • Health check her servise ekleyin.
  • Production için ayrı override dosyası (compose.prod.yml) kullanın.
  • Secrets için Docker Secrets veya .env.production.
  • Image’ı sabit versiyon ile pinleyin.

Ortam Bazlı Override

docker compose -f compose.yml -f compose.prod.yml up -d

Development’ta volume mount, production’da build kullanın. Debug modu, port expose ve log seviyesi ortama göre değişmeli.

Ölçeklendirme

docker compose up -d --scale queue=4

Bir tek queue worker yerine 4 tanesini paralel çalıştırın. Yoğun trafik dönemlerinde kritik.

Sık Yapılan Hatalar

  1. Volume kullanmadan veritabanı çalıştırmak.
  2. depends_on ile hazır olma bekleme (health check kullanın).
  3. Bind mount ile Windows/Mac’te performans problemi (cached/delegated).
  4. Environment ile secrets yayınlamak.

Sıkça Sorulan Sorular

version alanı zorunlu mu?

2024 sonrası artık gerekmiyor. Compose v2 otomatik algılar.

Production için Kubernetes şart mı?

Küçük/orta ölçek için hayır. Compose + tek VPS çoğu senaryoyu karşılar.

Bind mount mı volume mı?

Development: bind mount (canlı senkron). Production: named volume (performans).

Sonuç

Docker Compose, geliştirme ortamlarında dakikalar içinde tam bir stack kurmanın en verimli yoludur. Küçük ve orta ölçek üretim ortamları için de tercih edilebilir; büyüdüğünüzde Kubernetes veya managed servisleri değerlendirin.