Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
YAML 2: Multiline String'ler, Anchor/Alias, Merge Key, Çoklu Doküman ve KYAML
Script'i | ile, uzun metni > ile yaz; secret gibi tek satırlık değerlerde |- kullan, yoksa sona \n eklenir. Merge key (<<) YAML 1.2'de yok: Compose, kubectl ve kubeconform destekliyor, GitHub Actions desteklemiyor, js-yaml 5 ise ayar istiyor. Çoklu doküman, anchor'ın doküman sınırı, güvensiz tag'ler, KYAML ve Bookstore için bir yamllint kural setini gerçek çıktılarla gösteriyoruz.
YAML 1: Syntax, Tipler ve "Norway Problem": Bir YAML Dosyasını Doğru Okumak
Tırnaksız bir YAML değerinin tipini parser'ın uyguladığı kural seti belirler: YAML 1.1'de NO false, 12:30 sayı, 0755 sekizlik; YAML 1.2'de üçü de farklı. PyYAML, ruamel.yaml, js-yaml, YamlDotNet, yq, Docker Compose ve kubectl'i aynı dosyayla çalıştırıp Bookstore'un compose.yaml ve Kubernetes manifest'indeki üç gerçek tip hatasını gösteriyoruz.
Aspire ile Deploy: publish, deploy ve do; Docker Compose, Kubernetes ve Azure Hedefleri
aspire publish AppHost'tan yer tutuculu artifact (Compose dosyası, Helm chart'ı) üretir, aspire deploy değerleri çözüp image'ları build ederek hedefe uygular, aspire do tek bir pipeline adımını çalıştırır. Yazı Bookstore'u Docker Compose'a deploy ederken dışarı açılmayan gateway'i, production'a sızan seed verisini, https olmayan Keycloak Authority'sini ve Angular çıktı klasörünü düzeltiyor; Helm chart'ını, registry ihtiyacını ve Azure hedeflerini anlatıyor.
Aspire Nedir, Ne Değildir? AppHost, App Model ve Docker Compose/Kubernetes ile Farkı
Aspire, çok service'li bir uygulamanın parçalarını ve bağlantılarını AppHost'ta kodla tarif edip tek komutla çalıştıran, telemetry'sini dashboard'da toplayan lokal bir orchestration ve observability katmanı; production orchestrator'ı ya da service mesh değil. Yazı Bookstore'a aspire init ile AppHost eklemeyi, DCP proxy'sini, Aspire'ın verdiği environment variable'ları ve ServiceDefaults olmadan neden trace görünmediğini gerçek çıktılarla gösteriyor.
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.