Altbilgi içeriğine atla
Iron Academy Logo
C# Uygulaması
C# Uygulaması

Diğer Kategoriler

Bir Kapsayıcıya ve Docker Hub'a Dağıtmak - C# Kursunda Örnek API İnşası

Tim Corey
23m 51s

.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=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

Bu 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:latest
docker pull timcorey/thesampleapi:latest

Docker 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=DefaultContainer
dotnet 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:latest
docker pull timcorey/thesampleapi:latest

Docker 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:latest
docker run -p 0:8080 timcorey/thesampleapi:latest

Bu, 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=DefaultContainer
dotnet publish -p:PublishProfile=DefaultContainer

Artı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:latest
docker pull timcorey/thesampleapi:latest

Sonra 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 image
docker ps           # Get container ID
docker stop <id>    # Stop the container
docker rm <id>      # Remove the container
docker rmi <image>  # Remove the image

Bu, 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.

Hero Worlddot related to Bir Kapsayıcıya ve Docker Hub'a Dağıtmak - C# Kursunda Örnek API İnşası
Hero Affiliate related to Bir Kapsayıcıya ve Docker Hub'a Dağıtmak - C# Kursunda Örnek API İnşası

Sevdiğiniz Şeyleri Paylaşarak Daha Fazla Kazanın

.NET, C#, Java, Python veya Node.js ile çalışan geliştiriciler için içerik oluşturuyor musunuz? Uzmanlığınızı ek gelire dönüştürün!

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara