Mert Özen Her Satırda Daha İleri

Blog

Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.

Seriler
15 yazı bulundu
Container Nedir? VM'den Farkı, Namespace, cgroup ve OCI Standardı
DevOps SERİ 01

Container Nedir? VM'den Farkı, Namespace, cgroup ve OCI Standardı

Container, namespace'lerle neyi göreceği, cgroup'larla ne kadar kaynak kullanacağı sınırlanmış ve host'un kernel'ini paylaşan sıradan bir Linux process'idir. nginx'i içeriden ve dışarıdan izleyip PID'leri karşılaştırıyor, docker CLI → dockerd → containerd → runc zincirini process ağacında görüyor, aynı image'ı Podman ile çalıştırıyor ve container'ın ne zaman gereksiz olduğunu tartışıyoruz.

14 Kas 2026 10 dk 11
Docker Kurulumu: Docker Desktop, Linux'ta Docker Engine ve Alternatifler
DevOps SERİ 02

Docker Kurulumu: Docker Desktop, Linux'ta Docker Engine ve Alternatifler

Windows'ta Docker Desktop'ı WSL 2 ile, Linux sunucuda Docker Engine'i dağıtımın paketinden değil Docker'ın resmi apt repository'sinden kurarsın. Ubuntu 24.04'te docker.io ve Compose v1 tuzağını, docker grubunun gerçekten root'a eşdeğer olduğunu, rootless mode'u, docker context ile hangi engine'e konuştuğunu görmeyi, Desktop lisansını, Podman ve WSL containers gibi alternatifleri ve amd64/arm64 emülasyon tuzağını gerçek çıktılarla inceliyoruz.

14 Kas 2026 12 dk 11
Container Yaşam Döngüsü: docker run, ps, logs, exec, stop ve Exit Code'lar
DevOps SERİ 03

Container Yaşam Döngüsü: docker run, ps, logs, exec, stop ve Exit Code'lar

docker stop container'ın PID 1'ine SIGTERM (ya da image'ın STOPSIGNAL'ını) gönderir, 10 saniye bekler ve SIGKILL atar; uygulama shell'in arkasında başlatılmışsa sinyal hiç ulaşmaz ve container 137 ile ölür. Container durumlarını, logs ve exec'i, 0/1/137/139/143 exit code'larını, .NET 10'da ProcessExit'in SIGTERM'de artık çalışmamasını, Generic Host ile graceful shutdown'ı ve restart policy'lerini gerçek çıktılarla inceliyoruz.

14 Kas 2026 14 dk 13
Image'ın İçi: Layer'lar, Tag, Digest, Registry ve Multi-platform Manifest
DevOps SERİ 04

Image'ın İçi: Layer'lar, Tag, Digest, Registry ve Multi-platform Manifest

Bir image; salt okunur layer'lardan, bir config'ten ve bunları listeleyen manifest'ten oluşur, multi-platform image'larda tag her mimari için ayrı manifest'e işaret eden bir index'i gösterir. Tag değişebilir, digest değişmez: lokal registry'de aynı tag'i başka image'a çevirip digest pin'in farkını görüyor, Docker Hub limit header'ını okuyor, containerd image store'un getirdiklerine ve latest yerine semver + SHA tag stratejisine bakıyoruz.

14 Kas 2026 13 dk 10
Dockerfile Temelleri: FROM, RUN, COPY, WORKDIR, ENV, ARG, USER, EXPOSE, CMD ve ENTRYPOINT
DevOps SERİ 05

Dockerfile Temelleri: FROM, RUN, COPY, WORKDIR, ENV, ARG, USER, EXPOSE, CMD ve ENTRYPOINT

Dockerfile'da dosya sistemine dokunan RUN, COPY, ADD ve WORKDIR layer üretir; ENV, ARG, USER, EXPOSE, CMD ve ENTRYPOINT yalnız image config'ine yazılır. Bookstore.Tools için ilk Dockerfile'ı yazıp docker build --check ile taslaktaki hataları yakalıyor, ENTRYPOINT ile CMD'nin nasıl birleştiğini, ARG ile verilen token'ın docker history'de göründüğünü, .dockerignore'un etkisini, EXPOSE'un port açmadığını ve apt-get cache tuzağını gerçek çıktılarla görüyoruz.

14 Kas 2026 13 dk 10
Build Cache ve BuildKit: Layer Sırası, Cache Mount, Build Secret'ları ve Bake
DevOps SERİ 06

Build Cache ve BuildKit: Layer Sırası, Cache Mount, Build Secret'ları ve Bake

Build cache, bir adımın girdisi değişmedikçe onu yeniden çalıştırmaz; COPY'de girdi dosya içeriğidir, bu yüzden önce csproj'u kopyalayıp restore'u kaynak koddan ayırırsan kod değişikliği paketleri yeniden indirmez. Bookstore.Tools'ta build'i 4,6 sn'den 1,6 sn'ye indiriyor, NuGet cache mount'unu ölçüyor, private feed token'ını secret mount ile sızdırmadan veriyor, QEMU ile multi-platform build'e ve docker buildx bake'e bakıyoruz.

