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

Diğer Kategoriler

Bir Konteynır ve Docker Hub'a Dağıtma - C# Kursunda Örnek Bir API Oluşturma

Tim Corey
23m 51s

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

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

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

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

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

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

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

Ardı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 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 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.

Hero Worlddot related to Bir Konteynır ve Docker Hub'a Dağıtma - C# Kursunda Örnek Bir API Oluşturma
Hero Affiliate related to Bir Konteynır ve Docker Hub'a Dağıtma - C# Kursunda Örnek Bir API Oluşturma

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

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

Iron Destek Ekibi

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