Docker Compose ile birden fazla konteyneri tek dosyayla çalıştırma (örnekle)
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 servishatayı gösterir (eksik ortam değişkeni, yanlış parola). - Disk doldu:
docker system dfneyin 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
- Docker nasıl kurulur?
- Nginx ters proxy: Node.js ya da Python uygulamasını Nginx arkasında yayınlama
- UFW ile port açma ve kapatma (Ubuntu güvenlik duvarı)
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.
Geri bildiriminiz için teşekkürler!