Docker Compose, birden fazla container''ı tek komutla çalıştırmanın ve aralarındaki ağ, volume, depend-on ilişkilerini tek dosyada tanımlamanın standart yoludur. Development''tan production''a kadar her aşamada vazgeçilmezdir. Bu rehber tipik bir web uygulaması kümesinin kuruluşunu anlatır.
Temel compose.yml
İlgili rehberler: DNS nedir, ayarları değiştirme · Domain adı ve WHOIS sorgulama · Hosting türleri rehberi · Nginx yapılandırma · Plesk panel yönetimi
# compose.yml (docker-compose.yml de çalışır)
services:
app:
build: .
ports: ['3000:3000']
environment:
NODE_ENV: production
DATABASE_URL: postgres://app:secret@db:5432/appdb
REDIS_URL: redis://cache:6379
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: appdb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'app']
interval: 5s
retries: 10
restart: unless-stopped
cache:
image: redis:7-alpine
volumes:
- redisdata:/data
restart: unless-stopped
nginx:
image: nginx:alpine
ports: ['80:80', '443:443']
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/letsencrypt:ro
depends_on: [app]
restart: unless-stopped
volumes:
pgdata:
redisdata:
Temel Komutlar
# Build + başlat (detached)
docker compose up -d --build
# Log'ları izle
docker compose logs -f app
docker compose logs --since 10m
# Tek servisi yeniden başlat
docker compose restart app
# Servisi rebuild et ve başlat
docker compose up -d --build app
# Durum
docker compose ps
# Tüm servisleri kapat
docker compose down
# Volume'leri de sil (veri gider!)
docker compose down -v
Environment Dosyaları
Hassas veriyi compose.yml''de bırakmayın. .env dosyası kullanın — Compose otomatik okur.
# compose.yml
services:
app:
environment:
DATABASE_URL: ${DATABASE_URL}
JWT_SECRET: ${JWT_SECRET}
# .env (git-ignore!)
DATABASE_URL=postgres://...
JWT_SECRET=supersecret
# Farklı env dosyası
docker compose --env-file .env.production up -d
Network Yönetimi
Default olarak Compose projeye özel bir bridge network oluşturur; servisler birbirini servis adı ile bulur (postgres://db:5432). Özel network tanımları ile izolasyon sağlayabilirsiniz.
services:
frontend:
networks: [public]
backend:
networks: [public, internal]
db:
networks: [internal] # dış dünyadan izole
networks:
public:
internal:
internal: true # internet erişimi yok
Volume Tipleri
- Named volume:
pgdata:/var/lib/postgresql/data— Docker yönetir, taşınabilir - Bind mount:
./config:/etc/app— host dizini, dev için ideal - tmpfs:
type: tmpfs— sadece RAM, sensitive temp data
services:
app:
volumes:
- ./src:/app/src # bind (hot reload)
- node_modules:/app/node_modules # named
- type: tmpfs
target: /tmp
Production Best Practices
services:
app:
image: ghcr.io/user/app:v1.2.3 # tag'li, :latest değil
restart: unless-stopped
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
memory: 128M
logging:
driver: json-file
options:
max-size: '10m'
max-file: '5'
read_only: true
tmpfs: ['/tmp', '/var/run']
security_opt:
- no-new-privileges:true
cap_drop: [ALL]
:latest tag''i yerine her zaman pinned version (:v1.2.3 veya SHA) kullanın. Aksi halde yeniden başlatma beklenmedik değişiklik getirir.Override Dosyaları (Dev vs Prod)
# compose.yml (baz)
services:
app:
image: myapp:latest
restart: unless-stopped
# compose.override.yml (default yüklenir, dev için)
services:
app:
build: .
volumes: ['./src:/app/src']
command: npm run dev
# compose.prod.yml
services:
app:
image: ghcr.io/user/app:v1.2.3
environment:
NODE_ENV: production
# Kullanım
docker compose up # override'ı otomatik yükler
docker compose -f compose.yml -f compose.prod.yml up -d
Healthcheck ve Depends-on
depends_on sadece başlangıç sırasını garantiler, servis hazır olduğunu değil. Hazır olma için condition: service_healthy ve healthcheck tanımı şart.
services:
app:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U app']
interval: 5s
timeout: 3s
retries: 10
start_period: 10s
Profiles
services:
app: {}
db: {}
monitoring:
image: prom/prometheus
profiles: [monitoring] # default olarak başlamaz
# Kullanım
docker compose up # app, db
docker compose --profile monitoring up # + monitoring
Modern Web Hosting ve Sunucu Altyapısı
Performanslı bir web hosting hizmeti üç temel altyapı kararına dayanır: NVMe SSD diskler (klasik SATA SSD'ye göre 4-6 kat IOPS), LiteSpeed Web Server veya Nginx + LSCache kombinasyonu (Apache'ye göre 9 kat istek kapasitesi) ve CloudLinux + Imunify360 izolasyonu. Hosting sağlayıcısının kontrol paneli (cPanel, Plesk, DirectAdmin), günlük yedek politikası, veri merkezi konumu ve destek ekibi yanıt süresi de büyük fark yaratır. Türkiye lokasyonu yerli ziyaretçilere düşük gecikme verirken; Hetzner Frankfurt veya OVH Roubaix gibi Avrupa lokasyonları global trafik için daha uygundur. Site büyüdükçe paylaşımlı hosting'ten VPS, ardından dedicated server'a geçiş; CPU/RAM/disk kaynaklarının web sitemizin ihtiyaçlarına göre ölçeklenmesini sağlar.
Mevcut uygulamanızı containerize etmek ve Compose ile production deploy için iletişime geçin