Docker Compose, hem geliştiriciler hem de DevOps mühendisleri için vazgeçilmez bir araç haline gelmiştir. Tek konteynerli uygulamalar test için faydalı olsa da, gerçek dünya projeleri neredeyse her zaman birden fazla servise—web sunucuları, veritabanları, önbellek katmanları ve mesaj kuyrukları—bağlıdır. Docker Compose, servislerinizi, ağlarınızı ve hacimlerinizi yapılandırmak için tek bir YAML dosyası kullanarak çoklu konteyner uygulamalarının tanımlanmasını ve çalıştırılmasını kolaylaştırır. Bu rehber, Docker Compose kullanarak projelerinizi kurmanın ve yönetmenin temel adımlarını adım adım anlatacaktır.
docker-compose.yml Yapısını Anlama
Herhangi bir Docker Compose projesinin kalbi, docker-compose.yml dosyasıdır. Bu dosya, uygulamanızın mimarisini tanımlar. Temelinde, üç ana üst düzey anahtar bulunur: version (yeni sürümlerde daha az kritik), services ve isteğe bağlı olarak volumes ve networks.
services bloğundaki her servis bir konteyneri temsil eder. Görselini, açılan portlarını, ortam değişkenlerini ve bağımlılıklarını tanımlarsınız. Örneğin, bir veritabanıyla temel bir web uygulaması şu şekilde görünebilir:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://db:5432
db:
image: postgres:14
volumes:
- db-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secretpassword
volumes:
db-data:
Ortamınızı Başlatma
Karmaşık yapılandırmalara dalmadan önce, Docker kurulumunuzun güncel olduğundan emin olun. Docker Compose artık bağımsız bir eklenti olarak dağıtılmaktadır, bu nedenle ayrı bir kurulum yapmanıza gerek yoktur. Kurulumunuzu doğrulamak için terminalinizde docker compose version komutunu çalıştırın. Komut başarıyla çalışırsa, devam etmeye hazırsınız demektir.
Projeniz için yeni bir dizin oluşturun ve onu bir Compose projesi olarak başlatın. Compose için belirli bir "init" komutu olmasa da, docker-compose.yml ve Dockerfile dosyalarını aynı kök dizinde tutmak, göreli yolları korumak için en iyi uygulamalardan biridir.
Yaşam Döngüsünü Yönetme
YAML dosyanız yapılandırıldıktan sonra, uygulamanızın yaşam döngüsünü birkaç basit komutla kontrol edebilirsiniz. Tüm tanımlı servisleri ayrılmış (detached) modda başlatmak için şunu kullanın:
docker compose up -d
Alternatif olarak, hata ayıklama için logları ön planda görmek istiyorsanız docker compose up komutunu çalıştırın. Konteynerleri durdurmak için docker compose down komutunu kullanın; bu komut, up komutu tarafından oluşturulan ağları ve anonim hacimleri de kaldırır. Verilerin kalıcı olmasını istiyorsanız, yukarıdaki örnekte gösterildiği gibi YAML dosyanızda adlandırılmış hacimler tanımladığınızdan emin olun.
Gelişmiş Yapılandırmalar: Ağlar ve Gizli Bilgiler
Üretim benzeri ortamlarda güvenlik ve izolasyon en önemli unsurlardır. Docker Compose, hassas verileri izole etmek için özel köprü ağları oluşturmanıza olanak tanır. Varsayılan olarak tüm servisler tek bir ağa bağlanır, ancak belirli ağlar tanımlayabilirsiniz:
networks:
frontend:
backend:
services:
web:
networks:
- frontend
db:
networks:
- backend
Ayrıca, gizli bilgileri (secrets) YAML dosyalarınızda sabit kod olarak (hardcode) kullanmaktan kaçının. Bunun yerine, ortam değişkeni dosyalarını (.env) veya Docker secrets kullanın. Compose dosyanızda ${VARIABLE_NAME} sözdizimini kullanarak değişkenlere başvurabilirsiniz; bu, değerleri yerel ortamınızdan veya proje dizinine yerleştirilen bir .env dosyasından alır.
Yaygın Tuzaklar ve Sorun Giderme
En yaygın sorunlardan biri port çakışmalarından kaynaklanır. Bir port, ana makinede zaten kullanımdaysa, Compose konteyneri başlatamaz. Çakışan süreçleri kontrol etmek için docker ps komutunu kullanın. Bir diğer sık karşılaşılan sorun ise yanlış yapılandırılmış hacim bağlamalarıdır. Ana makinede belirtilen yolun mevcut olduğundan ve konteyner kullanıcısı için doğru izinlere sahip olduğundan emin olun.
Ayrıca, servis bağımlılıklarına dikkatli olun. Compose servisleri paralel olarak başlatabilse de, veritabanı bağlantılarını zarifçe (gracefully) ele almanız gerekir, çünkü veritabanı başlatıldıktan hemen sonra tamamen hazır olmayabilir. Bir servisin gerçekten ne zaman hazır olduğunu belirtmek için servis tanımınızda bir healthcheck direktifi kullanmayı düşünün.
Sonuç
Docker Compose, çoklu konteyner uygulamalarının geliştirilmesini ve dağıtımını kolaylaştırarak, birbirine bağlı servislerin yönetilmesinin karmaşıklığını azaltır. docker-compose.yml dosyasının yapısını ustalaşmak, yaşam döngüsü komutlarını anlamak ve güvenlik ile ağlama için en iyi uygulamaları uygulayarak, kolayca sağlam ve ölçeklenebilir uygulamalar geliştirebilirsiniz. Basit kurulumlarla başlayın ve projeniz büyüdükçe özel ağlar ve kalıcı hacimler gibi özellikleri kademeli olarak ekleyin. İş akışınızı otomatikleştirmek ve en önemli şeye odaklanmak için Compose'un gücünü benimseyin: harika kod yazmak.