Docker Compose ile Çoklu Servis Yönetimi: Pratik Örnekler

Docker Compose ile web sunucu, veritabanı ve cache servislerini tek komutla yönetin. YAML yapılandırması, networking ve volume örnekleriyle pratik rehber.

Modern web uygulamaları genellikle web sunucu, veritabanı, cache ve mesaj kuyruğu gibi birden fazla servisten oluşur. Her birini ayrı ayrı yönetmek karmaşık ve hata eğilimlidir. Docker Compose, tüm bu servisleri tek bir YAML dosyasında tanımlayarak docker compose up komutuyla ayağa kaldırmanızı sağlar. Bu rehberde çoklu servis yapılandırması, networking, volume yönetimi ve production best practice'lerini pratik örneklerle ele alıyoruz.

Docker Compose Nedir ve Neden Kullanılır?

Docker Compose, çoklu container uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. docker-compose.yml (veya compose.yaml) dosyasında servisler, ağlar ve volume'lar deklaratif olarak tanımlanır. Tek bir komutla tüm altyapı oluşturulur, durdurulur veya yeniden başlatılır.

Geliştirme ortamında Docker Compose kullanmak "benim makinemde çalışıyor" sorununu ortadan kaldırır. Yeni bir ekip üyesi projeyi klonlayıp docker compose up çalıştırarak dakikalar içinde tam çalışan bir ortama sahip olur. CI/CD pipeline'larında da test ortamı oluşturmak için yaygın olarak kullanılır.

💡 İpucu: Docker Compose V2, Docker CLI'ye entegre edilmiştir. Artık docker-compose yerine docker compose (tire olmadan) komutunu kullanabilirsiniz. V2, daha hızlı başlatma süreleri ve daha iyi hata mesajları sunar.

Compose YAML Dosya Yapısı

Bir compose dosyası dört ana bölümden oluşur: services, networks, volumes ve configs. Services bölümü her container'ın image, port, environment variable ve bağımlılıklarını tanımlar. Aşağıdaki tablo temel direktifleri özetler.

Direktif Açıklama Örnek
image Kullanılacak Docker image postgres:16-alpine
build Dockerfile'dan image oluşturma build: ./app
ports Port eşleme (host:container) "3000:3000"
volumes Kalıcı veri depolama db-data:/var/lib/postgresql/data
depends_on Servis başlatma sırası depends_on: [db, redis]
environment Ortam değişkenleri POSTGRES_PASSWORD: secret

Pratik Örnek: Node.js + PostgreSQL + Redis

Tipik bir web uygulaması stack'i üç servisten oluşur: uygulama sunucusu, veritabanı ve cache. Compose dosyasında her servis kendi ağında iletişim kurar. depends_on ile başlatma sırası belirlenir ancak servisin hazır olmasını garanti etmez — bunun için healthcheck tanımlamanız gerekir.

⚠️ Önemli: Environment variable'larda hassas bilgileri (şifreler, API anahtarları) doğrudan compose dosyasına yazmayın. .env dosyası veya Docker secrets kullanın. .env dosyasını .gitignore'a eklemeyi unutmayın.

Docker Compose Networking

Docker Compose varsayılan olarak tüm servisler için bir bridge network oluşturur. Servisler birbirlerine servis adıyla erişir — örneğin uygulama container'ı veritabanına db:5432 adresiyle bağlanır. Özel network tanımlayarak servisleri izole edebilirsiniz: frontend servisleri sadece backend ile, backend sadece veritabanı ile iletişim kurabilir.

Birden fazla compose projesi arasında iletişim gerekiyorsa external network kullanın. Bu yaklaşım mikroservis mimarisinde her servisin kendi compose dosyasına sahip olduğu senaryolarda işe yarar. Daha fazla bilgi için Docker ile geliştirme ortamı kurma rehberimize göz atın.

Volume Yönetimi ve Veri Kalıcılığı

Container'lar geçicidir — durdurulduğunda içindeki veriler kaybolur. Named volume'lar veritabanı dosyaları, upload dizinleri ve log dosyaları gibi kalıcı verileri container yaşam döngüsünden bağımsız tutar. Geliştirme ortamında bind mount kullanarak kaynak kodunuzu container'a bağlayabilir ve hot-reload özelliğinden yararlanabilirsiniz.

Volume backup stratejisi oluşturmak production ortamında kritiktir. docker compose exec db pg_dump komutuyla veritabanı yedeği alabilir veya volume'u doğrudan tarball olarak dışa aktarabilirsiniz. Docker volume dokümantasyonu detaylı bilgi sunar.

Production Ortamında Docker Compose Best Practices

Docker Compose küçük ve orta ölçekli production ortamlarında kullanılabilir. Ancak yüksek erişilebilirlik ve otomatik ölçekleme gerektiren senaryolarda Kubernetes tercih edilmelidir. Production compose dosyasında restart: unless-stopped politikası, resource limit'ler ve healthcheck tanımları mutlaka bulunmalıdır.

  • ✓
    Healthcheck: Her servis için healthcheck tanımlayarak bağımlılık sırasını güvenilir hale getirin
  • ✓
    Resource Limits: CPU ve bellek limitleri ile container'ların host kaynaklarını tüketmesini önleyin
  • ✓
    Logging: JSON log driver kullanarak merkezi log toplama sistemine entegre edin

Compose override dosyaları (docker-compose.override.yml) geliştirme ve production yapılandırmalarını ayırmak için kullanılır. Base dosyada ortak ayarlar, override dosyasında ortama özel değişiklikler tanımlanır. Docker Compose multiple files dokümantasyonu bu konuda detaylı bilgi sunar.

Sıkça Sorulan Sorular

Docker Compose production ortamında kullanılabilir mi?

Evet, tek sunuculu küçük ve orta ölçekli uygulamalar için uygundur. Ancak birden fazla sunucu, otomatik ölçekleme veya sıfır kesinti dağıtımı gerektiren senaryolarda Kubernetes veya Docker Swarm tercih edilmelidir.

depends_on servislerin hazır olmasını garanti eder mi?

Hayır, depends_on yalnızca başlatma sırasını belirler. Servisin gerçekten hazır olduğunu doğrulamak için condition: service_healthy ile healthcheck kullanmanız gerekir. Veritabanının bağlantı kabul etmesi birkaç saniye sürebilir.

Compose dosyasında hassas bilgileri nasıl yönetirim?

.env dosyası ile environment variable'ları dışarıdan yükleyin ve bu dosyayı .gitignore'a ekleyin. Daha güvenli bir yaklaşım için Docker secrets veya HashiCorp Vault gibi secret management araçları kullanabilirsiniz.

Docker Compose ile çoklu servis yönetimini öğrendikten sonra CI/CD pipeline rehberimizi ve Redis cache entegrasyonu makalemizi de incelemenizi öneririz.

Docker-Ready Cloud Sunucular

Hosted Cloud sunucularında Docker ve Docker Compose önceden kurulu gelir. Uygulamalarınızı dakikalar içinde deploy edin.

Cloud Sunucu Planlarını İnceleyin
E

Elif Demir

Cloud Solutions Architect

Kurumsal bulut geçiş projeleri ve hibrit altyapı tasarımı konusunda uzman. AWS, Azure ve özel bulut ortamlarında 8 yıllık deneyime sahiptir.

Yorumlar yakında