Docker Compose ile birden fazla konteyneri tek dosyayla çalıştırma (örnekle)

Linux Sunucu (SSH) 53 görüntülenme Markdown

Docker kurulumunu yaptınız (Docker kurulumu) ve tek bir konteyneri docker run ile çalıştırabiliyorsunuz. Gerçek uygulamalar çoğu zaman birden fazla parça ister: bir uygulama, bir veritabanı, belki bir önbellek. Docker Compose, bu parçaların hepsini tek bir YAML dosyasında tanımlayıp tek komutla başlatmanızı sağlar. Dosya aynı zamanda sunucu kurulumunuzun yazılı belgesi olur.

Örnek dosya

Bir klasör açın (/srv/uygulama) ve içine compose.yaml dosyası oluşturun. Aşağıdaki örnek, bir web uygulaması ve onunla konuşan bir veritabanını tanımlar:

services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: ${DB_PAROLA}
      POSTGRES_DB: uygulama
    volumes:
      - dbveri:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  dbveri:

Parolayı dosyaya yazmayın; aynı klasörde .env dosyası açıp DB_PAROLA=GucluBirParola yazın (dosya izni chmod 600 .env). Compose bu değeri otomatik okur. Kendi uygulamanız için image: satırı yerine build: . ile Dockerfile'dan derletebilirsiniz.

Çalıştırma ve yönetim

docker compose config      # dosyayı doğrula ve birleşik halini göster
docker compose up -d       # arka planda başlat (gerekli imajları indirir)
docker compose ps          # çalışanların durumu
docker compose logs -f web # bir servisin günlüğü (Ctrl+C ile çık)
docker compose restart web # yeniden başlat
docker compose down        # durdur ve konteynerleri kaldır (veriler kalır)

docker compose config YAML hatalarını başlatmadan bildirir. Eski sürümlerde komut tire ile docker-compose olarak yazılırdı; güncel Docker'da docker compose (boşluklu) kullanılır.

Verilerin kaybolmaması: volume

Konteyner silindiğinde içindeki dosyalar da silinir. Kalıcı olması gereken her şeyi (veritabanı dosyaları, yüklenen dosyalar) volume olarak tanımlayın. Örnekteki dbveri volume'u veritabanı konteyneri yeniden oluşturulsa bile verileri saklar. docker compose down volume'ları silmez; ama docker compose down -v siler, kullanırken dikkat edin. Yedeği veritabanı dökümüyle alın: docker compose exec db pg_dump -U postgres uygulama > yedek.sql.

Güncelleme

docker compose pull
docker compose up -d

İmajlar güncellenir, değişen konteynerler yeniden oluşturulur, volume'daki veri korunur. Büyük sürüm atlayışlarında (örneğin PostgreSQL 15'ten 16'ya) veri biçimi değişebilir; üretimde önce yedek alın. Eski imajlar disk doldurur: docker image prune -a ile kullanılmayanları silebilirsiniz.

Güvenlik duvarı tuzağı

Docker, yayınlanan portlar için kendi güvenlik duvarı kurallarını ekler ve UFW'yi atlar. ports: "8080:80" yazarsanız port, UFW'de kapalı olsa bile internete açılır. Örnekteki gibi 127.0.0.1:8080:80 yazarak yalnızca yerel adrese bağlayın ve dışarıya Nginx ile açın: Nginx ters proxy. Veritabanı portunu (5432, 3306) hiçbir zaman internete yayınlamayın. UFW ayrıntısı: UFW rehberi.

Sık sorunlar

  • "port is already allocated": O port başka bir konteyner ya da programda kullanılıyor: sudo ss -tlnp | grep 8080.
  • Konteyner sürekli yeniden başlıyor: docker compose logs servis hatayı gösterir (eksik ortam değişkeni, yanlış parola).
  • Disk doldu: docker system df neyin yer kapladığını gösterir: disk doldu.

Sık sorulanlar

Compose dosyasının adı ne olmalı?

Güncel adı compose.yaml'dir; docker-compose.yml adı da çalışmaya devam eder.

Konteynerler birbirini nasıl bulur?

Aynı Compose projesindeki servisler servis adıyla birbirine erişir. Örneğin uygulama veritabanına db:5432 adresiyle bağlanır; IP adresi yazmanız gerekmez.

Docker kapsayıcılarını sunucu yeniden başlayınca başlatır mı?

restart: unless-stopped satırı varsa evet; Docker servisi açılışta başladığı için konteynerler de gelir.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.