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

https://kervanhosting.com/bilgi-bankasi/makale/docker-compose-ile-birden-fazla-konteyner-calistirma-ornek

Docker kurulumunu yaptınız ([Docker kurulumu](https://kervanhosting.com/bilgi-bankasi/makale/docker-nasil-kurulur)) 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](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama). Veritabanı portunu (5432, 3306) hiçbir zaman internete yayınlamayın. UFW ayrıntısı: [UFW rehberi](https://kervanhosting.com/bilgi-bankasi/makale/ufw-ile-port-acma-ve-kapatma-ubuntu-guvenlik-duvari).

## 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](https://kervanhosting.com/bilgi-bankasi/makale/disk-doldu-sunucumda-nasil-yer-acarim).

## 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**

- [Docker nasıl kurulur?](https://kervanhosting.com/bilgi-bankasi/makale/docker-nasil-kurulur)
- [Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama](https://kervanhosting.com/bilgi-bankasi/makale/nginx-reverse-proxy-node-js-uygulamasini-nginx-arkasinda-yayinlama)
- [UFW ile port açma ve kapatma (Ubuntu güvenlik duvarı)](https://kervanhosting.com/bilgi-bankasi/makale/ufw-ile-port-acma-ve-kapatma-ubuntu-guvenlik-duvari)

*Sorununuz çözülmediyse [destek talebi açın](https://kervanhosting.com/destek-taleplerim). Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.*
