İletişim

Docker Compose Nedir?

Kısa tanım

Docker Compose, birden fazla container'dan oluşan bir uygulamayı tek bir YAML dosyasında tanımlayıp tek komutla başlatmayı, durdurmayı ve yönetmeyi sağlayan Docker aracıdır. Dosyada web uygulaması, veritabanı ve arka plan işçisi gibi servisler; bunların imajları, ortam değişkenleri, ağları ve kalıcı veri alanları (volume) birlikte tarif edilir. Özellikle geliştirme ortamlarında ve tek sunuculu kurulumlarda yaygındır.

Diğer adları: compose.yaml, docker-compose.yml, Compose dosyası, Compose v2

Tek bir compose.yaml dosyasında tanımlanan web, veritabanı ve önbellek container'larının tek komutla birlikte başlatıldığını gösteren diyagram

Tek container yetmediğinde

Docker tek bir uygulamayı container olarak paketler. Gerçek bir web uygulaması ise nadiren tek parçadır: uygulama sunucusu, bir veritabanı, belki bir önbellek ve e-posta gönderen bir arka plan işçisi. Bunları ayrı ayrı docker run komutlarıyla, doğru ağ ve parametrelerle başlatmak hem hataya açıktır hem de ekip içinde paylaşılamaz. Compose bu kurulumu bir dosyaya yazar; dosya depoda durduğu için herkes aynı ortamı aynı komutla ayağa kaldırır.

Küçük bir compose.yaml örneği

services:
  web:
    build: .
    ports:
      - "3000:3000"
    env_file: .env
    depends_on:
      db:
        condition: service_healthy

  worker:
    build: .
    command: node worker.js
    env_file: .env
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:17
    env_file: .env.db
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 5s
      retries: 5

volumes:
  db-data:

Dosyada üç servis var. web ve worker aynı Dockerfile'dan derlenir ama farklı komutlarla çalışır. db resmi PostgreSQL imajını kullanır; verisi db-data adlı volume'da tutulduğu için container silinse de kaybolmaz. healthcheck ve condition: service_healthy birlikte, uygulamanın veritabanı bağlantı kabul etmeye hazır olmadan başlamasını önler. Parolalar dosyaya yazılmaz, depoya eklenmeyen .env dosyalarından okunur.

Servisler birbirini adıyla bulur

Compose her proje için ayrı bir ağ oluşturur ve servis adlarını bu ağda birer alan adı gibi çözer. Bu yüzden uygulamanın bağlantı adresi localhost değil, servis adıdır: postgres://app:...@db:5432/app. Yeni başlayanların en sık takıldığı nokta budur; container içindeki localhost, o container'ın kendisini gösterir.

Dışarıya yalnızca ports ile açılan servisler erişilebilir. Örnekte veritabanının portu ana makineye açılmamıştır; ona sadece aynı ağdaki servisler ulaşabilir, ki bu da güvenli bir varsayılandır.

Günlük kullanılan komutlar

  • docker compose up -d — servisleri derleyip arka planda başlatır.
  • docker compose ps ve docker compose logs -f web — durum ve log takibi.
  • docker compose exec db psql -U app — çalışan bir container içinde komut çalıştırır.
  • docker compose down — container'ları ve ağı kaldırır, volume'lara dokunmaz.
  • docker compose down -v — volume'ları da siler; veritabanı verisi gider, dikkatle kullanılmalıdır.

Eski kaynaklarda görülen tireli docker-compose komutu, Python ile yazılmış ilk sürüme (v1) aittir. Güncel Compose, Docker CLI'ın bir alt komutu olarak docker compose biçiminde çalışır. Tercih edilen dosya adı compose.yaml'dır; docker-compose.yml geriye dönük uyumluluk için hâlâ okunur. Dosyanın başındaki version: alanı artık geçersizdir ve kullanıldığında yalnızca uyarı üretir.

Compose'un yetmediği yer

Compose tek bir makinede çalışır. Geliştirme ortamları, CI üzerinde entegrasyon testleri ve küçük bir staging ortamı için çoğu zaman idealdir; trafiği makul düzeyde olan bir uygulamayı tek sunucuda canlıda çalıştırmak için de kullanılır. Ancak birden çok sunucuya yük dağıtmak, çöken bir sunucudaki container'ları başka makinede yeniden başlatmak ya da kesintisiz sürüm geçişi yapmak gibi ihtiyaçlar ortaya çıktığında Kubernetes gibi bir orkestrasyon aracı gündeme gelir.

İlgili terimler

← Sözlüğe dön