format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Compose ile Gelişmiş Uygulama ve Veritabanı Stack: Kapsamlı Rehber
- arrow_rightDocker Compose Nedir ve Neden Kullanılmalıdır?
- arrow_rightGelişmiş docker-compose.yml Yapılandırması
- arrow_rightTemel Yapı ve Servis Tanımlama
- arrow_rightEnvironment Variables ve Güvenlik
- arrow_rightVeritabanı Konfigürasyonu ve Optimizasyonu
- arrow_rightPostgreSQL Gelişmiş Yapılandırması
- arrow_rightVeritabanı Yedekleme Stratejisi
- arrow_rightHealth Checks ve İzleme
- arrow_rightComprehensive Health Check Örneği
- arrow_rightAğ Yapılandırması ve İzolasyon
- arrow_rightİleri Düzey Ağ Konfigürasyonu
- arrow_rightVolume Yönetimi ve Veri Kalıcılığı
- arrow_rightNamed Volumes ve Bind Mounts
- arrow_rightVolume Backup Stratejisi
- arrow_rightYük Dengeleme ve Ölçeklendirme
- arrow_rightNginx ile Yük Dengeleme
- arrow_rightLog Yönetimi ve Merkezi logging
- arrow_rightJSON Log Çıktısı ve Fluentd Entegrasyonu
- arrow_rightProduction Ortamına Geçiş
- arrow_rightResource Limits Örneği
- arrow_rightDocker Compose Alternatifleri ile Karşılaştırma
Docker Compose ile Gelişmiş Uygulama ve Veritabanı Stack: Kapsamlı Rehber
Modern yazılım geliştirme süreçlerinde konteyner teknolojileri, uygulama dağıtımının temel yapı taşı haline gelmiştir. Docker Compose, çoklu konteyner uygulamalarını tanımlamak ve çalıştırmak için kullanılan güçlü bir araçtır. Bu rehberde, Docker Compose ile gelişmiş uygulama ve veritabanı stack'lerinin nasıl oluşturulacağını detaylı olarak inceleyeceğiz.
Docker'ın 2024 verilerine göre, kurumsal ortamlarda konteyner kullanımı %40 oranında artmış durumda ve Docker Compose en yaygın kullanılan orkestrasyon aracı olarak öne çıkmaktadır.
Docker Compose Nedir ve Neden Kullanılmalıdır?
Docker Compose, birden fazla konteyneri tek bir yapılandırma dosyası ile tanımlamanıza ve yönetmenize olanak tanıyan bir araçtır. Docker Swarm ile karşılaştırıldığında, Compose daha küçük ölçekli projeler için idealdir ve geliştirme ortamlarında hızlı kurulum sağlar.
Gelişmiş docker-compose.yml Yapılandırması
Gelişmiş bir Docker Compose yapılandırması, sadece temel servis tanımlamalarının ötesine geçer. Aşağıda profesyonel bir stack yapılandırması için gerekli bileşenleri inceleyeceğiz.
Temel Yapı ve Servis Tanımlama
version: '3.8'
services:
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: myapp_backend
restart: unless-stopped
environment:
- NODE_ENV=production
- DB_HOST=postgres
- REDIS_HOST=redis
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
networks:
- app-network
volumes:
- app-data:/app/data
postgres:
image: postgres:15-alpine
container_name: myapp_postgres
restart: unless-stopped
environment:
POSTGRES_DB: myapp
POSTGRES_USER: admin
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
- ./init-scripts:/docker-entrypoint-initdb.d
networks:
- app-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U admin -d myapp"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: myapp_redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- app-network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
networks:
app-network:
driver: bridge
volumes:
app-data:
postgres-data:
redis-data:
Environment Variables ve Güvenlik
Hassas bilgileri doğrudan compose dosyasında saklamak yerine .env dosyaları kullanılmalıdır. Docker Compose, otomatik olarak proje dizinindeki .env dosyasını okur.
Üretim ortamlarında, bu değişkenlerin harici bir secret yönetim sisteminden çekilmesi önerilir. Sunucu güvenliği açısından AES-256 şifreleme kullanılarak secret'ların yönetilmesi kritik öneme sahiptir.
Veritabanı Konfigürasyonu ve Optimizasyonu
Gelişmiş veritabanı stack'leri, yalnızca veritabanı sunucusunu değil, yedekleme, izleme ve yüksek kullanılabilirlik bileşenlerini de içerir.
PostgreSQL Gelişmiş Yapılandırması
PostgreSQL konteynerinde performans optimizasyonu için aşağıdaki parametreler ayarlanmalıdır:
- shared_buffers: RAM'in %25'i kadar ayarlanmalı
- work_mem: Her bir sorgu için 64-256MB arası
- maintenance_work_mem: Bakım işlemleri için 256MB+
- max_connections: Uygulama ihtiyaçlarına göre 100-500 arası
postgres:
image: postgres:15-alpine
command: >
postgres
-c shared_buffers=256MB
-c work_mem=16MB
-c maintenance_work_mem=512MB
-c max_connections=200
-c effective_cache_size=1GB
# Diğer konfigürasyonlar...
Veritabanı Yedekleme Stratejisi
Düzenli yedekleme, veri güvenliğinin temel taşlarından biridir. Aşağıdaki yapılandırma ile otomatik yedekleme sistemi kurulabilir:
backup:
image: postgres:15-alpine
container_name: myapp_backup
volumes:
- ./backups:/backups
- postgres-data:/var/lib/postgresql/data
environment:
- POSTGRES_HOST=postgres
- POSTGRES_DB=myapp
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=${DB_PASSWORD}
command: >
/bin/sh -c "
while true; do
pg_dump -h postgres -U admin myapp > /backups/backup_$$(date +%Y%m%d_%H%M%S).sql
find /backups -name '*.sql' -mtime +7 -delete
sleep 86400
done"
depends_on:
- postgres
Health Checks ve İzleme
Production ortamlarında health check'ler, servislerin sağlığını izlemek ve otomatik yeniden başlatma mekanizmalarını tetiklemek için kritik öneme sahiptir. System load değerlerini izlemek için kullanılan araçlar ile entegre edilebilir.
Comprehensive Health Check Örneği
services:
app:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5s
postgres:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U admin -d myapp && pg_health_check"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
redis:
healthcheck:
test: ["CMD", "redis-cli", "--no-auth-warning", "-a", "${REDIS_PASSWORD}", "ping"]
interval: 15s
timeout: 5s
retries: 3
Ağ Yapılandırması ve İzolasyon
Docker Compose'da ağ izolasyonu, güvenlik açısından büyük önem taşır. Her stack için ayrı ağlar oluşturulması, servisler arası iletişimin kontrol altında tutulmasını sağlar.
İleri Düzey Ağ Konfigürasyonu
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
backend:
driver: bridge
ipam:
config:
- subnet: 172.29.0.0/16
database:
driver: bridge
internal: true
ipam:
config:
- subnet: 172.30.0.0/16
services:
nginx:
networks:
- frontend
- backend
app:
networks:
- backend
- database
postgres:
networks:
- database
Bu yapılandırma ile veritabanı ağı tamamen izole edilir ve sadece uygulama sunucusu bu ağa erişim sağlar.
Volume Yönetimi ve Veri Kalıcılığı
Veri kalıcılığı, özellikle veritabanı ve dosya sistemi gerektiren uygulamalarda kritik öneme sahiptir. Hosting çözümlerinde volume yönetimi doğru yapılandırılmalıdır.
Named Volumes ve Bind Mounts
| Volume Tipi | Kullanım Amacı | Örnek |
|---|---|---|
| Named Volumes | Veritabanı verileri, kalıcı uygulama verileri | postgres-data:/var/lib/postgresql/data |
| Bind Mounts | Konfigürasyon dosyaları, geliştirme kodları | ./config:/app/config:ro |
| tmpfs | Geçici, hassas veriler | tmpfs:/run/secrets |
Volume Backup Stratejisi
backup-tool:
image: alpine:latest
container_name: volume_backup
volumes:
- postgres-data:/source:ro
- ./backups:/destination
command: >
/bin/sh -c "
tar czf /destination/postgres_backup_$$(date +%Y%m%d).tar.gz -C /source ."
Yük Dengeleme ve Ölçeklendirme
Docker Compose, tek başına yük dengeleme sağlamaz; ancak Nginx gibi bir reverse proxy ile entegre edilerek yük dengeleme yapılabilir. Nginx vs Caddy karşılaştırması bu noktada önemli bir referans kaynağıdır.
Nginx ile Yük Dengeleme
nginx:
image: nginx:alpine
container_name: myapp_nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- app
networks:
- frontend
healthcheck:
test: ["CMD", "nginx", "-t"]
interval: 30s
timeout: 10s
retries: 3
upstream app_backend {
least_conn;
server app:3000 weight=3;
server app2:3000 weight=2;
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Log Yönetimi ve Merkezi logging
Production ortamlarında log yönetimi, hata ayıklama ve sistem izleme için vazgeçilmezdir. Docker Compose, çeşitli log sürücülerini destekler.
JSON Log Çıktısı ve Fluentd Entegrasyonu
services:
app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
postgres:
logging:
driver: "fluentd"
options:
fluentd-address: localhost:24224
tag: postgres.{{.Name}}
Production Ortamına Geçiş
Geliştirme ortamından production ortamına geçiş, dikkatli bir planlama gerektirir. Aşağıdaki kontrol listesi bu geçiş için rehber niteliğindedir:
- Environment Değişkenleri: Tüm hassas bilgiler .env dosyasından çekilmeli
- Health Checks: Tüm servislerde health check tanımlanmalı
- Restart Policies: unless-stopped veya always kullanılmalı
- Resource Limits: CPU ve bellek sınırları belirlenmeli
- Log Rotation: Log dosyaları için boyut sınırları ayarlanmalı
- SSL/TLS: Güvenli bağlantılar için sertifikalar yapılandırılmalı
Resource Limits Örneği
services:
app:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
postgres:
deploy:
resources:
limits:
cpus: '1'
memory: 4G
reservations:
cpus: '0.25'
memory: 1G
Docker Compose Alternatifleri ile Karşılaştırma
| Özellik | Docker Compose | Docker Swarm | Kubernetes |
|---|---|---|---|
| Kurulum Kolaylığı | Çok Kolay | Orta | Zor |
| Ölçeklenebilirlik | Limited | Orta | Yüksek |
| Otomatik Yük Dengeleme | Yok | Var | Var |
| Self-Healing | Kısmi | Var | Var |
| Learning Curve | Düşük | Orta | Yüksek |