Udostępnij za pośrednictwem


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 oraz jak wyczyścić zasoby.

Napiwek

Jeśli interesuje Cię użycie Dockerfile w celu konteneryzowania aplikacji platformy .NET, zobacz samouczek : konteneryzowanie aplikacji .NET.

Warunki wstępne

Zainstaluj następujące wymagania wstępne:

  • zestaw SDK platformy .NET 8+
    Jeśli masz zainstalowaną platformę .NET, użyj polecenia dotnet --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