Ana içeriğe geç

Docker Compose Rehberi: Çoklu Konteyner Geliştirmeyi Basitleştirin

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.

Yapay Zeka ile Keşfedin

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 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.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. 

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ç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 up --scale flaskapp=4

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:

services:
  flaskapp:
    image: flask
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M

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:

services:
  redis:
    image: redis:7
    container_name: redis
    ports:
      - "6379:6379"
    restart: always
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 30s
      timeout: 5s
      retries: 3
  web:
    build: .
    container_name: flask_app
    command: gunicorn app:app --worker-class gevent --bind 0.0.0.0:5000 --timeout 3000
    ports:
      - "5000:5000"
    depends_on:
      - redis
    environment:
      - REDIS_URL=redis://redis:6379/0
    env_file:
      - .env
    volumes:
      - ./shorts:/app/shorts
      - ./temp_uploads:/app/temp_uploads
      - ./uploads:/app/uploads
    restart: always

  worker:
    build: .
    container_name: celery_worker
    command: celery -A celery_worker.celery worker --loglevel=info
    depends_on:
      - redis
    environment:
      - REDIS_URL=redis://redis:6379/0
    env_file:
      - .env
    volumes:
      - ./shorts:/app/shorts
      - ./temp_uploads:/app/temp_uploads
      - ./uploads:/app/uploads
    restart: always

Docker Compose dosyası üç hizmetten oluşan çoklu konteyner bir uygulama tanımlar:

  1. redis
  2. web (Gunicorn ile Flask uygulaması)
  3. 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.

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 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. 

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_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:

  • Bileşenlerin mantıksal ayrımı (ör. docker-compose.backend.yml, docker-compose.frontend.yml)
  • Daha kolay yerel ve üretim ortam özelleştirmesi
  • 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 kurslarımıza göz atın ve şunları öğrenin:

Docker Compose SSS

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.

Derrick Mwiti

Yazar

Derrick Mwiti

Konular

İlgili