Bir Kapsayıcıya ve Docker Hub'a Dağıtmak - C# Kursunda Örnek API İnşası
.NET Core uygulamasını bir Docker konteynerine dağıtmak, modern geliştiriciler için önemli bir beceridir. Konteynerler değiştirilemez altyapı, kolay dağıtım ve hafif çalışma zamanı ortamları sunar. Bu kapsamlı kılavuzda, bir örnek API'yi bir Docker konteynerine dağıtmak ve ardından Tim Corey'nin kapsamlı video eğitiminde gösterildiği adımları takip ederek Docker Hub'a itmek için işlemi adım adım keşfedeceğiz: "Bir Konteyner ve Docker Hub'a Dağıtım – C#'ta Örnek Bir API Oluşturma."
Belirli zaman damgalarını referans alarak, takip etmeyi kolaylaştırmak için süreci adım adım inceleyelim. Bu rehber, .NET uygulaması dağıtımı için Docker kullanımıyla ilgili temel imaj, çalışma zamanı imajı ve konteyner imajı gibi komutların kullanımını içerir.
Örnek API'yi Yaratma ve Anlama
Videonun başlangıcında, Tim, web geliştirmeyi öğrenirken bir örnek uygulamanın kullanışlılığını vurgular. Uygulama, /courses ve /health gibi uç noktalar içerir, bozulmuş sağlık kontrolleri gibi gerçek dünya sorunlarını simüle eder ve hem yerel makinenizde hem de uzak bir sunucuda çalışacak şekilde tasarlanmıştır.
Bu bir .NET Core uygulamasıdır (daha doğrusu bir ASP.NET Core minimal API) ve Docker konteynerleri aracılığıyla kolayca çalıştırılabilir ve test edilebilir.
Docker'ı Yerel Olarak Kurma
Tim, Docker'ın yerel makinede yüklü olduğunu Docker Desktop kullanarak kontrol eder. Lokalde Docker kurulu olmadan doğrudan Docker Hub'a yayınlamanın mümkün olduğunu not eder, ancak gösterim için yerel dağıtımla başlamayı tercih eder.
İki önceden yüklenmiş Docker imajı gösterir:
Altyazılar için kişisel bir araç
- Microsoft'a ait 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 temeli oluşturur. Microsoft, bu imajları MCR (Microsoft Container Registry) üzerinde barındırır ve hem Linux konteynerlerini hem de Windows konteynerlerini destekler. Bu proje için, Linux hedef işletim sistemidir.
Konteynere Yerel Olarak 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'a ihtiyaç duymayan .NET 8 ve .NET 9 içindeki yerleşik konteyner desteğini kullanır. Yayınlama süreci uygun bir çalışma zamanı imajı seçer ve kendi kendine yeten bir konteyner imajı oluşturur.
İçerde şöyle işler:
Proje dosyası (.csproj) API'yi oluşturmak için kullanılır
Bağımlılıklar .NET restore komutu kullanılarak geri yüklenir
Çıktı bir yayın klasörüne gider
- Bir DLL dosyası üretilir ve konteyner içine gömülür
Ortaya çıkan imaj yaklaşık 333 MB boyutundadır (temelinden yalnızca 5 MB daha büyük).
Docker ile İmajı Çalıştırma
İmaj oluşturulduktan sonra, Tim konteyneri çalıştırmak için Docker Desktop'u kullanır. İçerde, uygulama 8080 portunda dinler. Tim, port yapılandırmasına 0 girerek rastgele bir ana bilgisayar portuna harita eder.
Konteyner, rastgele bir adla başlatılır (örneğin, elegant_hoover) ve tarayıcı, varsayılan cevap olarak "Hello World" mesajını gösteren çalışan bir API görüntülemek için açılır.
/courses ve /health'e göz gezdirerek Tim, API'nin çalışır durumda olduğunu doğrular. Sağlık kontrol uç noktası, üretim ortamı senaryosu simüle etmek için faydalıdır.
Çalışan konteynerları görmek için CLI'daki docker ps komutunu kullanabilirsiniz. Tim, temizleme işlemine örnek olarak konteyner ve imajı sonradan siler.
Docker Hub Deposu Oluşturma
Sonra, Tim bulut dağıtım bölümüne taşınır. Docker Hub hesabında oturum açar ve thesampleapi adında bir ortak depo oluşturur.
Bu, Docker imajının diğerlerinin şunu kullanarak çekebilmesi için itileceği yerdir:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestDocker Hub için Proje Yapılandırması
API'nin proje dosyası içinde, Tim Docker imajının nerede ve nasıl yayınlanacağını tanımlamak için meta veri 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: Hedef kayıt olarak Docker Hub'ı belirtir.
- ContainerRepository: Docker Hub deposu yoludur.
ContainerImageTags: Sürümleme ve son sürüm için görüntüyü etiketler.
Bu, gelecekte çok aşamalı bir yapıyı desteklemek üzere görüntüyü hazırlar, ancak Tim şimdilik işleri basit tutuyor.
Docker Hub'a Yayınlama
Tim yine aynı yayınlama komutunu çalıştırır:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainer.csproj dosyasını kaydetmediği için gönderme başarısız olur
Docker Hub'da, hem latest hem de 1.0.0 etiketleri thesampleapi deposunda görünür. Bu etiketler, belirli sürümleri çekerken esneklik sağlar.
Docker Hub'dan Görüntü Çekme
Tim, Docker yüklü herhangi bir makineden görüntüyü nasıl çekeceğini gösterir:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestDocker katman önbelleğe alma sayesinde, görüntü hızlı bir şekilde indirilir çünkü çoğu zaten temel görüntüden gelir.
Görüntüyü ç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 port 8080'e eşler.
Görüntünün Yeni Bir Sürümünü Oluşturma
Sürümleme göstermek için, Tim .csproj dosyasını düzenler:
<ContainerImageTags>1.0.1;latest</ContainerImageTags><ContainerImageTags>1.0.1;latest</ContainerImageTags>Sonra yayınlama komutunu yeniden çalıştırır:
dotnet publish -p:PublishProfile=DefaultContainerdotnet publish -p:PublishProfile=DefaultContainerArtık Docker Hub deposu üç etiket gösterir:
1.0.0
1.0.1
latest (şimdi 1.0.1'e işaret ediyor)
Tim, birden fazla etikete rağmen, Docker'ın disk kullanımını optimize etmek için yinelenen katmanları saklamadığını ve ayırt edici katmanlar kullandığını açıklar.
Yerel Geliştirme İçin Docker Görüntüsünü Kullanma
Tim, görüntü Docker Hub'da bir kez yer aldığında, istediğiniz zaman herhangi bir makinede çalıştırabileceğinizi vurgular:
docker pull timcorey/thesampleapi:latestdocker pull timcorey/thesampleapi:latestSonra docker run komutunu kullanarak görüntüyü başlatın. İşiniz bittiğinde, şu komutla temizleyin:
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 talep üzerine geliştirme ve test yapmanızı mükemmel hale getirir.
Sırada Ne Var?
Tim, bir sonraki adımda bunu bir Sanal Özel Sunucu (VPS) üzerinde dağıtmayı planladığını belirterek konuyu kapatır. Bir alan adı atamak ve konteyneri herkese açık hale getirmek için adımları gösterecek.
Sonuç: Yerel Yapıdan Bulut Dağıtımına
Tim Corey'nin videosu rehberi kullanarak:
.NET new console ile bir .NET Core API oluşturuldu
- .NET restore ve .NET publish kullanılarak oluşturuldu ve dağıtıldı
Örnek bir Dockerfile olmadan bir Docker konteyneri oluşturduk
Docker Hub'a konteyner görüntüsü yükledik
docker run kullanarak konteyneri çektik ve çalıştırdık
Etiketler ve ayırt edici görüntü katmanlarını yönettik
Sürümlemeli görüntüler kullanarak üretim ortamlarına hazırlık yaptık
Docker ve .NET etrafında merkezlenen bu iş akışı, ölçeklenebilir, test edilebilir ve paylaşılabilir uygulamalar oluşturmak için mükemmeldir.

