Docker Compose¶
Docker Compose, çoklu container ortamlarını yönetir; yanlış yapılandırma servis bağımlılık sorunlarına ve veri kaybına yol açar.
1. Servis Bağımlılıklarını Yönetmemek¶
❌ Yanlış Kullanım: depends_on kullanmadan servis başlatmak.
services:
api:
build: .
ports:
- "5000:8080"
db:
image: postgres:16
redis:
image: redis:7
# API, veritabanı hazır olmadan başlar ve crash olur
✅ İdeal Kullanım: depends_on ile health check bazlı bağımlılık tanımlayın.
services:
api:
build: .
ports:
- "5000:8080"
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
environment:
- ConnectionStrings__Default=Host=db;Database=myapp;Username=postgres;Password=secret
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
redis:
image: redis:7
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
2. Volume Olmadan Veritabanı Çalıştırmak¶
❌ Yanlış Kullanım: Veritabanı verisini container içinde tutmak.
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
# Container silindiğinde tüm veri kaybolur
✅ İdeal Kullanım: Named volume ile veriyi persist edin.
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
volumes:
postgres-data:
3. Hardcoded Değerler Kullanmak¶
❌ Yanlış Kullanım: Şifreleri ve konfigürasyonu doğrudan yaml’a yazmak.
services:
api:
environment:
- DB_PASSWORD=SuperSecret123!
- JWT_SECRET=MyJwtSecretKey2024
- SMTP_PASSWORD=email_password
✅ İdeal Kullanım: .env dosyası ve secrets ile yönetin.
services:
api:
env_file:
- .env
environment:
- ConnectionStrings__Default=Host=db;Database=${DB_NAME};Username=${DB_USER};Password=${DB_PASSWORD}
secrets:
- jwt_secret
secrets:
jwt_secret:
file: ./secrets/jwt_secret.txt
# .env
DB_NAME=myapp
DB_USER=postgres
DB_PASSWORD=SuperSecret123!
4. Network İzolasyonu Yapmamak¶
❌ Yanlış Kullanım: Tüm servislerin aynı default network’te olması.
services:
api:
ports:
- "5000:8080"
admin-api:
ports:
- "5001:8080"
db:
ports:
- "5432:5432"
redis:
ports:
- "6379:6379"
# Tüm servisler birbirine erişebilir, DB dışarıya açık
✅ İdeal Kullanım: Ağ izolasyonu ile servisleri segmente edin.
services:
api:
networks:
- frontend
- backend
ports:
- "5000:8080"
admin-api:
networks:
- admin
- backend
db:
networks:
- backend
# Port dışarıya açılmaz, sadece backend network'ü erişir
redis:
networks:
- backend
networks:
frontend:
backend:
admin:
5. Resource Limitleri Belirlememek¶
❌ Yanlış Kullanım: Container’lara sınırsız kaynak vermek.
services:
api:
build: .
worker:
build: ./worker
# Bir container tüm host kaynaklarını tüketebilir
✅ İdeal Kullanım: CPU ve memory limitleri tanımlayın.
services:
api:
build: .
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
cpus: "0.25"
memory: 128M
worker:
build: ./worker
deploy:
resources:
limits:
cpus: "0.5"
memory: 256M
reservations:
cpus: "0.1"
memory: 64M