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.
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:
Sadece geliştirme (dev) profilindeki servisleri çalıştırmak için:
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:
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:
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.
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.
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.
Ş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
Sadece üretim (prod) profilindeki servisleri çalıştırmak için:
Bash:
docker-compose --profile prod up -d
Hangi servislerin çalıştığını görmek için:
Bash:
docker-compose ps
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.
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.