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çindotnet --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
Bu önkoşullara ek olarak, örnek proje bir çalışan olduğu için .NET
.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
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.gz
olarak 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ğinighcr.io
olarak 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
- .NET SDK için yerleşik kapsayıcı desteği duyuruldu
- Eğitim: .NET uygulamasını kapsayıcıya alma
- .NET kapsayıcı görüntülerini
- Kapsayıcıları destekleyen Azure hizmetlerini gözden geçirin
- Dockerfile komutları hakkında bilgi
- Visual Studio'de kapsayıcı araçlarını keşfetme