format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightDocker Compose ile Geliştirme, Test ve Production Ortamları Ayırma Rehberi
- arrow_rightDocker Compose Nedir ve Neden Önemlidir?
- arrow_rightOrtam Ayrımının Temel Prensipleri
- arrow_right1. Geliştirme Ortamı (Development)
- arrow_right2. Test Ortamı (Testing)
- arrow_right3. Production Ortamı
- arrow_rightDocker Compose Dosya Yapısı
- arrow_rightTemel Dosya Organizasyonu
- arrow_rightTemel docker-compose.yml Yapısı
- arrow_rightGeliştirme Ortamı için Docker Compose Yapılandırması
- arrow_rightdocker-compose.override.yml Örneği
- arrow_rightTest Ortamı için Docker Compose Yapılandırması
- arrow_rightdocker-compose.test.yml Örneği
- arrow_rightProduction Ortamı için Docker Compose Yapılandırması
- arrow_rightdocker-compose.prod.yml Örneği
- arrow_rightOrtam Karşılaştırma Tablosu
- arrow_rightOrtam Değiştirme Komutları
- arrow_rightGeliştirme Ortamını Başlatma
- arrow_rightTest Ortamını Başlatma
- arrow_rightProduction Ortamını Başlatma
- arrow_rightÇevre Değişkenleri Yönetimi
- arrow_right.env Dosyası Kullanımı
- arrow_rightMulti-Stage Build Kullanımı
- arrow_rightEn İyi Uygulamalar ve İpuçları
- arrow_right1. Dockerignore Kullanımı
- arrow_right2. Ağ İzolasyonu
- arrow_right3. Health Check Yapılandırması
- arrow_right4. CI/CD Entegrasyonu
- arrow_rightSonuç ve Öneriler
Docker Compose ile Geliştirme, Test ve Production Ortamları Ayırma Rehberi
Modern yazılım geliştirme süreçlerinde Docker Compose, uygulamaların farklı ortamlarda tutarlı bir şekilde çalışmasını sağlayan kritik bir araç haline gelmiştir. Docker'ın 2023 raporuna göre, şirketlerin %83'ü container teknolojilerini üretim ortamlarında kullanmakta ve bu oran her yıl artış göstermektedir. Bu makalede, Docker Compose kullanarak geliştirme, test ve production ortamlarını nasıl ayıracağınızı detaylı olarak inceleyeceğiz.
Docker Compose Nedir ve Neden Önemlidir?
Docker Compose, çoklu container 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 volume'ları yapılandırabilirsiniz. Ortam ayrımı yaparken, her ortamın kendine özgü gereksinimlerini karşılamak için farklı compose dosyaları kullanılır.
Ortam Ayrımının Temel Prensipleri
Her ortamın farklı gereksinimleri vardır. Geliştirme ortamında hata ayıklama ve hızlı iterasyon ön planken, production ortamında performans ve güvenlik kritik önem taşır. Bu nedenle ortamları doğru şekilde ayırmak, yazılım kalitesini doğrudan etkiler.
1. Geliştirme Ortamı (Development)
Geliştirme ortamında aşağıdaki özellikler önceliklidir:
- Hot Reload: Kod değişikliklerinin anında yansıması
- Detaylı Loglama: Hata ayıklama için kapsamlı log çıktıları
- Güvenlik gevşemesi: Geliştiricilerin rahatça erişebilmesi
- Volume bağlama: Kaynak kodun container'a canlı bağlanması
2. Test Ortamı (Testing)
Test ortamı, CI/CD pipeline'ları ile entegre çalışır ve tutarlılık kritiktir. Bu ortamda izole edilmiş sanal sunucu kaynakları kullanılarak gerçekçi test senaryoları çalıştırılır.
3. Production Ortamı
Production ortamında güvenlik, performans ve güvenilirlik en üst seviyededir. Otomatik yeniden başlatma, sağlık kontrolleri ve kaynak sınırları mutlaka yapılandırılmalıdır.
Docker Compose Dosya Yapısı
Temel Dosya Organizasyonu
Docker Compose'da ortam ayrımı için üç farklı yaklaşım kullanılır:
- docker-compose.yml: Temel konfigürasyon
- docker-compose.override.yml: Yerel geliştirme ayarları
- docker-compose.{environment}.yml: Ortama özel dosyalar
Temel docker-compose.yml Yapısı
version: '3.8'
services:
app:
image: myapp:latest
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- ./data:/app/data
database:
image: postgres:15
environment:
- POSTGRES_DB=myapp
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:
Geliştirme Ortamı için Docker Compose Yapılandırması
Geliştirme ortamında docker-compose.override.yml dosyası kullanılarak temel konfigürasyon üzerine eklemeler yapılır. Bu yaklaşım, ana dosyayı değiştirmeden geliştirme spesifik ayarlar eklemenizi sağlar.
docker-compose.override.yml Örneği
version: '3.8'
services:
app:
build:
context: .
target: development
environment:
- NODE_ENV=development
- DEBUG=true
volumes:
- .:/app
- /app/node_modules
command: npm run dev
ports:
- "3000:3000"
- "9229:9229"
database:
ports:
- "5432:5432"
Bu yapılandırma ile geliştiriciler, kaynak kodda yaptıkları değişiklikleri anında container'da görebilirler. Nginx Proxy Manager gibi araçlarla entegre ederek local domain'ler üzerinden erişim sağlanabilir.
Test Ortamı için Docker Compose Yapılandırması
Test ortamı için docker-compose.test.yml dosyası oluşturulur. Bu ortamda izole veritabanları ve test için optimize edilmiş kaynaklar kullanılır.
docker-compose.test.yml Örneği
version: '3.8'
services:
app:
build:
context: .
target: builder
environment:
- NODE_ENV=test
- CI=true
depends_on:
- test-db
- redis
command: npm test -- --coverage
test-db:
image: postgres:15
environment:
- POSTGRES_DB=test_db
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=testpass
tmpfs:
- /var/lib/postgresql/data
redis:
image: redis:7-alpine
command: redis-server --maxmemory 100mb
Test ortamında tmpfs kullanarak veritabanı verileri memory'de tutularak test hızı artırılır. Bu yaklaşım, her test run'ında temiz bir veritabanı sağlar.
Production Ortamı için Docker Compose Yapılandırması
Production ortamı maximum güvenlik ve performans gerektirir. docker-compose.prod.yml dosyası bu gereksinimleri karşılamak için dikkatli yapılandırılmalıdır.
docker-compose.prod.yml Örneği
version: '3.8'
services:
app:
build:
context: .
target: production
restart: unless-stopped
environment:
- NODE_ENV=production
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
database:
image: postgres:15
restart: unless-stopped
environment:
- POSTGRES_DB=proddb
- POSTGRES_USER=produser
volumes:
- db-data:/var/lib/postgresql/data
deploy:
resources:
limits:
cpus: '1.0'
memory: 1G
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- app
restart: unless-stopped
Ortam Karşılaştırma Tablosu
| Özellik | Geliştirme | Test | Production |
|---|---|---|---|
| Kaynak Kod Etkileşimi | Canlı volume bağlama | Build edilmiş image | Build edilmiş image |
| Log Seviyesi | DEBUG (Detaylı) | INFO | WARN/ERROR |
| Veritabanı | Local port erişimli | İzole, tmpfs | Persistent volume, yedeklemeli |
| Güvenlik | Düşük | Orta | Yüksek (SSL, secrets) |
| Kaynak Sınırları | Yok | Orta | Katı (CPU/RAM limit) |
| Restart Policy | no | on-failure | unless-stopped |
| Health Check | İsteğe bağlı | Zorunlu | Zorunlu |
Ortam Değiştirme Komutları
Docker Compose ile ortamlar arası geçiş yapmak için aşağıdaki komutlar kullanılır:
Geliştirme Ortamını Başlatma
docker-compose up -d
Bu komut önce docker-compose.yml, ardından docker-compose.override.yml dosyalarını okuyarak birleştirir.
Test Ortamını Başlatma
docker-compose -f docker-compose.yml -f docker-compose.test.yml up -d
Production Ortamını Başlatma
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
Production'da --build flag'i kullanılarak image'ın yeniden build edilmesi sağlanır. Bu sayede en güncel kodun deploy edilmesi garanti altına alınır.
Çevre Değişkenleri Yönetimi
Güvenli ortam yönetimi için çevre değişkenleri doğru şekilde yapılandırılmalıdır. Production'da hassas bilgiler (API anahtarları, veritabanı şifreleri) asla YAML dosyalarında plaintext olarak saklanmamalıdır.
.env Dosyası Kullanımı
# .env dosyası (gitignore'a eklenmeli)
DB_PASSWORD=super_secret_password
API_KEY=your_api_key_here
JWT_SECRET=your_jwt_secret
# docker-compose.yml
services:
app:
environment:
- DB_PASSWORD=${DB_PASSWORD}
- API_KEY=${API_KEY}
Docker secrets kullanarak daha güvenli bir yapı oluşturulabilir. Özellikle production ortamında siber güvenlik önlemleri kapsamında bu kritik öneme sahiptir.
Multi-Stage Build Kullanımı
Her ortam için optimize edilmiş Docker image'ları oluşturmak için multi-stage build'ler kullanılır:
# Dockerfile
FROM node:18-alpine AS base
WORKDIR /app
COPY package*.json ./
FROM base AS builder
RUN npm ci --only=production
COPY . .
RUN npm run build
FROM base AS development
RUN npm install
COPY . .
CMD ["npm", "run", "dev"]
FROM builder AS production
USER node
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/main.js"]
Bu yapı ile aynı Dockerfile'dan farklı ortamlar için optimize edilmiş image'lar oluşturulabilir.
En İyi Uygulamalar ve İpuçları
1. Dockerignore Kullanımı
Build süresini hızlandırmak ve image boyutunu küçültmek için .dockerignore dosyası oluşturun:
node_modules .git *.md .env docker-compose*.yml .DS_Store coverage dist2. Ağ İzolasyonu
Her ortam için ayrı Docker ağları oluşturarak servis izolasyonu sağlanır:
networks: dev-network: driver: bridge prod-network: driver: bridge3. Health Check Yapılandırması
Tüm kritik servislerde health check kullanılmalıdır:
services: app: healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 5s retries: 3 start_period: 30s4. CI/CD Entegrasyonu
Otomatik test ve deployment için CI/CD pipeline'larında ortam bazlı compose dosyaları kullanılır. GitHub Actions, GitLab CI veya Jenkins gibi araçlarla entegre edilebilir.
Sonuç ve Öneriler
Docker Compose ile ortam ayrımı, yazılım geliştirme süreçlerinde tutarlılık, güvenlik ve verimlilik sağlar. Geliştirme ortamında hız ve esneklik, test ortamında izolasyon ve tutarlılık, production ortamında ise güvenlik ve performans öncelik