Delen via


Een .NET-app containeriseren met dotnet publish

Containers hebben veel functies en voordelen, zoals een onveranderbare infrastructuur, die een draagbare architectuur biedt en schaalbaarheid mogelijk maakt. De afbeelding kan worden gebruikt om containers te maken voor uw lokale ontwikkelingsomgeving, privécloud of openbare cloud. In deze zelfstudie leert u hoe u een .NET-toepassing in een container kunt plaatsen met behulp van de opdracht dotnet publish zonder een Dockerfile te gebruiken. Daarnaast verkent u hoe u de containerinstallatiekopieën en uitvoering configureert en hoe u resources opschoont.

Tip

Als u geïnteresseerd bent in het gebruik van een Dockerfile- om uw .NET-app in een container te zetten, raadpleegt u Zelfstudie: Een .NET-app in een container opslaan.

Voorwaarden

Installeer de volgende vereisten:

  • .NET 8+ SDK
    Als u .NET hebt geïnstalleerd, gebruikt u de opdracht dotnet --info om te bepalen welke SDK u gebruikt.

Als u van plan bent om de container lokaal uit te voeren, hebt u een OCI-compatibele containerruntime (Open Container Initiative) nodig, zoals:

  • Docker Desktop-: meest voorkomende containerruntime.
  • Podman-: een opensource daemonless alternatief voor Docker.

Belangrijk

Met de .NET SDK worden containerinstallatiekopieën zonder Docker gemaakt. Docker of Podman zijn alleen nodig als u de afbeelding lokaal wilt uitvoeren. Wanneer u uw .NET-app als een containerinstallatiekopieën publiceert, wordt deze standaard naar een lokale containerruntime gepusht. U kunt de afbeelding ook opslaan als een tarball of deze rechtstreeks naar een containerregister pushen, zonder dat u überhaupt een containerruntime hoeft te gebruiken.

Naast deze vereisten is het raadzaam dat u bekend bent met Worker Services in .NET, aangezien het voorbeeldproject een achtergrondservice is.

.NET-app maken

U hebt een .NET-app nodig om een container in te zetten, dus begin met het maken van een nieuwe app op basis van een sjabloon. Open uw terminal, maak een werkmap (sample-directory) als u dat nog niet hebt gedaan en wijzig mappen zodat u er in bent. Voer in de werkmap de volgende opdracht uit om een nieuw project te maken in een submap met de naam Worker:

dotnet new worker -o Worker -n DotNet.ContainerImage

Jouw mapperboom ziet er ongeveer als volgt uit:

📁 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

Met de opdracht dotnet new maakt u een nieuwe map met de naam Worker en genereert u een werkrolservice die, wanneer deze wordt uitgevoerd, elke seconde een bericht registreert. Wijzig vanuit de terminalsessie mappen en navigeer naar de map Worker. Gebruik de opdracht dotnet run om de app te starten.

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

Het werkersjabloon loopt oneindig door. Gebruik de opdracht Annuleren Ctrl+C om deze te stoppen.

De naam van de containerafbeelding instellen

Er zijn verschillende configuratieopties beschikbaar bij het publiceren van een app als een container. Standaard is de naam van de containerafbeelding de AssemblyName van het project. Als die naam ongeldig is als containerimagenaam, kunt u deze overschrijven door een ContainerRepository op te geven, zoals weergegeven in het volgende projectbestand.

<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>

Zie ContainerRepositoryvoor meer informatie.

.NET-app publiceren

Als u de .NET-app als container wilt publiceren, gebruikt u de volgende opdracht dotnet publish:

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

De voorgaande .NET CLI-opdracht publiceert de app als een container:

  • Linux instellen als het besturingssysteem (--os linux).
  • Een x64-architectuur (--arch x64) opgeven.

Belangrijk

Als u de container lokaal wilt publiceren, moet er een actieve OCI-compatibele daemon worden uitgevoerd. Als deze niet wordt uitgevoerd wanneer u de app probeert te publiceren als een container, treedt er een fout op die vergelijkbaar is met de volgende:

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

De opdracht dotnet publish produceert uitvoer die vergelijkbaar is met de voorbeelduitvoer:

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

Met deze opdracht compileert u uw worker-applicatie naar de publicatiemap en pusht u de containerimages standaard naar uw lokale Docker-daemon. Als u Podman gebruikt, is er een alias

Een .NET-app publiceren naar een tarball

Een tarball (of tar-bestand) is een bestand dat andere bestanden bevat. Het eindigt meestal met een *.tar.gz samengestelde bestandsextensie om aan te geven dat het een gecomprimeerd archief is. Deze bestandstypen worden gebruikt om software te distribueren of om back-ups te maken. In dit geval wordt de gemaakte tarball gebruikt om een containerafbeelding te distribueren.

Als u een .NET-app als container wilt publiceren naar een tarball, gebruikt u de volgende opdracht:

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

De voorgaande opdracht publiceert de app als een container in een tarball.

  • Linux instellen als het besturingssysteem (--os linux).
  • Een x64-architectuur (--arch x64) opgeven.
  • Stel de eigenschap ContainerArchiveOutputPath in op ./images/container-image.tar.gz.

Voor de opdracht is geen actieve OCI-compatibele daemon vereist. Zie ContainerArchiveOutputPathvoor meer informatie.

De tarball laden

Een veelvoorkomende gebruikssituatie voor het exporteren naar een tarball is voor beveiligingsgerichte organisaties. Ze maken containers, exporteren ze als tarballen en voeren vervolgens beveiligingsscanprogramma's uit op de tarballen. Deze aanpak vereenvoudigt de naleving omdat het de complexiteit van het scannen van een live systeem vermijdt.

De tarball bevat de hele container, die vervolgens kan worden geladen met behulp van het juiste hulpprogramma:

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

.NET-app publiceren naar containerregister

Containerregisters zijn diensten waarmee containerafbeeldingen worden opgeslagen en beheerd. Ze worden gebruikt voor het opslaan en verspreiden van containerafbeeldingen in meerdere omgevingen. U kunt een .NET-app publiceren als een container naar een containerregister met behulp van de volgende opdracht:

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

De voorgaande code publiceert de app als een container naar een containerregister:

  • Linux instellen als het besturingssysteem (--os linux).
  • Een x64-architectuur (--arch x64) opgeven.
  • Stel de eigenschap ContainerRegistry in op ghcr.io.

Zie ContainerRegistry-voor meer informatie.

De resources opschonen

In dit artikel hebt u een .NET-werkrol gepubliceerd als een containerimage. Verwijder deze resource desgewenst. Gebruik de opdracht docker images om een lijst met geïnstalleerde installatiekopieën weer te geven.

docker images

Bekijk de volgende voorbeelduitvoer:

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

Tip

Afbeeldingsbestanden kunnen groot zijn. Normaal gesproken verwijdert u tijdelijke containers die u hebt gemaakt tijdens het testen en ontwikkelen van uw app. Meestal houdt u de basisafbeeldingen met de runtime geïnstalleerd als u van plan bent om andere afbeeldingen te maken op basis van die runtime.

Als u de installatiekopie wilt verwijderen, kopieert u de installatiekopie-id en voert u de opdracht docker image rm uit:

docker image rm 25aeb97a2e21

Volgende stappen