Delen via


Een .NET Core-app containeriseren

Van toepassing op: Windows Server 2025, Windows Server 2022, Windows Server 2019, Windows Server 2016

In dit onderwerp wordt beschreven hoe u een bestaande .NET-voorbeeld-app inpakt voor implementatie als een Windows-container, nadat u uw omgeving hebt ingesteld zoals beschreven in Aan de slag: Windows voorbereiden voor containersen uw eerste container uitvoeren, zoals beschreven in Uw eerste Windows-container uitvoeren.

U hebt ook het Git-broncodebeheersysteem op uw computer nodig. Ga naar Git-om deze te installeren.

De voorbeeldcode klonen vanuit GitHub

Alle broncode voor containervoorbeelden wordt bewaard onder de Virtualization-Documentation Git-opslagplaats in een map met de naam windows-container-samples.

  1. Open een PowerShell-sessie en wijzig mappen in de map waarin u deze opslagplaats wilt opslaan. (Andere typen opdrachtpromptvensters werken ook, maar in onze voorbeeldopdrachten wordt PowerShell gebruikt.)

  2. Kloon de opslagplaats naar uw huidige werkmap:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Navigeer naar de voorbeeldmap die is gevonden onder Virtualization-Documentation\windows-container-samples\asp-net-getting-started en maak een Dockerfile met behulp van de volgende opdrachten.

    Een Dockerfile is als een makefile—het is een lijst met instructies die de containerengine instrueren hoe de containerafbeelding moet worden gebouwd.

    # Navigate into the sample directory
    Set-Location -Path Virtualization-Documentation\windows-container-samples\asp-net-getting-started
    
    # Create the Dockerfile for our project
    New-Item -Name Dockerfile -ItemType file
    

Het Dockerfile schrijven

Open het Dockerfile dat u zojuist hebt gemaakt met de teksteditor die u bevalt en voeg vervolgens de volgende inhoud toe:

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Laten we het opsplitsen per regel en uitleggen wat elke instructies doen.

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build-env
WORKDIR /app

De eerste groep regels geeft aan vanuit welke basisafbeelding we onze container opbouwen. Als het lokale systeem deze installatiekopieën nog niet heeft, probeert Docker deze automatisch op te halen. De mcr.microsoft.com/dotnet/core/sdk:2.1 wordt geleverd met de .NET core 2.1 SDK geïnstalleerd, dus het is aan de taak om ASP .NET Core-projecten te bouwen die gericht zijn op versie 2.1. In de volgende instructie wordt de werkmap in de container gewijzigd in /app, zodat alle opdrachten die volgen op deze, worden uitgevoerd onder deze context.

COPY *.csproj ./
RUN dotnet restore

Vervolgens kopiëren deze instructies de .csproj-bestanden naar de build-env-map in de /app-directory van de container. Na het kopiëren van dit bestand zal .NET het lezen en vervolgens alle benodigde afhankelijkheden en hulpprogramma's voor ons project ophalen.

COPY . ./
RUN dotnet publish -c Release -o out

Zodra .NET alle afhankelijkheden in de build-env container heeft opgehaald, kopieert de volgende instructie alle projectbronbestanden naar de container. Vervolgens geven we .NET aan om onze toepassing te publiceren met een releaseconfiguratie en geven we het uitvoerpad op.

De compilatie moet slagen. Nu moeten we de uiteindelijke afbeelding bouwen.

Fooi

In deze quickstart wordt een .NET Core-project gebouwd op basis van de bron. Bij het bouwen van containerafbeeldingen is het raadzaam om alleen de productiebelading en de bijbehorende afhankelijkheden in de containerafbeelding op te nemen. We willen niet dat de .NET Core SDK is opgenomen in onze uiteindelijke installatiekopieën omdat we alleen de .NET Core Runtime nodig hebben, dus de dockerfile wordt geschreven om een tijdelijke container te gebruiken die is verpakt met de SDK die build-env wordt genoemd om de app te bouwen.

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "asp-net-getting-started.dll"]

Omdat onze toepassing is gebouwd met ASP.NET, geven we een image op met deze runtime inbegrepen. Vervolgens kopiëren we alle bestanden uit de uitvoermap van onze tijdelijke container naar de uiteindelijke container. We configureren onze container voor uitvoering met onze nieuwe app als invoerpunt wanneer de container wordt gestart

We hebben het dockerfile geschreven om een build met meerdere fasen uit te voeren. Wanneer het dockerfile wordt uitgevoerd, wordt de tijdelijke container gebruikt, build-env, met de .NET core 2.1 SDK om de voorbeeld-app te bouwen en vervolgens de uitvoer binaire bestanden te kopiëren naar een andere container die alleen de .NET Core 2.1-runtime bevat, zodat de grootte van de uiteindelijke container is geminimaliseerd.

De app bouwen en uitvoeren

Met de Dockerfile geschreven, kunnen we Docker aanwijzen naar onze Dockerfile en zeggen dat deze moet worden gebouwd en vervolgens onze afbeelding uitvoeren.

  1. Navigeer in een opdrachtpromptvenster naar de map waarin het dockerfile zich bevindt en voer vervolgens de opdracht docker-build uit opdracht om de container te bouwen vanuit het Dockerfile.

    docker build -t my-asp-app .
    
  2. Als u de zojuist gebouwde container wilt uitvoeren, voert u de opdracht docker run uit.

    docker run -d -p 5000:80 --name myapp my-asp-app
    

    We gaan deze opdracht ontleden:

    • -d geeft Docker opdracht om de container 'losgekoppeld' uit te voeren, wat betekent dat er geen console is gekoppeld aan de console in de container. De container wordt op de achtergrond uitgevoerd.
    • -p 5000:80 geeft Docker opdracht om poort 5000 op de host toe te wijzen aan poort 80 in de container. Elke container krijgt een eigen IP-adres. ASP .NET luistert standaard op poort 80. Met poorttoewijzing kunnen we naar het IP-adres van de host op de toegewezen poort gaan en stuurt Docker al het verkeer door naar de doelpoort binnen de container.
    • --name myapp geeft Docker aan om deze container een handige naam te geven om een query uit te voeren (in plaats van de container-id op te zoeken die tijdens runtime door Docker is toegewezen).
    • my-asp-app is de afbeelding die Docker moet uitvoeren. Dit is de container image die wordt geproduceerd als het resultaat van het docker build proces.
  3. Open een webbrowser en navigeer naar http://localhost:5000 om uw containertoepassing te zien.

    ASP.NET Core-webpagina, uitgevoerd vanaf de localhost in een container

Volgende stappen

  1. De volgende stap is het publiceren van uw in een container geplaatste ASP.NET-web-app naar een privéregister met behulp van Azure Container Registry. Hiermee kunt u deze implementeren in uw organisatie.

    Wanneer u naar de sectie gaat waarin u uw containerinstallatiekopieën pusht naar het register, geeft u de naam op van de ASP.NET-app die u zojuist hebt verpakt (my-asp-app) samen met uw containerregister (bijvoorbeeld: contoso-container-registry):

    docker tag my-asp-app contoso-container-registry.azurecr.io/my-asp-app:v1
    

    Voor meer app-voorbeelden en de bijbehorende dockerfiles, zie aanvullende containervoorbeelden.

  2. Zodra u uw app hebt gepubliceerd in het containerregister, is de volgende stap het implementeren van de app in een Kubernetes-cluster dat u maakt met Azure Kubernetes Service.