14 Kas 2026 15 dk 11
Multi-stage Build Derinlemesine: Target'lar, Test Stage'i, Paralel Stage'ler ve Image Boyutu
DevOps SERİ 07

Multi-stage Build Derinlemesine: Target'lar, Test Stage'i, Paralel Stage'ler ve Image Boyutu

Multi-stage build'de son image yalnız son stage'in içeriğinden oluşur ve BuildKit yalnız hedefe giden stage'leri, birbirine bağlı olmayanları paralel build eder. Bookstore.Tools'u restore, build, test, export, debug ve final stage'lerine bölüp image'ı 1,34 GB'tan 143 MB'a indiriyor, test stage'inin ve chiseled image'ın sınırlarını görüyor, --platform=$BUILDPLATFORM ile QEMU'suz iki mimarili image üretiyoruz.

14 Kas 2026 16 dk 10
ASP.NET Core'u Container'a Almak: .NET 10 Image'ları, Chiseled, Non-root, Port 8080 ve Globalization
DevOps SERİ 08

ASP.NET Core'u Container'a Almak: .NET 10 Image'ları, Chiseled, Non-root, Port 8080 ve Globalization

ASP.NET Core image'ları port 8080'i dinler ve APP_UID ile root olmayan app kullanıcısını taşır; chiseled image'da ise ICU ve tzdata olmadığı için Türkçe kültür ve Europe/Istanbul saat dilimi isteyen kod 500 döner. Bookstore.Api'yi container'a alıp image ailelerini karşılaştırıyor, bu hatayı chiseled-extra ile çözüyor, environment variable ile configuration, shell'siz health check ve memory limit'in GC'ye etkisini gerçek çıktılarla görüyoruz.

14 Kas 2026 13 dk 9
Dockerfile'sız .NET Container: dotnet publish /t:PublishContainer ve Container MSBuild Property'leri
DevOps SERİ 09

Dockerfile'sız .NET Container: dotnet publish /t:PublishContainer ve Container MSBuild Property'leri

.NET SDK, dotnet publish /t:PublishContainer ile Dockerfile ve Docker build'i olmadan image üretir: publish çıktısını tek layer olarak base image'ın üstüne koyar, app kullanıcısını ve 8080 port'unu kendisi ayarlar, sonucu lokal daemon'a, tar dosyasına ya da doğrudan registry'ye gönderir. Bookstore.Api'yi bu yolla üretiyor, ContainerFamily, çok mimarili index ve ContainerImageFormat'ı deniyor, Dockerfile yoluyla boyut, layer ve süre açısından karşılaştırıyoruz.

14 Kas 2026 11 dk 17
Angular Uygulamasını Container'a Almak: Node Build Stage, Unprivileged Nginx ve Runtime Configuration
DevOps SERİ 10

Angular Uygulamasını Container'a Almak: Node Build Stage, Unprivileged Nginx ve Runtime Configuration

Angular uygulaması Node'lu bir build stage'inde derlenir ve yalnız statik dosyalar root olmayan bir nginx image'ına kopyalanır; ortama göre değişen API adresi build'e değil, container başlarken environment variable'lardan yazılan config.json'a konur. bookstore-web için Dockerfile'ı, SPA fallback ve cache header'larını, provideAppInitializer ile runtime config'i, CORS'u, SSR'ın ne zaman gerektiğini ve node_modules tuzağını gerçek çıktılarla görüyoruz.

14 Kas 2026 11 dk 13
Volume, Bind Mount ve tmpfs: Container'da Veriyi Kalıcı Tutmak
DevOps SERİ 11

Volume, Bind Mount ve tmpfs: Container'da Veriyi Kalıcı Tutmak

Container'ın yazılabilir layer'ı container silinince gider; kalıcı olması gereken veri named volume'de, host'tan verilen dosyalar bind mount'ta, geçici veri tmpfs'te durmalı. BookstoreDb'yi SQL Server 2025 container'ında volume ile çalıştırıp container'ı silip veriyi korumayı, BACKUP DATABASE ve tar ile yedeklemeyi, non-root SQL Server'ın bind mount'ta aldığı Permission denied hatasını, testler için tmpfs'i ve anonymous volume tuzağını gerçek çıktılarla görüyoruz.

14 Kas 2026 15 dk 13
Docker Network: Bridge, User-defined Network, Container DNS ve Port Publishing
DevOps SERİ 12

Docker Network: Bridge, User-defined Network, Container DNS ve Port Publishing

Container'lar default bridge'de birbirini adıyla bulamaz; user-defined bir network'te Docker'ın gömülü DNS'i (127.0.0.11) container adlarını ve alias'ları çözer. Bookstore.Api'yi Server=bookstore-db ile SQL Server'a bağlıyor, bookstore-web'in nginx'ini aynı origin için API'ye proxy yapıyor, yalnız giriş noktasını 127.0.0.1'e yayımlıyor ve ufw'yi atlayan iptables kurallarını, deneysel nftables backend'ini ve host.docker.internal'ı gerçek çıktılarla görüyoruz.

14 Kas 2026 13 dk 13
Blog Haritası