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-stoppedekleyin. - 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
- Volume kullanmadan veritabanı çalıştırmak.
depends_onile hazır olma bekleme (health check kullanın).- Bind mount ile Windows/Mac’te performans problemi (cached/delegated).
- 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.