Bir Konteynır ve Docker Hub'a Dağıtma - C# Kursunda Örnek Bir API Oluşturma
.NET Core uygulamasını bir Docker konteynerine dağıtmak modern geliştiriciler için hayati bir beceridir. Kapsülleme; değişmez altyapı, kolay dağıtım ve hafif çalışma ortamları sunar. Bu kapsamlı kılavuzda, örnek bir API'nin bir Docker konteynerine dağıtımını inceleyeceğiz ve ardından Tim Corey'nin "Konteynır ve Docker Hub'a Dağıtım - C#'da Örnek Bir API Oluşturma" başlıklı kapsamlı video öğreticiğinde gösterilen adımları takip ederek Docker Hub'a iteceğiz.
Kolay takip için belirli zaman damgalarını referans alarak süreci adım adım inceleyelim. Bu kılavuz, .NET uygulamasını Docker kullanarak dağıtmak için önemli konseptler olan dotnet publish gibi komutların, docker run komutunun ve temel imaj, çalışma zamanı imajı, konteyner imajı gibi terimlerin kullanımını içerir.
Örnek API'yi Oluşturma ve Anlama
Videonun başında, Tim web geliştirmeyi öğrenirken örnek bir uygulamanın faydasını vurguluyor. Uygulama, /courses ve /health gibi uç noktaları içerir, sağlık kontrollerinin bozulması gibi gerçek dünya sorunlarını simüle eder ve hem yerel makineniz hem de uzaktan bir sunucu üzerinde çalışacak şekilde tasarlanmıştır.
Bu, Docker konteynerleri aracılığıyla kolayca çalıştırılabilen ve test edilebilen bir .NET Core uygulamasıdır (daha doğrusu bir ASP.NET Core minimal API'dir).
Docker'ı Yerel Olarak Kurma
Tim, Docker'ın yerel makinesine yüklü olduğunu kontrol eder, Docker Desktop kullanarak. Docker'ın yerel olarak yüklenmesi gerekmeden doğrudan Docker Hub'a yayınlamanın mümkün olduğunu belirtir, ancak gösterim için yerel dağıtıma başlar.
Önceden yüklenmiş iki Docker imajını gösterir:
Altyazılar için kişisel bir araç
- Microsoft tarafından sağlanan resmi ASP.NET Core temel imajı: mcr.microsoft.com/dotnet/aspnet
Bu temel imaj yaklaşık 328 MB boyutundadır ve konteyner imajımız için temel görevi görür. Microsoft bu imajları kendi MCR (Microsoft Container Registry) üzerinde barındırır ve hem Linux konteynerlerini hem de Windows konteynerlerini desteklerler. Bu proje için, hedef işletim sistemi Linux'tur.
Konteynıra Yerelden Yayınlama
Tim API proje klasörüne gider ve komut satırında şu komutu çalıştırır:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainerBu komut, Dockerfile ihtiyaçını ortadan kaldıran .NET 8 ve .NET 9'da yerleşik konteyner desteğini kullanır. Yayın süreci, uygun bir çalışma zamanı imajı seçer ve kendi kendine yeterli bir konteyner imajı oluşturur.
İşte sahne arkasında olanlar:
Proje dosyası (.csproj) API'yi derlemek için kullanılır
Bağımlılıklar dotnet restore komutu kullanılarak geri yüklenir
Çıktı bir yayın klasörüne gider
- Bir DLL dosyası üretilir ve konteynıra gömülür
Ortaya çıkan imaj yaklaşık olarak 333 MB'dir (temel imajdan sadece 5 MB daha büyüktür).
Docker ile İmajı Çalıştırma
İmaj oluşturulduktan sonra, Tim Docker Desktop kullanarak konteyneri çalıştırır. Dahili olarak, uygulama 8080 portunda dinler. Tim, port yapılandırmasında 0 yazarak bunu rastgele bir ana bilgisayar portuna eşler.
Konteyner, (örneğin, elegant_hoover) rastgele bir adla başlatılır ve tarayıcı, varsayılan yanıt olarak "Hello World" ile çalışan bir API'yi göstermek için açılır.
/courses ve /health'e göz atarak, Tim API'nin çalıştığını doğrular. Sağlık kontrolü uç noktası, bir üretim ortamı senaryosunu simüle etmek için kullanışlıdır.
Çalışan konteynerleri görmek için CLI'da docker ps komutunu kullanabilirsiniz. Tim, sonrasında temizlik için çalışan konteyneri ve imajı siler.
Docker Hub Deposu Oluşturma
Sonraki aşama olarak, Tim bulut dağıtım kısmına geçer. Docker Hub hesabına giriş yapar ve thesampleapi adında bir genel depo oluşturur.
Docker imajımızı diğerlerinin çekebileceği şekilde bu depoya göndereceğiz; önce:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestProjeyi Docker Hub için Yapılandırma
API'nin proje dosyası içerisine, Docker imajının nerede ve nasıl yayınlanacağını tanımlayan meta veriler ekler. Aşağıdaki kod bloğunu ekler:
<ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags><ContainerRegistry>docker.io</ContainerRegistry>
<ContainerRepository>timcorey/thesampleapi</ContainerRepository>
<ContainerImageTags>1.0.0;latest</ContainerImageTags>ContainerRegistry: Docker Hub'ı hedef kayıt defteri olarak belirtir.
ContainerRepository: Docker Hub deposunun yolunu gösterir.
- ContainerImageTags: İmajı sürümlendirme ve en son sürüm için etiketler.
Bu, gelecekte çok aşamalı bir yapı akışı için imajı hazırlar, ancak Tim şimdilik işleri basit tutar.
Docker Hub'a Yayınlama
Tim aynı yayın komutunu tekrar çalıştırır:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainerBaşlangıçta, .csproj dosyasını kaydetmediği için gönderme başarısız olur. Kaydettikten ve komutu yeniden çalıştırdıktan sonra, imaj başarılı bir şekilde Docker Hub'a yüklenir.
Docker Hub'da, hem en son hem de 1.0.0 etiketleri thesampleapi deposu altında görünür. Bu etiketler, belirli sürümleri çekerken esneklik sağlar.
Docker Hub'dan İmaj Çekme
Tim, Docker yüklü herhangi bir makineden imajı nasıl çekeceğini gösterir:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestDocker katman önbellek sayesinde, temel imajdan çoğu zaten mevcut olduğundan, imaj hızla indirilir.
İmajı çalıştırmak için:
docker run -p 0:8080 timcorey/thesampleapi:latestdocker run -p 0:8080 timcorey/thesampleapi:latestBu, rastgele bir ana bilgisayar portunu, dahili 8080 portuna eşler.
İmajın Yeni Bir Sürümünü Oluşturma
Sürüm oluşturmayı göstermek için, Tim .csproj dosyasını düzenler:
<ContainerImageTags>1.0.1;latest</ContainerImageTags><ContainerImageTags>1.0.1;latest</ContainerImageTags>Ardından yayın komutunu tekrar çalıştırır:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainerArtık Docker Hub deposunda üç etiket gösteriliyor:
1.0.0
1.0.1
- en son (şimdi 1.0.1'e işaret ediyor)
Tim, çok sayıda etiket olmasına rağmen, Docker'ın yinelenen katmanlar saklamadığını ve disk kullanımını farklı katmanlarla optimize ettiğini açıklar.
Yerel Gelişim İçin Docker İmajını Kullanma
Tim, bir kez imaj Docker Hub'da olduğunda, herhangi bir makinede kullanarak onu çalıştırabileceğinizi vurgular:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestArdından, çalıştırmak için docker run komutunu kullanın. Bitirdiğinizde temizlik yapmak için:
docker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the imagedocker ps # Get container ID
docker stop <id> # Stop the container
docker rm <id> # Remove the container
docker rmi <image> # Remove the imageBu, yerel makinenizi şişirmeden anlık geliştirme ve test için mükemmel hale getirir.
Sonraki Ne?
Tim, bir sonraki adımı belirtir: bu aynı API'yi Bir Sanal Özel Sunucu'ya (VPS) dağıtma. Bir alan adını haritalandırma ve konteyneri herkese açık erişilebilir hale getirme sürecini yürütecek.
Sonuç: Yerel Yapıdan Bulut Dağıtımına
Tim Corey'nin videosunu kullanarak:
.NET Core API'yi yapılandırdık
dotnet restore ve dotnet publish kullanarak oluşturma ve dağıtım yaptık
Örnek bir Dockerfile'a ihtiyaç duymadan bir Docker konteyneri oluşturduk
Konteyner imajını Docker Hub'a yükledik
docker run kullanarak konteyneri çekip çalıştırdık
Etiketleri ve farklı imaj katmanlarını yönettik
- Sürümlü imajları kullanarak üretim ortamlarına hazırlandık
Docker ve .NET etrafında merkezlenmiş bu iş akışı, ölçeklenebilir, test edilebilir ve paylaşılabilir uygulamalar oluşturmak için mükemmel.

