format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Compose ile Gelişmiş Mikroservis Orkestrasyonu: Kapsamlı Rehber
- arrow_rightDocker Compose Nedir ve Neden Mikroservisler İçin Kritik Önem Taşır?
- arrow_rightDocker Compose ile Mikroservis Mimarisi Temel Bileşenleri
- arrow_right1. Servis Tanımlama ve Yapılandırma
- arrow_right2. Ağ Yapılandırması ve Servisler Arası İletişim
- arrow_right3. Veri Kalıcılığı ve Volume Yönetimi
- arrow_rightGelişmiş Orkestrasyon Teknikleri
- arrow_right1. Health Check ve Bağımlılık Yönetimi
- arrow_right2. Ortam Değişkenleri ve Yapılandırma Yönetimi
- arrow_right3. Ölçeklendirme ve Yük Dengeleme
- arrow_rightProduction Ortamı İçin En İyi Uygulamalar
- arrow_rightGüvenlik Yapılandırması
- arrow_rightKaynak Limitleri ve Performans
- arrow_rightLoglama ve İzleme
- arrow_rightDocker Compose vs Kubernetes: Karşılaştırma
- arrow_rightMikroservis Pattern'leri ve Docker Compose Uygulamaları
- arrow_right1. API Gateway Pattern
- arrow_right2. Circuit Breaker Pattern
- arrow_right3. Event-Driven Architecture
- arrow_rightCI/CD Pipeline Entegrasyonu
- arrow_rightSık Yapılan Hatalar ve Çözümleri
- arrow_right1. Tüm Servisleri Tek Compose Dosyasında Tutma
- arrow_right2. Sağlık Kontrollerini Atlama
- arrow_right3. Volume'ları Unutma
- arrow_right4. Environment Variable'ları Hardcode Etme
Docker Compose ile Gelişmiş Mikroservis Orkestrasyonu: Kapsamlı Rehber
Mikroservis mimarisi, modern yazılım geliştirme süreçlerinin temel taşlarından biri haline gelmiştir. Docker Compose ise bu mimarinin yönetimini kolaylaştıran güçlü bir araçtır. 2024 itibarıyla kurumsal uygulamaların %78'i container tabanlı mimarilere geçiş yapmış olup (Gartner verilerine göre), Docker Compose bu dönüşümde kritik bir rol üstlenmektedir.
Bu rehberde, Docker Compose kullanarak gelişmiş mikroservis orkestrasyonu tekniklerini, en iyi uygulamaları ve production ortamı için gerekli stratejileri detaylı olarak ele alacağız.
Docker Compose Nedir ve Neden Mikroservisler İçin Kritik Önem Taşır?
Docker Compose, çoklu container uygulamalarını tanımlamak ve çalıştırmak için kullanılan bir YAML tabanlı araçtır. Tek bir komutla tüm servislari başlatabilir, durdurabilir ve ölçeklendirebilirsiniz. Mikroservis mimarisinde her bir servis bağımsız bir container olarak çalışır ve bu containerların koordinasyonu Docker Compose ile sağlanır.
Geleneksel monolitik uygulamalardan mikroservis mimarisine geçişte, sanal sunucu altyapısının doğru yapılandırılması başarının anahtarıdır.
Docker Compose ile Mikroservis Mimarisi Temel Bileşenleri
1. Servis Tanımlama ve Yapılandırma
Docker Compose dosyasında (docker-compose.yml) her mikroservis ayrı bir servis olarak tanımlanır. Aşağıdaki yapı temel bir mikroservis yapılandırmasını göstermektedir:
version: '3.8'
services:
api-gateway:
image: nginx:alpine
ports:
- "80:80"
depends_on:
- auth-service
- user-service
- order-service
networks:
- microservices-network
auth-service:
build: ./auth
environment:
- DATABASE_URL=postgresql://db:5432/auth
depends_on:
- db
user-service:
build: ./user
environment:
- DATABASE_URL=postgresql://db:5432/users
order-service:
build: ./order
depends_on:
- db
- redis
db:
image: postgres:15
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
networks:
microservices-network:
driver: bridge
volumes:
postgres-data:
2. Ağ Yapılandırması ve Servisler Arası İletişim
Mikroservis mimarisinde servisler arası güvenli iletişim kritik öneme sahiptir. Docker Compose, varsayılan olarak bridge ağ sürücüsünü kullanır, ancak production ortamları için daha gelişmiş ağ yapılandırmaları önerilir.
Servisler birbirleriyle hostname üzerinden iletişim kurabilir. Örneğin, auth-service, user-service'e http://user-service:5000 adresinden erişebilir.
3. Veri Kalıcılığı ve Volume Yönetimi
Mikroservislerde veri kalıcılığı için volume'ların doğru yapılandırılması gerekir. Docker volume yapılandırması konusunda detaylı bilgi almak için ilgili rehberimizi inceleyebilirsiniz.
volumes:
db-data:
driver: local
app-logs:
driver: local
cache-data:
driver: local
Gelişmiş Orkestrasyon Teknikleri
1. Health Check ve Bağımlılık Yönetimi
Production ortamında container'ların sağlık durumlarının izlenmesi kritik önem taşır. Docker Compose, health check yapılandırması ile container durumlarını otomatik olarak izler:
services:
api-service:
image: myapi:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Bu yapılandırma, servislerin sağlıklı çalışıp çalışmadığını kontrol eder ve bağımlı servislerin sadece hazır olduklarında başlatılmasını sağlar.
2. Ortam Değişkenleri ve Yapılandırma Yönetimi
Mikroservis mimarisinde farklı ortamlar (dev, staging, production) için farklı yapılandırmalar kullanılmalıdır:
services:
user-service:
env_file:
- .env.common
- .env.${ENV:-development}
environment:
- NODE_ENV=${ENV:-development}
- LOG_LEVEL=${LOG_LEVEL:-info}
Bu yaklaşım ile tek bir docker-compose dosyası ile farklı ortamlarda çalışabilirsiniz.
3. Ölçeklendirme ve Yük Dengeleme
Docker Compose, servislerin horizontal ölçeklendirmesini destekler:
docker-compose up --scale order-service=3 -d
Bu komut order servisini 3 instance olarak çalıştırır. Ancak production ortamında bu yaklaşım yeterli değildir; VDS sunucu altyapısı üzerinde Kubernetes gibi orkestrasyon araçları kullanmanızı öneririz.
Production Ortamı İçin En İyi Uygulamalar
Güvenlik Yapılandırması
Production ortamında güvenlik en üst düzeyde tutulmalıdır. Aşağıdaki önlemler alınmalıdır:
- Root kullanıcı kullanmaktan kaçının: Her servis için ayrı kullanıcı tanımlayın
- Secret yönetimi: Hassas bilgileri environment variable olarak değil, Docker secrets olarak saklayın
- Network izolasyonu: Servisleri ayrı ağlarda çalıştırın
- Image güvenliği: Sadece güvenilir kaynaklardan image kullanın
services:
api-service:
user: "1000:1000"
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true
Kaynak Limitleri ve Performans
Sunucu kaynaklarının doğru yönetimi için limitler belirlenmelidir. Sunucu kaynak limitleri ve performans testleri hakkında detaylı bilgi almak için ilgili makalemizi inceleyebilirsiniz.
services:
heavy-service:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M
Loglama ve İzleme
Merkezi loglama ve izleme, mikroservis mimarisinin olmazsa olmazıdır. JSON formatında loglama yapılandırması:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Production ortamında ELK stack (Elasticsearch, Logstash, Kibana) veya Prometheus + Grafana kullanmanızı öneririz.
Docker Compose vs Kubernetes: Karşılaştırma
Mikroservis orkestrasyonu için Docker Compose ve Kubernetes arasındaki temel farkları bilmek doğru karar vermenizi sağlar:
| Özellik | Docker Compose | Kubernetes |
|---|---|---|
| Kurulum Kolaylığı | Kolay (tek makine) | Karmaşık (çoklu node) |
| Ölçeklendirme | Manuel/Basit | Otomatik/Advanced |
| Self-Healing | Sınırlı | Tam destek |
| Load Balancing | Temel | Gelişmiş |
| Service Discovery | Docker DNS | Internal DNS + Ingress |
| Rolling Updates | Manuel | Otomatik |
| Use Case | Dev/Test/Small Prod | Production/Enterprise |
Küçük ve orta ölçekli projeler için Docker Compose yeterli olabilirken, büyük production ortamları için Kubernetes tabanlı çözümler daha uygundur.
Mikroservis Pattern'leri ve Docker Compose Uygulamaları
1. API Gateway Pattern
API Gateway, tüm istemci isteklerini tek bir noktadan yönetir ve uygun mikroservislere yönlendirir. Nginx reverse proxy olarak kullanılabilir:
services:
api-gateway:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
- "443:443"
2. Circuit Breaker Pattern
Bir servisin başarısız olması durumunda kaskad etkileri önlemek için circuit breaker kullanılır. Bu, Resilience4j veya Hystrix gibi kütüphanelerle implementasyon gerektirir.
3. Event-Driven Architecture
Mikroservisler arası asenkron iletişim için message broker kullanılır:
services:
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
order-service:
build: ./order
depends_on:
- rabbitmq
environment:
- RABBITMQ_HOST=rabbitmq
CI/CD Pipeline Entegrasyonu
Modern mikroservis deployment'ları için CI/CD pipeline kritik öneme sahiptir. Aşağıda tipik bir GitLab CI veya GitHub Actions yapılandırması örneği verilmiştir:
# .gitlab-ci.yml
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker-compose build
- docker-compose push $IMAGE_REGISTRY
test:
stage: test
script:
- docker-compose up -d
- docker-compose run --rm test-service
deploy:
stage: deploy
script:
- docker-compose -f docker-compose.prod.yml up -d
only:
- main
Sık Yapılan Hatalar ve Çözümleri
1. Tüm Servisleri Tek Compose Dosyasında Tutma
Büyük projelerde tüm servisleri tek dosyada tutmak yönetimi zorlaştırır. Bunun yerine override dosyaları kullanın:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
2. Sağlık Kontrollerini Atlama
Health check eklenmemiş container'lar, bağımlı servislerin erken başlamasına neden olabilir. Her zaman health check tanımlayın.
3. Volume'ları Unutma
Veri kalıcılığı için volume tanımlamazsanız, container silindiğinde veriler kaybolur. Sunucularda disk alanı dolu hatası çözümleri için ilgili makalemizi inceleyebilirsiniz.
4. Environment Variable'ları Hardcode Etme
Hassas bilgileri (şifreler, API anahtarları) doğrudan compose dosyasına yazmayın. .env dosyaları veya secret management araçları kullanın.
Nginx ile Reverse Proxy Yapılandırması
Birden fazla mikroservisi tek bir domain altında sunmak için Nginx reverse proxy kullanılır:
upstream auth {
server auth-service:5000;
}
upstream user {
server user-service:5001;
}
server {
location /auth/ {
proxy_pass http://auth/;
proxy_set_header Host $host;
}
location /user/ {
proxy_pass http://user/;
proxy_set_header Host $host;
}
}