Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Docker Compose'da Farklı Profiller (Profiles) Kullanarak Geliştirme ve Üretim Ortamlarını Ayrıştırma

websterx

Üye
Katılım
14 Mart 2026
Mesajlar
34
Merhaba arkadaşlar, bugün sizlere Docker Compose ile çalışırken işinizi inanılmaz kolaylaştıracak, geliştirme (development) ve üretim (production) ortamlarınızı temiz bir şekilde ayırmanızı sağlayacak "Profiller" (Profiles) özelliğini anlatacağım. Bu yöntemle tek bir `docker-compose.yml` dosyası ile farklı servis kombinasyonlarını yönetebilecek, hata yapma riskinizi azaltacak ve konfigürasyon karmaşasından kurtulacaksınız.

🎯 Docker Compose Profilleri Nedir?

Docker Compose v2.1 ve üzeri ile gelen bu özellik, bir Compose dosyası içindeki servisleri gruplamanıza olanak tanır. Belirli bir profili çalıştırdığınızda, sadece o profile atanmış servisler ayağa kalkar. Bu sayede, örneğin geliştirme sırasında ihtiyaç duyduğunuz debug araçları, ek loglayıcılar veya veritabanı GUI'leri sadece o ortamda çalışırken, üretimde sadece temel ve gerekli servisler çalışır. Benim sunucularda genelde kullandığım yöntem, tek dosyada tüm yapıyı görmek ve yönetmek açısından çok daha şık.

⚙️ Örnek Docker Compose Yapımız

Aşağıda, tipik bir web uygulaması için geliştirme ve üretim profillerini içeren örnek bir `docker-compose.yml` dosyası paylaşıyorum. Bu yapıyı kendi projelerinize uyarlayabilirsiniz.

YAML:
version: '3.8'
services:
  # Tüm ortamlar için TEMEL servisler (profile eklemiyoruz)
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app
    networks:
      - app-network

  app:
    build: ./app
    environment:
      - NODE_ENV=production
    networks:
      - app-network

  postgres:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
    secrets:
      - db_password

  # SADECE geliştirme ortamında çalışacak servisler
  pgadmin:
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@local.dev
      PGADMIN_DEFAULT_PASSWORD: admin
    ports:
      - "8080:80"
    profiles: ["dev"] # Bu servis sadece 'dev' profilinde çalışacak
    networks:
      - app-network

  # SADECE geliştirme ortamında çalışacak servisler - Örnek 2
  debug-helper:
    build: ./debug-tools
    volumes:
      - /app/logs
    profiles: ["dev"]
    networks:
      - app-network

  # SADECE üretim ortamında çalışacak servisler
  backup-cron:
    image: prod-backup-image
    volumes:
      - backup_volume:/backups
    profiles: ["prod"] # Bu servis sadece 'prod' profilinde çalışacak
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  postgres_data:
  backup_volume:

secrets:
  db_password:
    file: ./secrets/db_password.txt

Gördüğünüz gibi, `pgadmin` ve `debug-helper` servislerine `profiles: ["dev"]` ekledim. `backup-cron` servisine ise `profiles: ["prod"]` ekledim. `nginx`, `app` ve `postgres` servisleri her iki ortamda da çalışacak temel yapı taşları olduğu için onlara profil atamadım.

🚀 Profilleri Çalıştırma ve Yönetme

Şimdi gelelim bu yapıyı nasıl kullanacağımıza. Şu ayara çok dikkat etmelisiniz, çünkü tüm servisleri mi yoksa sadece belirli profildekileri mi çalıştırdığınızı bilmek önemli.

Tüm servisleri (profili olmayan + tüm profillerdekiler) çalıştırmak için klasik komut:
Bash:
docker-compose up -d

Sadece geliştirme (dev) profilindeki servisleri çalıştırmak için:
Bash:
docker-compose --profile dev up -d
Bu komut, temel servislere (`nginx`, `app`, `postgres`) EK OLARAK `pgadmin` ve `debug-helper` servislerini de ayağa kaldıracaktır.

Sadece üretim (prod) profilindeki servisleri çalıştırmak için:
Bash:
docker-compose --profile prod up -d
Bu komut ise, temel servislere EK OLARAK `backup-cron` servisini çalıştıracak, geliştirme araçlarını çalıştırmayacaktır.

Hangi servislerin çalıştığını görmek için:
Bash:
docker-compose ps

⚠️ Dikkat Edilmesi Gerekenler

1. Versiyon Desteği: Bu özelliği kullanabilmek için `docker-compose.yml` dosyanızın en üstünde `version: '3.8'` veya daha yeni bir sürüm (ör. `'3.9'`) belirtmelisiniz. Ayrıca Docker Compose CLI v2 kullanmanızı şiddetle tavsiye ederim.
2. Dosya Yolu Doğruluğu: Özellikle volume bağlamalarında (örn: ./nginx.conf:/etc/nginx/nginx.conf:ro) yolların doğru olduğundan emin olun. Üretimde yanlış bir yol, servisin çalışmamasına neden olabilir.
3. Gizli Bilgiler (Secrets): Yukarıdaki örnekte `db_password` gibi hassas bilgileri `secrets` mekanizması ile yönettim. Üretim ortamlarında ./secrets/ dizininize dışarıdan erişilemediğinden ve dosya izinlerinin doğru ayarlandığından emin olun.
4. Ağ (Network) Yapılandırması: Tüm servislerin aynı özel ağda (app-network) olması, birbirleriyle iletişim kurmalarını sağlar ancak dış dünyaya sadece `ports` tanımı olan servisler (`nginx`, `pgadmin`) açık olur. Bu güvenlik için önemli bir yaklaşımdır.

💎 Sonuç ve Tavsiyeler

Docker Compose Profilleri, özellikle mikroservis mimarilerinde veya farklı ihtiyaçlara sahip ortamları yönetirken hayat kurtarıcıdır. Tek bir doğru kaynak (single source of truth) olan `docker-compose.yml` dosyanızı koruyarak, ortamlar arası tutarsızlık riskini büyük ölçüde azaltırsınız.

Ben genellikle `dev` profilinde; real-time log izleyici, veritabanı yönetim arayüzü ve belki bir mock API servisi ekliyorum. `prod` profilinde ise yalnızca backup, monitoring agent veya log aggregator gibi servisleri çalıştırıyorum.

Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Profil kullanımı dışında Docker Compose'u daha verimli kılmak için başka hangi püf noktalarınız var? Deneyimlerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin, birlikte tartışalım.
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri