Aracılığıyla paylaş


dotnet publish ile bir .NET uygulamasını kapsayıcıya alma

Kapsayıcılar sabit bir altyapı olmak, taşınabilir mimari sağlamak ve ölçeklenebilirliği etkinleştirmek gibi birçok özellik ve avantaja sahiptir. Görüntü yerel geliştirme ortamınız, özel bulutunuz veya genel bulutunuz için kapsayıcılar oluşturmak için kullanılabilir. Bu öğreticide, Dockerfile kullanmadan dotnet publish komutunu kullanarak bir .NET uygulamasını kapsayıcıya almayı öğreneceksiniz. Ayrıca, kapsayıcı görüntüsünü ve çalıştırmayı nasıl yapılandıracağınızı ve kaynakları nasıl temizleyeceğinizi keşfedersiniz.

Bahşiş

.NET uygulamanızı kapsayıcıya almak için Dockerfile kullanmak istiyorsanız bkz. Öğretici: .NET uygulamasını kapsayıcıya alma.

Önkoşullar

Aşağıdaki önkoşulları yükleyin:

  • .NET 8+ SDK
    .NET yüklüyse, hangi SDK'yı kullandığınızı belirlemek için dotnet --info komutunu kullanın.

Kapsayıcıyı yerel olarak çalıştırmayı planlıyorsanız, Open Container Initiative (OCI) uyumlu bir kapsayıcı çalışma zamanına ihtiyacınız vardır, örneğin:

  • Docker Desktop: En yaygın kapsayıcı çalışma zamanı.
  • Podman: Docker'a açık kaynak bir daemonless alternatifi.

Önemli

.NET SDK'sı Docker olmadan kapsayıcı görüntüleri oluşturur. Docker veya Podman yalnızca görüntüyü yerel olarak çalıştırmak istiyorsanız gereklidir. Varsayılan olarak, .NET uygulamanızı kapsayıcı görüntüsü olarak yayımlamak yerel bir kapsayıcı çalışma zamanına gönderir. Alternatif olarak, görüntüsünü bir tarball olarak kaydedebilir veya herhangi bir kapsayıcı çalışma zamanı kullanmadan doğrudan bir kapsayıcı kayıt defterine yükleyebilirsiniz.

Bu önkoşullara ek olarak, örnek proje bir çalışan olduğu için .NET Çalışan Hizmetleri hakkında bilgi sahibi olmanız önerilir.

.NET uygulaması oluşturma

Kapsayıcı oluşturmak için bir .NET uygulamasına ihtiyacınız vardır, bu nedenle şablondan yeni bir uygulama oluşturarak başlayın. Terminalinizi açın, henüz yapmadıysanız bir çalışma klasörü (sample-directory) oluşturun ve dizinleri içinde olacak şekilde değiştirin. çalışma klasöründe aşağıdaki komutu çalıştırarak Workeradlı bir alt dizinde yeni bir proje oluşturun:

dotnet new worker -o Worker -n DotNet.ContainerImage

Klasör ağacınız aşağıdaki dizine benzer:

📁 sample-directory
    └──📂 Worker
        ├──appsettings.Development.json
        ├──appsettings.json
        ├──DotNet.ContainerImage.csproj
        ├──Program.cs
        ├──Worker.cs
        ├──📂 Properties
        │   └─── launchSettings.json
        └──📂 obj
            ├── DotNet.ContainerImage.csproj.nuget.dgspec.json
            ├── DotNet.ContainerImage.csproj.nuget.g.props
            ├── DotNet.ContainerImage.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

dotnet new komutu, Worker adlı yeni bir klasör oluşturur ve çalıştırıldığında her saniye bir ileti günlüğe kaydeden bir işçi hizmeti oluşturur. Terminal oturumunuzda dizinleri değiştirin ve Çalışanı klasörüne gidin. Uygulamayı başlatmak için dotnet run komutunu kullanın.

dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
      Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
      Application is shutting down...

İşçi şablonu süresiz olarak döngüde kalır. Durdurmak için Ctrl+C iptal komutunu kullanın.

Kapsayıcı görüntüsü adını ayarlama

Bir uygulamayı kapsayıcı olarak yayımlarken kullanılabilecek çeşitli yapılandırma seçenekleri vardır. Varsayılan olarak, kapsayıcı görüntü adı projenin AssemblyName'ıdır. Bu ad kapsayıcı görüntüsü adı olarak geçersizse, aşağıdaki proje dosyasında gösterildiği gibi bir ContainerRepository belirterek geçersiz kılabilirsiniz:

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
    <ContainerRepository>dotnet-worker-image</ContainerRepository>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
  </ItemGroup>
</Project>

Daha fazla ayrıntı için bkz. ContainerRepository.

.NET uygulamasını yayımlama

.NET uygulamasını kapsayıcı olarak yayımlamak için aşağıdaki dotnet publish komutunu kullanın:

dotnet publish --os linux --arch x64 /t:PublishContainer

Yukarıdaki .NET CLI komutu uygulamayı kapsayıcı olarak yayımlar:

  • Linux'u işletim sistemi olarak hedefleme (--os linux).
  • Bir x64 mimarisi belirtme (--arch x64).

Önemli

Kapsayıcıyı yerel olarak yayımlamak için etkin bir OCI uyumlu daemon'un çalışıyor olması gerekir. Uygulamayı kapsayıcı olarak yayımlamaya çalıştığınızda çalışmıyorsa aşağıdakine benzer bir hatayla karşılaşırsınız:

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

dotnet publish komutu, örnek çıktıya benzer bir çıkış oluşturur:

Restore complete (0.2s)
  DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\

Bu komut, çalışan uygulamanızı yayımlama klasörüne derler ve kapsayıcı görüntüsünü varsayılan olarak yerel Docker daemon'unuza gönderir. Podman kullanıyorsanız, bir takma ad

.NET uygulamasını tarball'da yayımlama

Tarball (veya tar dosyası), diğer dosyaları içeren bir dosyadır. Sıkıştırılmış bir arşiv olduğunu belirtmek için genellikle *.tar.gz bileşik dosya uzantısıyla biter. Bu dosya türleri yazılım dağıtmak veya yedekleme oluşturmak için kullanılır. Bu durumda, oluşturulan tarball bir kapsayıcı görüntüsünü dağıtmak için kullanılır.

Bir .NET uygulamasını bir tarball'a kapsayıcı olarak yayımlamak için aşağıdaki komutu kullanın:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerArchiveOutputPath=./images/container-image.tar.gz

Yukarıdaki komut, uygulamayı bir kapsayıcı olarak tarball'da yayımlar:

  • Linux'u işletim sistemi olarak hedefleme (--os linux).
  • Bir x64 mimarisi belirtme (--arch x64).
  • ContainerArchiveOutputPath özelliğini ./images/container-image.tar.gzolarak ayarlama.

Komut, çalışan bir OCI uyumlu daemon gerektirmez. Daha fazla bilgi için bkz. ContainerArchiveOutputPath.

Tarball'ı yükle

Tarball'a dışarı aktarmaya yönelik yaygın bir kullanım örneği, güvenlik odaklı kuruluşlar içindir. Kapsayıcılar oluşturur, bunları tarball dosyaları olarak dışa aktarır ve daha sonra bu dosyalar üzerinde güvenlik tarama araçlarını çalıştırır. Bu yaklaşım, canlı bir sistemi taramanın karmaşıklıklarını önlediğinden uyumluluğu basitleştirir.

Tarball kapsayıcının tamamını içerir ve uygun araç kullanılarak yüklenebilir:

  • Docker: docker load -i ./images/container-image.tar.gz
  • podman:

.NET uygulamasını kapsayıcı kayıt defterine yayımlama

Kapsayıcı kayıt defterleri, kapsayıcı görüntülerini depolayan ve yöneten hizmetlerdir. Konteyner görüntülerini birden çok ortamda depolamak ve dağıtmak için kullanılır. Aşağıdaki komutu kullanarak bir .NET uygulamasını kapsayıcı olarak kapsayıcı kayıt defterine yayımlayabilirsiniz:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerRegistry=ghcr.io

Önceki kod, uygulamayı bir kapsayıcı olarak bir kapsayıcı kayıt defterine yayımlar.

  • Linux'u işletim sistemi olarak hedefleme (--os linux).
  • Bir x64 mimarisi belirtme (--arch x64).
  • ContainerRegistry özelliğini ghcr.ioolarak ayarlama.

Daha fazla bilgi için ContainerRegistrybölümüne bakın.

Kaynakları temizleme

Bu makalede, bir .NET çalışanını kapsayıcı görüntüsü olarak yayımladınız. İsterseniz bu kaynağı silin. Yüklü görüntülerin listesini görmek için docker images komutunu kullanın.

docker images

Aşağıdaki örnek çıkışı göz önünde bulundurun:

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image    1.0.0     25aeb97a2e21   12 seconds ago   191MB

Bahşiş

Görüntü dosyaları büyük olabilir. Genellikle uygulamanızı test ederken ve geliştirirken oluşturduğunuz geçici kapsayıcıları kaldırırsınız. Bu çalışma zamanını temel alan başka görüntüler derlemeyi planlıyorsanız, genellikle temel görüntüleri çalışma zamanı yüklü olarak tutarsınız.

Görüntüyü silmek için görüntü kimliğini kopyalayın ve docker image rm komutunu çalıştırın:

docker image rm 25aeb97a2e21

Sonraki adımlar