Modern yazılım geliştirme yaşam döngüsünde, yerel, önizleme (staging) ve üretim ortamları arasındaki tutarlılık hayati önem taşır. Docker konteynerleştirme motorunu sağlarken, Docker Compose çok konteynerli uygulamaları hayata geçiren orkestratördür. Orta ve ileri düzey geliştiriciler için tek konteynerli iş akışlarından güçlü, tanımlanmış bir Compose kurulumuna geçmek sadece bir konfor değil; ölçeklenebilirlik ve işbirliği için bir zorunluluktur.
Bu rehber, Docker Compose kullanarak üretim benzeri bir yerel geliştirme ortamı mimarisi oluşturmanın sürecini, hizmet tanımlama, hacim yönetimi ve ağ yapılandırması konularındaki en iyi uygulamalara odaklanarak adım adım anlatacaktır.
Mimariyi Anlamak
Kod yazmadan önce hizmetleri tanımlamalıyız. Tipik bir web uygulaması bir ön uç uygulaması, bir arka uç API'si ve bir veritabanından oluşabilir. Docker Compose, bu bağımlılıkları tek bir docker-compose.yml dosyasında tanımlamamıza olanak tanır. Bu bildirimsel yaklaşım, ekip içindeki herhangi bir geliştiricinin tüm yığınları tek bir komutla ayağa kaldırmasını sağlayarak "benim makinemde çalışıyor" sorununu ortadan kaldırır.
Hizmetlerinizi Tanımlama
Gerçekçi bir senaryo kuralım: PostgreSQL veritabanına bağlı bir Node.js API'si ve React ön ucu ile sunulan bir uygulama. Yapılandırma dosyamızda üç ayrı hizmet tanımlayacağız. Her hizmet, bir konteyner için bir şablon görevi görür; imajı, build bağlamını, portları ve ortam değişkenlerini belirtir.
Bu bağımlılıkları yöneten sağlam bir docker-compose.yml yapılandırması aşağıdadır:
version: '3.8'
services:
api:
build:
context: ./api
dockerfile: Dockerfile.dev
container_name: dev-api
ports:
- "4000:4000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- NODE_ENV=development
volumes:
- ./api:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- db
networks:
- dev-net
db:
image: postgres:15-alpine
container_name: dev-db
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- dev-net
web:
build:
context: ./web
dockerfile: Dockerfile.dev
container_name: dev-web
ports:
- "3000:3000"
volumes:
- ./web:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- api
networks:
- dev-net
volumes:
pgdata:
networks:
dev-net:
driver: bridge
Temel Yapılandırma Stratejileri
Yukarıdaki örnekte, sorunsuz bir geliştirme deneyimi sağlamak için birkaç kritik desen kullanılmıştır.
Hacim Yönetimi
api ve web hizmetlerinde hacim kullanımına dikkat edin. Yerel kod dizinini (./api:/usr/src/app) bağlayarak sıcak yeniden yükleme (hot-reload) yeteneklerini etkinleştiriyoruz. Yerel olarak bir dosyayı kaydettiğinizde, değişiklikler yeniden derleme gerektirmeden konteyner içinde anında yansıtılır. İkinci hacim olan - /usr/src/app/node_modules, konteyner içindeki node_modules klasörünü etkili bir şekilde maskeleyen adlandırılmış bir hacimdir. Bu, yerel izin sorunlarını önler ve npm install'ın konteyner bağlamı içinde doğru şekilde çalışmasını sağlar.
Ağ İzolasyonu
Varsayılan ağa güvenmek yerine özel bir köprü ağı (dev-net) tanımlıyoruz. Bu, daha iyi izolasyon sağlar ve hizmetlerin DNS adları aracılığıyla birbirini keşfetmesine olanak tanır (örneğin, API veritabanına sadece db ana bilgisayar adını kullanarak erişebilir). Bu, üretim ağ davranışını daha yakından taklit eder.
Bağımlılık Sıralaması
depends_on kullanımı, veritabanı ve API'nin web istemcisinden önce başlamasını sağlar. Compose varsayılan olarak veritabanının bağlantıları kabul etmeye *hazır olmasını* beklemez, ancak konteynerlerin doğru sırada başlamasını sağlar. Üretim hazırlığı için genellikle sağlık kontrolleri (health checks) uygulamanız gerekir, ancak yerel geliştirme için bu basit sıralama genellikle yeterlidir.
Ortamınızı Başlatma
docker-compose.yml dosyanız hazır olduğunda, yığınızı başlatmak oldukça basittir. Projenizin kök dizininde terminalinizi açın ve şu komutu çalıştırın:
docker-compose up --build
--build bayrağı, Dockerfile'larda değişiklik yaptıysanız bunların yeniden oluşturulmasını sağlar. Bunu arka planda (detached mod) çalıştırmak için komuta -d ekleyin.
Sonuç
Yerel geliştirme için Docker Compose kurulumu, ekip verimliliği ve dağıtım güvenilirliği açısından getirisi olan bir yatırımdır. Altyapınızı kod olarak tanımlayarak, işletim sistemine özgü tuhaflıkları soyutlayan tekrarlanabilir bir ortam yaratırsınız. Compose ile daha rahatlaştıkça, bu kurulumu Redis gibi önbellek katmanları, RabbitMQ gibi mesaj kuyrukları veya Nginx gibi ters vekil sunucular dahil edecek şekilde genişletebilirsiniz; tüm bunlar tek bir yapılandırma dosyasından yönetilir.
Basit başlayın, sık sık iterasyon yapın ve Docker Compose'un ağır işlerini üstlenmesine izin vererek harika yazılımlar yazmaya odaklanın.