Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Compose'un Evrimi: docker-compose v1'den Compose v2 ve v5'e, Compose Specification ve 2024–2026 Özellikleri
Bugünkü Compose tek bir şemayı, Compose Specification'ı uygular: eski dosyalardaki version alanı yok sayılır, 2.x ve 3.x formatlarının alanları birlikte geçerlidir ve v5, Go SDK'sı ve Bake'e devredilen build'leriyle v2'nin devamıdır. Bookstore'un 2019 tarihli docker-compose.yml'ini docker-compose 1.25.5, 1.29.2 ve Compose 5.7.1 ile çalıştırıp farkları gerçek çıktılarla görüyor, 2024–2026 özelliklerinin haritasını ve bir geçiş kontrol listesini çıkarıyoruz.
Tek Sunucuda Production'da Compose: Image Tag'leri, Restart, Log Rotation, Resource Limit ve Sınırlar
Tek sunucuda Compose'la production'ın kuralı, sunucunun hiç build etmemesi: image CI'da build edilip immutable tag'le registry'ye konur, sunucu pull ve up -d --wait ile onu çeker. Bookstore'da deploy ve rollback'i, up -d'nin bağımlılık zinciri yüzünden yarattığı 11,5 saniyelik kesintiyi, log rotation'ı, resource limit'leri, SIGTERM'ü sqlservr'a iletmeyen entrypoint'i ve Compose 5.6 job'ıyla BACKUP DATABASE'i gerçek çıktılarla görüyoruz.
Birden Çok Environment: Override Dosyaları, include, extends ve Merge Kuralları
Compose'da ortak tanım compose.yaml'da durur, her ortam yalnız farkını yazar: compose.override.yaml -f verilmediğinde kendiliğinden yüklenir, diğer dosyalar -f ile katmanlanır; map'ler birleşir, port listesi ise beklenmedik şekilde eklenir. Bookstore'u include ile veritabanı dosyasına, extends ile ortak sqlcmd tanımına ayırıyor, !override ve !reset'i, tmpfs'te temiz veritabanıyla --wait ve exit code'lu bir CI adımını gerçek çıktılarla görüyoruz.
Development Environment: Compose Watch, Hot Reload ve "Hangi Parça Container'da?" Kararı
Compose Watch, develop.watch kurallarıyla host'taki değişiklikleri çalışan container'a taşır: sync dosyayı kopyalar ve hot reload'lu araçlara yeter, rebuild image'ı yeniden build edip container'ı yeniler. Bağımlılıklar-Compose'da/uygulama-IDE'de, her şey container'da ve Dev Container modellerini karşılaştırıyor, Bookstore.Api'de 5 saniyelik rebuild'i, Angular dev server'ında sync'i ve non-root kullanıcıda silme izni tuzağını gerçek çıktılarla görüyoruz.
Compose'da Configuration ve Secret'lar: environment, env_file, .env Interpolation, secrets ve Profile'lar
.env, Compose'un compose.yaml'daki ${VAR} ifadelerini doldurmak için okuduğu dosyadır ve container'a hiçbir şey vermez; container'a environment variable vermek environment ve env_file'ın, şifreyi dosya olarak vermek secrets:'ın işidir. Öncelik sırasını, ${VAR:?} ile zorunlu değişkenleri, Bookstore'un şifrelerini /run/secrets'a taşımayı, configs ile appsettings vermeyi ve profile'larla opsiyonel service'leri gerçek çıktılarla görüyoruz.
Service Bağımlılıkları: depends_on, Healthcheck Koşulları, Migration Service'i ve Restart
Kısa depends_on yalnız başlatma sırasını verir; bir service'in hazır olmasını beklemek için healthcheck ve condition: service_healthy, tek seferlik bir işin bitmesini beklemek için service_completed_successfully gerekir. SQL Server'a healthcheck yazıyor, şema script'lerini migrate service'ine ve Compose 5.3'ün pre_start init container'ına taşıyor, restart policy'leri ve SqlClient retry logic'ini gerçek kesinti ölçümleriyle deniyoruz.
Docker Compose'a Giriş: compose.yaml ile Bookstore'u Tek Komutla Ayağa Kaldırmak
Docker Compose, Bookstore'un API, web ve SQL Server container'larını, network'ünü ve volume'ünü tek bir compose.yaml'da tanımlar ve docker compose up -d ile hepsini birlikte kaldırır. Dosyanın anatomisini, build ile image farkını, proje adını, service adıyla DNS'i, logs/exec/config komutlarını, down ile down -v'nin veriye etkisini ve version alanının neden artık obsolete olduğunu gerçek çıktılarla görüyoruz.