Verimli çoklu konteyner uygulama geliştirme için Docker Compose'u ustalıkla kullanın. En iyi uygulamalar, ölçekleme, orkestrasyon ve gerçek dünya örnekleri.
Docker Compose, çoklu konteyner Docker uygulamalarının yönetimini basitleştirir ve geliştiricilerin karmaşık uygulamaları zahmetsizce yazıp çalıştırmasını sağlar.
Ara seviyedeki DevOps mühendisleri, backend geliştiricileri ve bulut-yerel geliştiriciler; özellikle mikro hizmetler veya çok hizmetli mimariler üzerinde çalışanlar, sıklıkla çok sayıda birbiriyle bağlantılı konteyneri yönetme zorluğuyla karşılaşır. Docker Compose bu karmaşıklıkları ele alarak geliştirme ve test iş akışlarını sadeleştirir.
Bu makalede, Docker Compose'u kullanmak için bilmeniz gereken her şeyi öğreneceksiniz. Docker'a yeni başlıyorsanız Yeni Başlayanlar için Docker Rehberimize göz atın.
Docker Compose nedir?
Docker Compose, tek bir YAML yapılandırma dosyası aracılığıyla çoklu konteyner Docker uygulamalarını tanımlamak ve orkestre etmek için tasarlanmış bir araçtır.
Compose ile hizmetleri, ağları, volumeleri, ortam ayarlarını ve bağımlılıkları kolayca belirtebilirsiniz. Yerel geliştirme, test kurulumları, hızlı prototipleme ve daha küçük üretim ortamları için idealdir.
Docker Compose'un yaygın kullanım alanları arasında mikro hizmet mimarileri gibi gerçek sistemleri yansıtan yerel ortamlar oluşturmak bulunur. Bileşen etkileşimlerini net bir şekilde tanımlayarak tutarlılık, kullanım kolaylığı ve daha hızlı yineleme döngüleri sağlar.
Neden doğrudan Kubernetes kullanmayasınız diye düşünüyor olabilirsiniz. Öncelikle, küçük projeler ve yerel testler için fazla ağırdır. Kubernetes vs. Docker öğreticimizde göreceğiniz üzere, Kubernetes kümeler genelinde birden çok konteyneri yönetmek için daha uygundur. Docker ve Kubernetes ile Konteynerleştirme ve Sanallaştırma kursumuz, Docker ve Kubernetes ile uygulama oluşturma ve dağıtımını daha derinlemesine inceler.
Neden Manuel Docker Komutları Yerine Docker Compose?
Birden fazla konteyneri tek tek yönetmek şu nedenlerle hızla karmaşık hale gelebilir:
Karmaşık bağımlılık sıraları,
Tutarsız ortamlar ve
Ölçeklenebilirlik sorunları.
Manuel komutlarla insan hatası, yapılandırma sapması ve verimsiz iş akışları riski oluşur.
Docker Compose, tüm uygulama hizmetlerini ve bağımlılıklarını tek bir YAML dosyasında tanımlayarak bu sorunları çözer. Bu, tutarlılık, ölçeklenebilirlik ve bağımlılık yönetiminde kolaylık sağlar; hataları önemli ölçüde azaltır ve üretkenliği artırır.
Compose, konteynerleri manuel olarak oluşturup birbirine bağlamaktan daha hızlıdır. Ayrıca compose, tüm konteynerler arasında iletişim için varsayılan bir ağ oluşturur. Ek olarak volumeleri yönetir ve bir hizmet değiştirildiğinde veya yeniden başlatıldığında bunların otomatik olarak yeniden bağlanmasını sağlar.
Docker, konteynerleri oluşturma, çalıştırma ve yönetme platformuyken; Docker Compose, çoğunlukla docker-compose.yml olmak üzere bir YAML dosyası kullanarak birden çok konteyneri tanımlamayı ve yönetmeyi kolaylaştıran araçtır.
Docker tekil konteynerleri ele alır; Docker Compose ise bunları tek bir hizmet halinde istifleyebilmenizi sağlar. Örneğin; bir uygulamanın backend, frontend, veritabanı, önbellekleme vb. bileşenleri gibi.
Konteynerlerinizi Docker Compose olmadan da oluşturup çalıştırabilirsiniz. Ancak her şeyi tek bir docker-compose.yml dosyasında kapsüllemek, birden çok konteyneri yönetmeyi kolaylaştırır. Ayrıca uygulamanızı tek bir komutla herhangi bir ortamda ayağa kaldırmanızı mümkün kılar.
Uygulamalı ayrıntılara dalmadan önce, Docker Compose'un temel ilkelerini ve sözdizimini anlamak önemlidir. Compose kullanmadan önce, Ubuntu’da Docker Kurulumu: Kurulumdan İlk Konteynere rehberimizdeki adımları izleyerek Docker’ı kurduğunuzdan emin olun.
Kavramsal çerçeve
Docker Compose, yerel geliştirme ve daha basit dağıtımlar için konteyner orkestrasyonunun karmaşıklığını soyutlar. YAML formatlı bir compose dosyasıyla, ihtiyaç duyulan hizmetleri beyan eder, bağımlılıklarını tanımlar, ağları, volumeleri, ortam değişkenlerini ve daha fazlasını belirtirsiniz. Compose bu hizmetlerin başlatılmasını, durdurulmasını, ölçeklenmesini ve birbirine bağlanmasını verimli biçimde yönetir.
Temel Compose sözdizimi
Docker Compose, yalın bir YAML sözdizimi etrafında döner. Temel bileşenler şunlardır:
services: konteynerleştirilmiş uygulamaları tanımlamak için
images veya build bağlamları: konteynerleri belirtmek için
ports: hizmetleri dışa açmak için
volumes: kalıcı veri depolama için
networks: hizmetler arası iletişim için
Hizmet Tanımı ve Uygulama Mimarisi
Compose dosyaları, uygulamanın hizmetlerini ve bağlantılarını temsil eder.
Hizmetleri tanımlama
Hizmetler bir Compose dosyasının özüdür. Birden çok hizmeti (örneğin web arayüzleri, veritabanları ve önbellekleme hizmetleri) net biçimde tanımlayıp adlandırabilir, konteyner başlatma sırasını kontrol etmek için depends_on gibi basit anahtar sözcüklerle bağımlılıkları belirtebilirsiniz.
Ağ temelleri
Docker Compose, tanımlanan hizmetler arasında iletişimi kolaylaştırmak için otomatik olarak varsayılan ağlar oluşturur. Geliştiriciler, gerekirse gelişmiş izolasyon veya ayrıntılı ağ gereksinimleri için özel ağlar da belirleyebilir.
Volume yönetimi
Volumeler, veri kalıcılığını konteyner yaşam döngülerinin ötesine taşır. Adlandırılmış volumeler belirtebilir veya ana makine dizinlerini konteynerlere bağlayabilirsiniz; böylece veritabanları, günlükler veya diğer durum bilgisi içeren veriler tutarlı biçimde kalıcı olur.
Ortam değişkenleri
Compose, ortam değişkenleri ve sırları konteynerlere güvenli şekilde iletmeyi basitleştirir. Hizmetler altında doğrudan bildirimleri ve hassas değerleri Docker tanımlarından ayrı ve güvenli tutmak için compose dosyalarının yanında saklanan env dosyalarına referans vermeyi destekler.
Docker Compose ile Ölçekleme ve Orkestrasyon
Docker Compose, özellikle hızlı yük testi senaryolarında veya paralel hizmetleri değerlendirirken yararlı olan temel ölçekleme ve orkestrasyonu da sadeleştirir.
Hizmetleri ölçekleme
Compose'daki "--scale" bayrağı, hizmetlerin birden fazla kopyasını hızla ayağa kaldırmanıza olanak tanır. Bu, yük dengeleme değerlendirmesi veya eşzamanlı isteklerin ele alınması gibi test senaryolarını basit hale getirir.
Örneğin, bir Flask uygulaması konteynerini ölçeklemek tek bir komutla yapılabilir:
Docker Compose yerel geliştirme ve daha küçük ölçekli kurulumlarda mükemmel olsa da, çoklu ana bilgisayar ve üretim ölçekli orkestrasyonda sınırlıdır. Çok sayıdaki ana bilgisayar üzerinde karmaşık, üretim düzeyinde senaryolar için Docker Swarm veya Kubernetes gibi daha güçlü orkestratörler uygundur; çünkü Compose’da bulunmayan güçlü yük dengeleme, kendi kendini iyileştirme, gelişmiş ağ oluşturma ve büyük ölçekli ölçeklenebilirlik sunarlar.
Yerel geliştirme, basit çoklu konteyner uygulamalar
Küçük ve orta ölçekli üretim kümeleri
Büyük ölçekli, üretim düzeyi orkestrasyon
Çoklu Ana Bilgisayar Desteği
Desteklenmez
Yerleşik
Doğal destek
Ölçeklenebilirlik
Yalnızca manuel ölçekleme
Entegre kümeleme ile orta düzey
Yüksek, devasa iş yükleri için tasarlanmış
Yük Dengeleme
Yerleşik yük dengeleyici yok
Yük dengeleme ile dahili yönlendirme
Gelişmiş servis keşfi ve yük dengeleme
Kendi Kendini İyileştirme
Kendi kendini iyileştirme yok
Temel hata durumunda yeniden başlatma
Gelişmiş otomatik kurtarma ve aşamalı güncellemeler
Ağ Oluşturma
Temel köprü (bridge) ağları
Düğümler arasında örtülü (overlay) ağlar
Zengin ağ modeli (CNI)
Öğrenme Eğrisi
Öğrenmesi kolay
Orta karmaşıklık
Dik, birçok bileşen ve yapılandırma içerir
Ekosistem Entegrasyonu
Sınırlı araç seti
Orta düzey CLI/GUI araçları
Geniş ekosistem (Helm, operatörler vb.)
Kaynak Yükü
Asgari
Hafif
Daha ağır, daha fazla sistem kaynağı gerektirir
Durum Yönetimi
Yerleşik durum farkındalığı yok
Raft ile temel
Deklaratif, tam durum yönetimi
Dağıtım Stili
YAML tabanlı (docker-compose.yml)
YAML + CLI
YAML (Deployment, Service vb.)
En Uygun Olduğu
Geliştirici makineleri, CI hatları, hızlı demolar
Küçük ekipler, üretimde basit servisler
Karmaşık uygulamalar, mikro hizmetler, kurumsal altyapı
Verimli Compose Kullanımı için Optimizasyon Teknikleri
Verimli Docker Compose kullanımı; derlemeleri optimize etmeyi, sağlık kontrolleri eklemeyi ve hizmet kaynaklarını yönetmeyi içerir. Bu bölümde bu optimizasyon teknikleri hakkında daha fazlasını öğreneceksiniz.
Verimli derleme stratejileri
Dockerfile’lardaki çok aşamalı (multi-stage) derlemeleri kullanmak, Docker imaj boyutlarını azaltmaya yardımcı olur; derleme önbelleğini açıkça kullanmak ise geliştirme ve CI süreçlerini önemli ölçüde hızlandırır.
Sağlık kontrolleri ve yeniden başlatma ilkeleri
Compose, uygulama güvenilirliğini korumak için açık konteyner sağlık kontrolleri tanımlamanıza izin verir. Yeniden başlatma ilkeleri, başarısız konteynerlerin otomatik olarak yeniden başlatılmasını sağlayarak dayanıklılığı artırır.
Kaynak sınırlarını yönetme
CPU ve bellek sınırlarını doğrudan Compose YAML tanımlarında ayarlamak, kaynak tahsisini kontrol etmenize yardımcı olur; öngörülebilirliği ve kaynak verimliliğini artırır.
Docker Compose dosyası üç hizmetten oluşan çoklu konteyner bir uygulama tanımlar:
redis
web (Gunicorn ile Flask uygulaması)
worker (Celery worker)
redis hizmeti için:
Resmi Redis 7 imajını kullanır.
Konteyner adını redis olarak ayarlar.
Konteyner içindeki 6379 portunu ana makinede 6379 ile eşler.
Çökerse her zaman yeniden başlatılır (restart: always).
Konteyner sağlıksız ilan edilmeden önce her 30 saniyede bir redis-cli ping çalıştıran, 5 saniyede zaman aşımına uğrayan ve 3 kez yeniden deneyen bir healthcheck tanımlar.
Web hizmeti için:
İmajı mevcut dizinden derler (build: .).
Konteyneri flask_app olarak adlandırır.
Komutu çalıştırır: gunicorn app:app, gevent işçi sınıfını kullanır, 0.0.0.0:5000’e bağlanır ve 3000 saniyelik uzun bir zaman aşımıyla çalışır
Konteynerdeki 5000 portunu ana makinede 5000 ile eşler.
redis hizmetine bağımlılık bildirir, böylece Redis önce başlar.
REDIS_URL adlı bir ortam değişkenini dahili Redis konteynerini işaret edecek şekilde ayarlar.
.env dosyasından ek ortam değişkenleri yükler.
Üç yerel klasörü konteynere bağlar:
./shorts → /app/shorts,
./temp_uploads → /app/temp_uploads
./uploads → /app/uploads
Çökerse her zaman yeniden başlatılacak şekilde yapılandırılmıştır.
worker hizmeti için:
Ayrıca imajı mevcut dizinden derler (build: .) ve web hizmetiyle aynı Dockerfile'ı yeniden kullanır.
Konteyneri şu şekilde adlandırır: celery_worker.
celery -A celery_worker.celery worker --loglevel=info komutunu çalıştırır; bu, arka plan işlerlerini işlemek için bir Celery worker başlatır.
redis hizmetine bağımlılık bildirir, böylece Redis önce başlar.
Redis aracısına bağlanmak için aynı REDIS_URL ortam değişkenini ayarlar.
.env dosyasından diğer ortam değişkenlerini yükler.
web hizmetindekiyle aynı üç klasörü bağlar; böylece hem web uygulaması hem de worker dosyaları ve yüklemeleri paylaşabilir.
Çökerse her zaman yeniden başlatılacak şekilde yapılandırılmıştır.
Çoklu Konteyner Uygulamaları Oluşturma ve Çalıştırma
Docker Compose, rutin konteyner görevleri için sade bir araç seti sunar:
İmaj oluşturma
Tanımlı Dockerfile’larınıza göre konteyner imajları üretmek için docker compose build kullanın. Docker imajları oluşturma hakkında daha fazla bilgiyi Sıfırdan Docker Öğrenme: Veri Profesyonelleri için Rehber öğreticimizde ele alıyoruz.
Hizmetleri çalıştırma
docker compose up kullanmak, compose dosyasında tanımlanan tüm hizmetleri başlatır. Ayrık mod için docker compose up -d kullanın.Docker’a Giriş kursumuz, bir konteyneri arka planda çalıştırma hakkında daha fazla ayrıntıya iner.
Çalışan konteynerleri görüntüleme
Aktif konteynerleri ve durumlarını görmek için docker compose ps kullanarak tüm çalışan hizmetleri listeleyin.
Hizmetleri durdurma
Çalışan hizmetleri durdurmak için docker compose down kullanın.
Günlükleri görüntüleme
Günlükleri kontrol etmek için docker compose logs kullanın. Belirli bir konteynerin günlüklerini kontrol etmek için docker logs container_name kullanabilirsiniz. Günlükleri akış olarak izlemek için docker compose -f container_name kullanın.
Compose iş akışları, daha karmaşık geliştirme kurulumlarına veya farklı ortam yapılandırmalarına uyum sağlar.
Çoklu ortam yapılandırması
Birden fazla Compose dosyası veya geçersiz kılma (override) dosyaları, farklı ortam kurulumlarını (geliştirme, test, üretim) kolaylaştırır. Bu, tanımları bakımı kolay ve okunur tutarak, karmaşık yapılandırmalar oluşturmadan hızlı değişiklikleri mümkün kılar.
Bağımlılık yönetimi
depends_on temel başlatma sıralamasını ele alırken, karmaşık senaryolarda başlatma betikleri (ör. "wait-for-it") kullanılabilir; böylece, veritabanının hazır olması gibi belirli koşullar sağlandıktan sonra konteynerlerin başlaması güvence altına alınır.
CI/CD ile entegrasyon
Compose, sürekli entegrasyon iş akışlarına zahmetsizce entegre olur ve test için eksiksiz ortam kurulumlarını otomatikleştirir. GitLab CI ve GitHub Actions gibi platformlar, Compose entegrasyonu için yerel veya kolay yaklaşımlar sunarak otomatik testleri sadeleştirir.
En İyi Uygulamalar ve Yaygın Zorluklar
Compose tanımlarını düşünceli biçimde düzenleyip yapılandırarak yaygın tuzaklardan kaçınabilir ve sürdürülebilir yapılandırmalar oluşturabilirsiniz.
Compose Dosyası Organizasyonu
Compose dosyalarınızı net ve modüler tutun. Daha basit projeler için tek bir dosya yeterli olabilir; ancak daha büyük uygulamalarda override özelliğini kullanarak yapılandırmayı birden fazla Compose dosyasına bölmeyi düşünün. Bu şunları sağlar:
Kolaylaştırılmış sürüm kontrolü ve iş birliği; çünkü bir hizmetteki değişiklikler tüm dosyayı etkilemez
Dosyaların okunmasını ve gezinmesini kolaylaştırmak için anlamlı hizmet adları ve tutarlı girinti kullanın.
Olası Tuzaklar
Şu yaygın hatalara dikkat edin:
İmajlar için latest etiketlerini kullanmak: Bu, gerçek imaj sürümü zamanla değişebileceğinden öngörülemezlik getirir. Tutarlılık sağlamak için her zaman imaj sürümlerini sabitleyin (örn. postgres:15.1).
Sırları sabit kodlamak: Hassas verileri (örn. API anahtarları, parolalar) Compose dosyalarına asla doğrudan eklemeyin. Bunun yerine ortam değişkenlerini, sürüm kontrolüne dahil edilmeyen .env dosyalarını veya Docker Secrets gibi gizli yönetimi araçlarını kullanın.
Aşırı karmaşık hizmet tanımları: Çok fazla mantığı veya çok sayıda sorumluluğu tek bir konteynere doldurma dürtüsüne direnin. Tek sorumluluk ilkesini izleyin ve mümkün olduğunda sadeliği tercih edin.
Açık ağ tanımlamalarını ihmal etmek: Varsayılan davranışa güvenmek yerine Compose içinde özel ağlar tanımlayın. Bu, hizmet iletişimi üzerinde daha iyi kontrol sağlar, port çakışmalarını azaltır ve güvenlik sınırlarını iyileştirir.
Bu uygulamaları benimseyerek, Compose tabanlı iş akışlarınız iş birliğine açık veya evrilen ortamlarda daha sağlam, güvenli ve bakımı kolay olacaktır.
Sonuç
Docker Compose, geliştiriciler için çoklu konteyner uygulamaları oluşturmayı, yönetmeyi ve çalıştırmayı önemli ölçüde basitleştirir. Açık YAML tabanlı tanımları, orkestrasyon kolaylığı ve doğrudan ölçekleme özellikleri, onu yerel geliştirme senaryoları ve daha basit dağıtım mimarileri için çok değerli kılar. Docker Swarm ve Kubernetes gibi gelişmiş orkestratörler büyük ölçekli üretim iş yükleri için daha uygun olsa da, Compose konteyner orkestrasyonu temellerini anlamak ve geliştirici iş akışlarını iyileştirmek için vazgeçilmez bir başlangıç noktası olmaya devam eder.
Docker Compose, Docker Swarm veya Kubernetes’ten nasıl farklıdır?⌄
Docker Compose, yerel geliştirme ve küçük ölçekli testler için idealdir. Otomatik ölçekleme ve kendi kendini iyileştirme gibi özelliklere sahip üretim düzeyi orkestrasyon için Docker Swarm ve Kubernetes daha uygundur.
Docker Compose hizmet bağımlılıklarını yönetebilir mi?⌄
Evet, Compose depends_on yönergesiyle bağımlılıkları tanımlamanıza olanak tanır. Veritabanının hazır olmasını beklemek gibi daha hassas kontrol için wait-for-it gibi harici yardımcı betikler kullanılabilir.
Docker Compose kullanarak birden çok ortamı nasıl yönetirim?⌄
Birden fazla Compose dosyası (ör. docker-compose.yml ve docker-compose.prod.yml) kullanabilir ve komutları çalıştırırken -f bayrağını kullanarak ortama göre yapılandırmaları geçersiz kılabilirsiniz.
Docker Compose’ta sağlık kontrolleri ve yeniden başlatma ilkeleri destekleniyor mu?⌄
Evet, Docker Compose konteyner sağlık kontrollerini ve yeniden başlatma ilkelerini destekler; bu da geliştirme ve test sırasında hizmetlerinizi daha dayanıklı hale getirmenize olanak tanır.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Docker Compose, çoklu konteyner Docker uygulamalarının yönetimini basitleştirir ve geliştiricilerin karmaşık uygulamaları zahmetsizce yazıp çalıştırmasını sağlar.
Ara seviyedeki DevOps mühendisleri, backend geliştiricileri ve bulut-yerel geliştiriciler; özellikle mikro hizmetler veya çok hizmetli mimariler üzerinde çalışanlar, sıklıkla çok sayıda birbiriyle bağlantılı konteyneri yönetme zorluğuyla karşılaşır. Docker Compose bu karmaşıklıkları ele alarak geliştirme ve test iş akışlarını sadeleştirir.
Bu makalede, Docker Compose'u kullanmak için bilmeniz gereken her şeyi öğreneceksiniz. Docker'a yeni başlıyorsanız Yeni Başlayanlar için Docker Rehberimize göz atın.
Docker Compose nedir?
Docker Compose, tek bir YAML yapılandırma dosyası aracılığıyla çoklu konteyner Docker uygulamalarını tanımlamak ve orkestre etmek için tasarlanmış bir araçtır.
Compose ile hizmetleri, ağları, volumeleri, ortam ayarlarını ve bağımlılıkları kolayca belirtebilirsiniz. Yerel geliştirme, test kurulumları, hızlı prototipleme ve daha küçük üretim ortamları için idealdir.
Docker Compose'un yaygın kullanım alanları arasında mikro hizmet mimarileri gibi gerçek sistemleri yansıtan yerel ortamlar oluşturmak bulunur. Bileşen etkileşimlerini net bir şekilde tanımlayarak tutarlılık, kullanım kolaylığı ve daha hızlı yineleme döngüleri sağlar.
Neden doğrudan Kubernetes kullanmayasınız diye düşünüyor olabilirsiniz. Öncelikle, küçük projeler ve yerel testler için fazla ağırdır. Kubernetes vs. Docker öğreticimizde göreceğiniz üzere, Kubernetes kümeler genelinde birden çok konteyneri yönetmek için daha uygundur. Docker ve Kubernetes ile Konteynerleştirme ve Sanallaştırma kursumuz, Docker ve Kubernetes ile uygulama oluşturma ve dağıtımını daha derinlemesine inceler.
Neden Manuel Docker Komutları Yerine Docker Compose?
Birden fazla konteyneri tek tek yönetmek şu nedenlerle hızla karmaşık hale gelebilir:
Manuel komutlarla insan hatası, yapılandırma sapması ve verimsiz iş akışları riski oluşur.
Docker Compose, tüm uygulama hizmetlerini ve bağımlılıklarını tek bir YAML dosyasında tanımlayarak bu sorunları çözer. Bu, tutarlılık, ölçeklenebilirlik ve bağımlılık yönetiminde kolaylık sağlar; hataları önemli ölçüde azaltır ve üretkenliği artırır.
Compose, konteynerleri manuel olarak oluşturup birbirine bağlamaktan daha hızlıdır. Ayrıca compose, tüm konteynerler arasında iletişim için varsayılan bir ağ oluşturur. Ek olarak volumeleri yönetir ve bir hizmet değiştirildiğinde veya yeniden başlatıldığında bunların otomatik olarak yeniden bağlanmasını sağlar.
Docker ve Kubernetes ile makine öğrenimi uygulamalarını nasıl konteynerleştireceğinizi Docker Kullanarak Bir Uygulama Nasıl Konteynerleştirilir öğreticimizde öğrenebilirsiniz.
Docker ile Docker Compose Arasındaki Fark Nedir?
Docker, konteynerleri oluşturma, çalıştırma ve yönetme platformuyken; Docker Compose, çoğunlukla
docker-compose.ymlolmak üzere bir YAML dosyası kullanarak birden çok konteyneri tanımlamayı ve yönetmeyi kolaylaştıran araçtır.Docker tekil konteynerleri ele alır; Docker Compose ise bunları tek bir hizmet halinde istifleyebilmenizi sağlar. Örneğin; bir uygulamanın backend, frontend, veritabanı, önbellekleme vb. bileşenleri gibi.
Konteynerlerinizi Docker Compose olmadan da oluşturup çalıştırabilirsiniz. Ancak her şeyi tek bir
docker-compose.ymldosyasında kapsüllemek, birden çok konteyneri yönetmeyi kolaylaştırır. Ayrıca uygulamanızı tek bir komutla herhangi bir ortamda ayağa kaldırmanızı mümkün kılar.Docker ve Docker Compose'u anlamak yaklaşan mülakatlarınızda başarı için kritik önem taşır. Hazır olduğunuzdan emin olmak için 2025 için En İyi 26 Docker Mülakat Sorusu ve Cevabına göz atın.
Docker Compose’un Temelleri
Uygulamalı ayrıntılara dalmadan önce, Docker Compose'un temel ilkelerini ve sözdizimini anlamak önemlidir. Compose kullanmadan önce, Ubuntu’da Docker Kurulumu: Kurulumdan İlk Konteynere rehberimizdeki adımları izleyerek Docker’ı kurduğunuzdan emin olun.
Kavramsal çerçeve
Docker Compose, yerel geliştirme ve daha basit dağıtımlar için konteyner orkestrasyonunun karmaşıklığını soyutlar. YAML formatlı bir compose dosyasıyla, ihtiyaç duyulan hizmetleri beyan eder, bağımlılıklarını tanımlar, ağları, volumeleri, ortam değişkenlerini ve daha fazlasını belirtirsiniz. Compose bu hizmetlerin başlatılmasını, durdurulmasını, ölçeklenmesini ve birbirine bağlanmasını verimli biçimde yönetir.
Temel Compose sözdizimi
Docker Compose, yalın bir YAML sözdizimi etrafında döner. Temel bileşenler şunlardır:
services: konteynerleştirilmiş uygulamaları tanımlamak içinimagesveyabuildbağlamları: konteynerleri belirtmek içinports: hizmetleri dışa açmak içinvolumes: kalıcı veri depolama içinnetworks: hizmetler arası iletişim içinHizmet Tanımı ve Uygulama Mimarisi
Compose dosyaları, uygulamanın hizmetlerini ve bağlantılarını temsil eder.
Hizmetleri tanımlama
Hizmetler bir Compose dosyasının özüdür. Birden çok hizmeti (örneğin web arayüzleri, veritabanları ve önbellekleme hizmetleri) net biçimde tanımlayıp adlandırabilir, konteyner başlatma sırasını kontrol etmek için
depends_ongibi basit anahtar sözcüklerle bağımlılıkları belirtebilirsiniz.Ağ temelleri
Docker Compose, tanımlanan hizmetler arasında iletişimi kolaylaştırmak için otomatik olarak varsayılan ağlar oluşturur. Geliştiriciler, gerekirse gelişmiş izolasyon veya ayrıntılı ağ gereksinimleri için özel ağlar da belirleyebilir.
Volume yönetimi
Volumeler, veri kalıcılığını konteyner yaşam döngülerinin ötesine taşır. Adlandırılmış volumeler belirtebilir veya ana makine dizinlerini konteynerlere bağlayabilirsiniz; böylece veritabanları, günlükler veya diğer durum bilgisi içeren veriler tutarlı biçimde kalıcı olur.
Ortam değişkenleri
Compose, ortam değişkenleri ve sırları konteynerlere güvenli şekilde iletmeyi basitleştirir. Hizmetler altında doğrudan bildirimleri ve hassas değerleri Docker tanımlarından ayrı ve güvenli tutmak için compose dosyalarının yanında saklanan
envdosyalarına referans vermeyi destekler.Docker Compose ile Ölçekleme ve Orkestrasyon
Docker Compose, özellikle hızlı yük testi senaryolarında veya paralel hizmetleri değerlendirirken yararlı olan temel ölçekleme ve orkestrasyonu da sadeleştirir.
Hizmetleri ölçekleme
Compose'daki "--scale" bayrağı, hizmetlerin birden fazla kopyasını hızla ayağa kaldırmanıza olanak tanır. Bu, yük dengeleme değerlendirmesi veya eşzamanlı isteklerin ele alınması gibi test senaryolarını basit hale getirir.
Örneğin, bir Flask uygulaması konteynerini ölçeklemek tek bir komutla yapılabilir:
Docker Compose vs Docker Swarm ve Kubernetes
Docker Compose yerel geliştirme ve daha küçük ölçekli kurulumlarda mükemmel olsa da, çoklu ana bilgisayar ve üretim ölçekli orkestrasyonda sınırlıdır. Çok sayıdaki ana bilgisayar üzerinde karmaşık, üretim düzeyinde senaryolar için Docker Swarm veya Kubernetes gibi daha güçlü orkestratörler uygundur; çünkü Compose’da bulunmayan güçlü yük dengeleme, kendi kendini iyileştirme, gelişmiş ağ oluşturma ve büyük ölçekli ölçeklenebilirlik sunarlar.
Docker Compose vs. Kubernetes blog yazımız, Docker Compose ve Kubernetes arasındaki temel farklar hakkında daha fazla ayrıntıya girer.
Özellik
Docker Compose
Docker Swarm
Kubernetes
Birincil Kullanım Alanı
Yerel geliştirme, basit çoklu konteyner uygulamalar
Küçük ve orta ölçekli üretim kümeleri
Büyük ölçekli, üretim düzeyi orkestrasyon
Çoklu Ana Bilgisayar Desteği
Desteklenmez
Yerleşik
Doğal destek
Ölçeklenebilirlik
Yalnızca manuel ölçekleme
Entegre kümeleme ile orta düzey
Yüksek, devasa iş yükleri için tasarlanmış
Yük Dengeleme
Yerleşik yük dengeleyici yok
Yük dengeleme ile dahili yönlendirme
Gelişmiş servis keşfi ve yük dengeleme
Kendi Kendini İyileştirme
Kendi kendini iyileştirme yok
Temel hata durumunda yeniden başlatma
Gelişmiş otomatik kurtarma ve aşamalı güncellemeler
Ağ Oluşturma
Temel köprü (bridge) ağları
Düğümler arasında örtülü (overlay) ağlar
Zengin ağ modeli (CNI)
Öğrenme Eğrisi
Öğrenmesi kolay
Orta karmaşıklık
Dik, birçok bileşen ve yapılandırma içerir
Ekosistem Entegrasyonu
Sınırlı araç seti
Orta düzey CLI/GUI araçları
Geniş ekosistem (Helm, operatörler vb.)
Kaynak Yükü
Asgari
Hafif
Daha ağır, daha fazla sistem kaynağı gerektirir
Durum Yönetimi
Yerleşik durum farkındalığı yok
Raft ile temel
Deklaratif, tam durum yönetimi
Dağıtım Stili
YAML tabanlı (docker-compose.yml)
YAML + CLI
YAML (Deployment, Service vb.)
En Uygun Olduğu
Geliştirici makineleri, CI hatları, hızlı demolar
Küçük ekipler, üretimde basit servisler
Karmaşık uygulamalar, mikro hizmetler, kurumsal altyapı
Verimli Compose Kullanımı için Optimizasyon Teknikleri
Verimli Docker Compose kullanımı; derlemeleri optimize etmeyi, sağlık kontrolleri eklemeyi ve hizmet kaynaklarını yönetmeyi içerir. Bu bölümde bu optimizasyon teknikleri hakkında daha fazlasını öğreneceksiniz.
Verimli derleme stratejileri
Dockerfile’lardaki çok aşamalı (multi-stage) derlemeleri kullanmak, Docker imaj boyutlarını azaltmaya yardımcı olur; derleme önbelleğini açıkça kullanmak ise geliştirme ve CI süreçlerini önemli ölçüde hızlandırır.
Sağlık kontrolleri ve yeniden başlatma ilkeleri
Compose, uygulama güvenilirliğini korumak için açık konteyner sağlık kontrolleri tanımlamanıza izin verir. Yeniden başlatma ilkeleri, başarısız konteynerlerin otomatik olarak yeniden başlatılmasını sağlayarak dayanıklılığı artırır.
Kaynak sınırlarını yönetme
CPU ve bellek sınırlarını doğrudan Compose YAML tanımlarında ayarlamak, kaynak tahsisini kontrol etmenize yardımcı olur; öngörülebilirliği ve kaynak verimliliğini artırır.
Kaynak sınırları için örnek bir parça:
Uygulamalı Örnek: Çoklu Konteyner Uygulama
İşte Redis ile eşleştirilmiş bir Python Flask uygulamasını içeren basitleştirilmiş bir gerçek dünya örneği:
Docker Compose dosyası üç hizmetten oluşan çoklu konteyner bir uygulama tanımlar:
redishizmeti için:redisolarak ayarlar.redis-cliping çalıştıran, 5 saniyede zaman aşımına uğrayan ve 3 kez yeniden deneyen birhealthchecktanımlar.Web hizmeti için:
build: .).flask_appolarak adlandırır.app:app,geventişçi sınıfını kullanır, 0.0.0.0:5000’e bağlanır ve 3000 saniyelik uzun bir zaman aşımıyla çalışırredishizmetine bağımlılık bildirir, böylece Redis önce başlar.REDIS_URLadlı bir ortam değişkenini dahili Redis konteynerini işaret edecek şekilde ayarlar..envdosyasından ek ortam değişkenleri yükler../shorts→/app/shorts,./temp_uploads→/app/temp_uploads./uploads→/app/uploadsworker hizmeti için:
celery_worker.celery -A celery_worker.celery worker --loglevel=infokomutunu çalıştırır; bu, arka plan işlerlerini işlemek için bir Celery worker başlatır.redishizmetine bağımlılık bildirir, böylece Redis önce başlar.REDIS_URLortam değişkenini ayarlar..envdosyasından diğer ortam değişkenlerini yükler.Daha fazla Docker proje fikri için 10 Docker Proje Fikri öğreticimize göz atın.
Çoklu Konteyner Uygulamaları Oluşturma ve Çalıştırma
Docker Compose, rutin konteyner görevleri için sade bir araç seti sunar:
İmaj oluşturma
Tanımlı Dockerfile’larınıza göre konteyner imajları üretmek için
docker compose buildkullanın. Docker imajları oluşturma hakkında daha fazla bilgiyi Sıfırdan Docker Öğrenme: Veri Profesyonelleri için Rehber öğreticimizde ele alıyoruz.Hizmetleri çalıştırma
docker compose upkullanmak, compose dosyasında tanımlanan tüm hizmetleri başlatır. Ayrık mod içindocker compose up -dkullanın. Docker’a Giriş kursumuz, bir konteyneri arka planda çalıştırma hakkında daha fazla ayrıntıya iner.Çalışan konteynerleri görüntüleme
Aktif konteynerleri ve durumlarını görmek için
docker compose pskullanarak tüm çalışan hizmetleri listeleyin.Hizmetleri durdurma
Çalışan hizmetleri durdurmak için
docker compose downkullanın.Günlükleri görüntüleme
Günlükleri kontrol etmek için
docker compose logskullanın. Belirli bir konteynerin günlüklerini kontrol etmek içindocker logs container_namekullanabilirsiniz. Günlükleri akış olarak izlemek içindocker compose -f container_namekullanın.Konteynerleri Oluşturmak, Çalıştırmak ve Yönetmek için En İyi 18 Docker Komutu rehberimiz, farklı ortamlarda uygulamaları güvenle yönetebilmeniz için daha fazla Docker komutunu açıklar.
Docker Compose İleri Düzey Kullanım Durumları
Compose iş akışları, daha karmaşık geliştirme kurulumlarına veya farklı ortam yapılandırmalarına uyum sağlar.
Çoklu ortam yapılandırması
Birden fazla Compose dosyası veya geçersiz kılma (override) dosyaları, farklı ortam kurulumlarını (geliştirme, test, üretim) kolaylaştırır. Bu, tanımları bakımı kolay ve okunur tutarak, karmaşık yapılandırmalar oluşturmadan hızlı değişiklikleri mümkün kılar.
Bağımlılık yönetimi
depends_ontemel başlatma sıralamasını ele alırken, karmaşık senaryolarda başlatma betikleri (ör. "wait-for-it") kullanılabilir; böylece, veritabanının hazır olması gibi belirli koşullar sağlandıktan sonra konteynerlerin başlaması güvence altına alınır.CI/CD ile entegrasyon
Compose, sürekli entegrasyon iş akışlarına zahmetsizce entegre olur ve test için eksiksiz ortam kurulumlarını otomatikleştirir. GitLab CI ve GitHub Actions gibi platformlar, Compose entegrasyonu için yerel veya kolay yaklaşımlar sunarak otomatik testleri sadeleştirir.
En İyi Uygulamalar ve Yaygın Zorluklar
Compose tanımlarını düşünceli biçimde düzenleyip yapılandırarak yaygın tuzaklardan kaçınabilir ve sürdürülebilir yapılandırmalar oluşturabilirsiniz.
Compose Dosyası Organizasyonu
Compose dosyalarınızı net ve modüler tutun. Daha basit projeler için tek bir dosya yeterli olabilir; ancak daha büyük uygulamalarda override özelliğini kullanarak yapılandırmayı birden fazla Compose dosyasına bölmeyi düşünün. Bu şunları sağlar:
docker-compose.backend.yml,docker-compose.frontend.yml)Dosyaların okunmasını ve gezinmesini kolaylaştırmak için anlamlı hizmet adları ve tutarlı girinti kullanın.
Olası Tuzaklar
Şu yaygın hatalara dikkat edin:
latestetiketlerini kullanmak: Bu, gerçek imaj sürümü zamanla değişebileceğinden öngörülemezlik getirir. Tutarlılık sağlamak için her zaman imaj sürümlerini sabitleyin (örn.postgres:15.1)..envdosyalarını veya Docker Secrets gibi gizli yönetimi araçlarını kullanın.Bu uygulamaları benimseyerek, Compose tabanlı iş akışlarınız iş birliğine açık veya evrilen ortamlarda daha sağlam, güvenli ve bakımı kolay olacaktır.
Sonuç
Docker Compose, geliştiriciler için çoklu konteyner uygulamaları oluşturmayı, yönetmeyi ve çalıştırmayı önemli ölçüde basitleştirir. Açık YAML tabanlı tanımları, orkestrasyon kolaylığı ve doğrudan ölçekleme özellikleri, onu yerel geliştirme senaryoları ve daha basit dağıtım mimarileri için çok değerli kılar. Docker Swarm ve Kubernetes gibi gelişmiş orkestratörler büyük ölçekli üretim iş yükleri için daha uygun olsa da, Compose konteyner orkestrasyonu temellerini anlamak ve geliştirici iş akışlarını iyileştirmek için vazgeçilmez bir başlangıç noktası olmaya devam eder.
Docker kurslarımıza göz atın ve şunları öğrenin: