format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Compose ile Gelişmiş Konteyner Orkestrasyonu: Kapsamlı Rehber
- arrow_rightDocker Compose Nedir ve Neden Kullanılır?
- arrow_rightDocker Compose Temel Yapısı ve Kurulum
- arrow_rightGelişmiş Özellikler ve Yapılandırma Seçenekleri
- arrow_right1. Health Check Yapılandırması
- arrow_right2. Resource Limits ve CPU Yönetimi
- arrow_right3. Otomatik Yeniden Başlatma
- arrow_rightAğ Yapılandırması ve İzolasyon
- arrow_rightÇoklu Ortam Yönetimi
- arrow_rightVeri Yönetimi ve Persistent Storage
- arrow_rightCompose ile Ölçeklendirme ve Load Balancing
- arrow_rightBuild ve Build Arg Kullanımı
- arrow_rightLog Yönetimi ve İzleme
- arrow_rightDocker Compose ve Veritabanı Bağlantı Havuzu
- arrow_rightDocker Compose Best Practices
- arrow_rightSecret ve Config Yönetimi
- arrow_rightPerformance Optimizasyonu
- arrow_rightMonitoring ve Alerting
Docker Compose ile Gelişmiş Konteyner Orkestrasyonu: Kapsamlı Rehber
Docker Compose, modern yazılım geliştirme süreçlerinin temel taşlarından biri haline gelmiştir. İstatistiklere göre, container tabanlı uygulama geliştiren ekiplerin %78'i Docker Compose'u aktif olarak kullanmaktadır (Docker Developer Survey 2023). Bu rehberde, Docker Compose ile gelişmiş konteyner orkestrasyonunun tüm yönlerini detaylı olarak inceleyeceğiz.
Docker Compose Nedir ve Neden Kullanılır?
Docker Compose, çoklu konteyner uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir araçtır. Tek bir YAML dosyası ile tüm servisleri, ağları ve volumeleri yapılandırabilirsiniz. Geleneksel manuel konteyner yönetimine kıyasla %60'a varan zaman tasarrufu sağlar.
Docker Compose'un temel avantajları şunlardır:
- Tek Dosya Yönetimi: Tüm konfigürasyonlar tek bir docker-compose.yml dosyasında
- Hızlı Dağıtım: Tek komutla tüm servisleri başlatma
- Ortam Bağımsızlığı: Geliştirme, test ve üretim ortamları arasında kolay geçiş
- Servis Bağımlılıkları: Otomatik servis sıralaması ve başlatma
Docker Compose Temel Yapısı ve Kurulum
Docker Compose'u kullanmaya başlamak için öncelikle sisteminizde Docker'ın kurulu olması gerekir. Ubuntu veya Debian tabanlı sistemlerde kurulum için Docker CI/CD Rehberi'mizi inceleyebilirsiniz.
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
app:
build: .
depends_on:
- db
environment:
- DATABASE_URL=postgres://db:5432/app
networks:
- frontend
- backend
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
networks:
frontend:
backend:
volumes:
db_data:
Gelişmiş Özellikler ve Yapılandırma Seçenekleri
1. Health Check Yapılandırması
Production ortamlarında konteynerlerin sağlık durumunu izlemek kritik önem taşır. Docker Compose,.healthcheck özelliği ile bu işlevi sunar:
services:
api:
image: node:18-alpine
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Bu yapılandırma, konteynerin sağlık durumunu 30 saniye aralıklarla kontrol eder ve 3 başarısız denemeden sonra sağlıksız olarak işaretler.
2. Resource Limits ve CPU Yönetimi
Sunucu kaynaklarını verimli kullanmak için limitler belirlemek önemlidir. Özellikle sanal sunucu kaynak limitleri planlanırken bu ayarlar kritik rol oynar:
services:
database:
image: postgres:15
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '1.0'
memory: 2G
3. Otomatik Yeniden Başlatma
Production ortamlarında konteynerlerin otomatik olarak yeniden başlatılması için restart_policy yapılandırması kullanılır:
services:
webapp:
image: myapp:latest
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
Docker Compose vs Kubernetes: Karşılaştırma
Birçok geliştirici, Docker Compose ile Kubernetes arasında seçim yapmakta zorlanır. Aşağıdaki karşılaştırma tablosu karar vermenize yardımcı olacaktır:
| Özellik | Docker Compose | Kubernetes |
|---|---|---|
| Kurulum Karmaşıklığı | Düşük | Yüksek |
| Ölçeklendirme | Manuel | Otomatik |
| Yük Dengeleme | Temel | Gelişmiş |
| Öğrenme Eğrisi | Düşük | Yüksek |
| Uygun Kullanım | Geliştirme/Test | Production |
| Self-Healing | Sınırlı | Gelişmiş |
Kubernetes'in daha gelişmiş özellikler sunduğu durumlar olsa da, küçük ve orta ölçekli uygulamalar için Docker Compose genellikle yeterlidir ve daha hızlı bir geliştirme deneyimi sağlar.
Ağ Yapılandırması ve İzolasyon
Docker Compose'ta ağ izolasyonu, uygulamaların güvenliğini sağlamak için temel birzelliktir. Özellikle sunucu güvenliği açısından doğru ağ yapılandırması kritik önem taşır.
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
backend:
driver: bridge
internal: true
database_network:
driver: bridge
driver_opts:
com.docker.network.bridge.name: br-db
Bu yapılandırma ile frontend ağı dışarıya açık, backend ağı internal ve database ağı izole edilmiş olur.
Çoklu Ortam Yönetimi
Geliştirme, staging ve production ortamları için farklı yapılandırma dosyaları kullanmak yaygın bir pratiktir:
# docker-compose.yml (base)
services:
app:
image: myapp:${TAG:-latest}
# docker-compose.dev.yml
services:
app:
environment:
- NODE_ENV=development
- DEBUG=true
volumes:
- ./src:/app/src
# docker-compose.prod.yml
services:
app:
environment:
- NODE_ENV=production
deploy:
replicas: 3
restart_policy:
condition: on-failure
Ortam değişkenlerini yönetmek için .env dosyası kullanabilirsiniz:
# .env dosyası
TAG=1.0.0
COMPOSE_PROJECT_NAME=myapp
DATABASE_PASSWORD=secure_password_here
Farklı ortamlarda çalıştırmak için:
# Development ortamı
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
# Production ortamı
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Veri Yönetimi ve Persistent Storage
Konteyner verilerini kalıcı hale getirmek için volume yapılandırması kullanılır. S3 uyumlu depolama çözümleri ile entegre edebilirsiniz:
services:
db:
image: postgres:15
volumes:
- db_data:/var/lib/postgresql/data
- ./backups:/backups
environment:
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
db_data:
driver: local
driver_opts:
type: none
o: bind
device: /mnt/data/postgres
Backup stratejileri için sunucu taşıma ve veri kaybı önleme rehberimize göz atabilirsiniz.
Compose ile Ölçeklendirme ve Load Balancing
Docker Compose'un deploy özelliği ile yatay ölçeklendirme yapabilirsiniz:
services:
api:
image: myapi:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
restart_policy:
condition: on-failure
ports:
- "3000:3000"
networks:
- backend
networks:
backend:
driver: overlay
attachable: true
Önemli: Overlay ağ kullanmak için öncelikle Docker Swarm modunu etkinleştirmeniz gerekir:
docker swarm init docker stack deploy -c docker-compose.yml myappBuild ve Build Arg Kullanımı
Custom image build etmek için build context kullanılır:
services: backend: build: context: ./backend dockerfile: Dockerfile.prod args: - NODE_ENV=production - BUILD_DATE=${BUILD_DATE} environment: - NODE_ENV=production labels: - "app.backend=api" - "version=1.0"Build arg'leri .env dosyasından çekmek için:
# .env BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%MZ")Log Yönetimi ve İzleme
Production ortamlarında log yönetimi kritik öneme sahiptir. Docker Compose ile log yapılandırması:
services: app: image: myapp:latest logging: driver: "json-file" options: max-size: "10m" max-file: "3" labels: - "com.app.name=myapp"Harici log yönetimi için Fluentd veya Elasticsearch entegre edilebilir:
services: app: logging: driver: "fluentd" options: fluentd-address: fluentd:24224 fluentd-async: "true" fluentd-buffer-limit: "8m" fluentd-retry-wait: "1s" fluentd-max-retries: "10"Docker Compose ve Veritabanı Bağlantı Havuzu
Yüksek performanslı uygulamalar için veritabanı bağlantı havuzu configuration'ı önemlidir. Connection pooling konseptini doğru uygulamak, uygulama performansını önemli ölçüde artırır:
services: api: image: myapi:latest environment: - DB_HOST=postgres - DB_POOL_SIZE=20 - DB_MAX_OVERFLOW=10 - DB_TIMEOUT=30 depends_on: postgres: condition: service_healthy postgres: image: postgres:15 healthcheck: test: ["CMD-SHELL", "pg_isready -U appuser"] interval: 10s timeout: 5s retries: 5Docker Compose Best Practices
Production ortamında Docker Compose kullanırken dikkat edilmesi gereken en iyi pratikler:
- Always Specify Tags: Her zaman spesifik image tag'leri kullanın (latest yerine 1.0.0 gibi)
- Use Health Checks: Tüm servisler için health check tanımlayın
- Set Resource Limits: Production için mutlaka kaynak limitleri belirleyin
- Secret Management: Hassas bilgiler için Docker secrets veya harici secret yöneticileri kullanın
- Labels for Orchestration: Servisleri izlemek için anlamlı label'lar ekleyin
- Multi-stage Builds: Image boyutunu optimize etmek için multi-stage build kullanın
- Exit Codes: Konteyner crash durumlarını izlemek için exit code log'larını takip edin
Secret ve Config Yönetimi
Docker Compose'da hassas bilgileri güvenli şekilde yönetmek için secret ve config özellikleri kullanılır:
services: db: image: postgres:15 secrets: - db_password environment: - POSTGRES_PASSWORD_FILE=/run/secrets/db_password configs: nginx_config: file: ./nginx.conf secrets: db_password: file: ./secrets/db_password.txtBu yaklaşım, hassas bilgilerin environment variable'larda plaintext olarak saklanmasını önler.
Performance Optimizasyonu
Docker Compose performansını artırmak için PHP OPcache gibi araçları yapılandırabilirsiniz. PHP OPcache yapılandırma rehberimiz konteyner içi optimizasyonlar için faydalı bilgiler içerir.
services: php: image: php:8.2-fpm volumes: - ./app:/var/www/html environment: - PHP_OPCACHE_ENABLE=1 - PHP_OPCACHE_MEMORY_CONSUMPTION=256 - PHP_OPCACHE_MAX_ACCELERATED_FILES=10000Monitoring ve Alerting
Docker Compose servislerini izlemek için Prometheus ve Grafana kullanabilir