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 opdrachtdotnet --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,
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 ContainerRepository
voor 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 ContainerArchiveOutputPath
voor 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 opghcr.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
- aankondiging van ingebouwde containerondersteuning voor de .NET SDK-
- Zelfstudie: Een .NET-app in een container opnemen
- .NET-containerafbeeldingen
- Bekijk de Azure-services die ondersteuning bieden voor containers
- Meer informatie over Dockerfile-opdrachten
- De containerhulpprogramma's in Visual Studio verkennen