Konteneryzowanie aplikacji .NET za pomocą polecenia dotnet publish
Kontenery mają wiele funkcji i korzyści, takich jak niezmienna infrastruktura, zapewniając przenośną architekturę i umożliwiająca skalowalność. Obraz może służyć do tworzenia kontenerów dla lokalnego środowiska deweloperskiego, chmury prywatnej lub chmury publicznej. Z tego samouczka dowiesz się, jak konteneryzować aplikację .NET przy użyciu polecenia dotnet publish bez użycia pliku Dockerfile. Ponadto dowiesz się, jak skonfigurować i wykonać obraz kontenera
Napiwek
Jeśli interesuje Cię użycie
Warunki wstępne
Zainstaluj następujące wymagania wstępne:
- zestaw SDK platformy .NET 8+
Jeśli masz zainstalowaną platformę .NET, użyj poleceniadotnet --info
, aby określić, którego zestawu SDK używasz.
Jeśli planujesz uruchamianie kontenera lokalnie, potrzebujesz środowiska uruchomieniowego kontenera zgodnego z protokołem Open Container Initiative (OCI), takiego jak:
- docker Desktop: najbardziej typowe środowisko uruchomieniowe kontenera.
- Podman: bezserwerowa alternatywa dla platformy Docker typu open source.
Ważny
Zestaw .NET SDK tworzy obrazy kontenerów bez platformy Docker. Docker lub Podman są potrzebne tylko wtedy, gdy chcesz uruchomić obraz lokalnie. Domyślnie podczas publikowania aplikacji .NET jako obrazu kontenera jest przesyłany do lokalnego środowiska kontenerowego. Alternatywnie, możesz zapisać obraz jako tarball lub przesłać go bezpośrednio do rejestru kontenerów bez używania żadnego środowiska uruchomieniowego kontenera.
Oprócz tych wymagań wstępnych zaleca się zapoznanie się z usługami Worker Services na platformie .NET, ponieważ przykładowy projekt jest usługą worker.
Tworzenie aplikacji .NET
Potrzebujesz aplikacji .NET do konteneryzowania, więc zacznij od utworzenia nowej aplikacji na podstawie szablonu. Otwórz terminal, utwórz folder roboczy (przykładowy katalog), jeśli jeszcze tego nie zrobiono, i zmień katalogi, aby się w nim znajdować. W folderze roboczym uruchom następujące polecenie, aby utworzyć nowy projekt w podkatalogu o nazwie Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
Drzewo folderów wygląda podobnie do następującego katalogu:
📁 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
Polecenie dotnet new
tworzy nowy folder o nazwie Worker i generuje usługę roboczą, która, gdy jest uruchomiona, rejestruje komunikat co sekundę. Z poziomu sesji terminalu zmień katalogi i przejdź do folderu Worker. Użyj polecenia dotnet run
, aby uruchomić aplikację.
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...
Szablon procesu roboczego zapętla się w nieskończoność. Aby go zatrzymać, użyj polecenia anuluj Ctrl+C.
Ustawianie nazwy obrazu kontenera
Podczas publikowania aplikacji jako kontenera są dostępne różne opcje konfiguracji. Domyślnie nazwa obrazu kontenera to AssemblyName
projektu. Jeśli ta nazwa jest nieprawidłowa jako nazwa obrazu kontenera, możesz ją zastąpić, określając ContainerRepository
, jak pokazano w następującym pliku projektu:
<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.1" />
</ItemGroup>
</Project>
Aby uzyskać więcej informacji, zobacz ContainerRepository
.
Publikowanie aplikacji .NET
Aby opublikować aplikację .NET jako kontener, użyj następującego polecenia dotnet publish:
dotnet publish --os linux --arch x64 /t:PublishContainer
Poprzednie polecenie .NET CLI publikuje aplikację w formie kontenera.
- Ustawianie systemu operacyjnego Linux jako docelowego (
--os linux
). - Określanie architektury x64 (
--arch x64
).
Ważny
Aby opublikować kontener lokalnie, musisz mieć uruchomioną aktywną usługę zgodną ze standardem OCI. Jeśli nie jest uruchomiona podczas próby opublikowania aplikacji jako kontenera, wystąpi błąd podobny do następującego:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Polecenie dotnet publish
generuje dane wyjściowe podobne do przykładowych danych wyjściowych:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
To polecenie kompiluje aplikację procesu roboczego do folderu publikowania i domyślnie wypycha obraz kontenera do lokalnego demona platformy Docker. Jeśli używasz narzędzia Podman, alias
Publikowanie aplikacji .NET w tarball
Tarball (lub plik tar) to plik zawierający inne pliki. Zwykle kończy się to rozszerzeniem nazwy pliku *.tar.gz, aby pomóc wskazać, że jest to skompresowane archiwum. Te typy plików są używane do dystrybucji oprogramowania lub tworzenia kopii zapasowych. W tym przypadku utworzony tarball jest używany do dystrybucji obrazu kontenera.
Aby opublikować aplikację .NET jako kontener do tarballa, użyj następującego polecenia:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
Poprzednie polecenie publikuje aplikację jako kontener w tarball:
- Wybór systemu operacyjnego Linux jako OS (
--os linux
). - Określanie architektury x64 (
--arch x64
). - Ustawienie właściwości
ContainerArchiveOutputPath
na wartość./images/container-image.tar.gz
.
Polecenie nie wymaga uruchomionego demona zgodnego ze standardem OCI. Aby uzyskać więcej informacji, zobacz ContainerArchiveOutputPath
.
Załaduj tarball
Typowy przypadek użycia eksportowania do tarballa dotyczy organizacji skoncentrowanych na zabezpieczeniach. Tworzą kontenery, eksportują je jako tarballs, a następnie uruchamiają narzędzia do skanowania zabezpieczeń na tarballs. Takie podejście upraszcza zgodność, ponieważ pozwala uniknąć złożoności skanowania systemu na żywo.
Tarball zawiera cały kontener, który można następnie załadować z użyciem odpowiedniego narzędzia:
-
Docker:
docker load -i ./images/container-image.tar.gz
-
Podman:
podman load -i ./images/container-image.tar.gz
Publikowanie aplikacji .NET w rejestrze kontenerów
Rejestry kontenerów to usługi, które przechowują obrazy kontenerów i zarządzają nimi. Są one używane do przechowywania i dystrybuowania obrazów kontenerów w wielu środowiskach. Aplikację platformy .NET można opublikować jako kontener w rejestrze kontenerów przy użyciu następującego polecenia:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
Powyższy kod publikuje aplikację jako kontener w rejestrze kontenerów:
- Określanie wartości docelowej systemu operacyjnego Linux (
--os linux
). - Określanie architektury x64 (
--arch x64
). - Ustawienie właściwości
ContainerRegistry
na wartośćghcr.io
.
Aby uzyskać więcej informacji, zobacz ContainerRegistry.
Czyszczenie zasobów
W tym artykule opublikowano proces roboczy platformy .NET jako obraz kontenera. Jeśli chcesz, usuń ten zasób. Użyj polecenia docker images
, aby wyświetlić listę zainstalowanych obrazów.
docker images
Rozważmy następujące przykładowe dane wyjściowe:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Napiwek
Pliki obrazów mogą być duże. Zazwyczaj można usunąć tymczasowe kontenery utworzone podczas testowania i tworzenia aplikacji. Zwykle przechowujesz obrazy podstawowe ze zainstalowanym środowiskiem uruchomieniowym, jeśli planujesz tworzenie innych obrazów na podstawie tego środowiska.
Aby usunąć obraz, skopiuj identyfikator obrazu i uruchom polecenie docker image rm
:
docker image rm 25aeb97a2e21
Następne kroki
- Ogłoszenie wbudowanej obsługi kontenerów dla zestawu SDK platformy .NET
- samouczek : konteneryzowanie aplikacji platformy .NET
- obrazy kontenerów platformy .NET
- Przejrzyj usługi platformy Azure, które obsługują kontenery
- Przeczytaj o poleceniach Dockerfile
- Eksplorowanie narzędzi kontenera w programie Visual Studio