Delen via


Visual Studio Container Tools met ASP.NET Core

Opmerking

Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.

Waarschuwing

Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.

Belangrijk

Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.

Zie de .NET 9-versie van dit artikel voor de huidige release.

Visual Studio 2017 of nieuwere versies ondersteunen het bouwen, opsporen van fouten en het uitvoeren van container-ASP.NET Core-apps die gericht zijn op .NET Core. Zowel Windows- als Linux-containers worden ondersteund.

Voorbeeldcode bekijken of downloaden (hoe download je)

Vereiste voorwaarden

Installatie en configuratie

Lees voor de installatie van Docker eerst de informatie in Docker voor Windows: wat u moet weten voordat u installeert. Installeer vervolgens Docker voor Windows.

Gedeelde schijven in Docker voor Windows moeten worden geconfigureerd om volumetoewijzing en foutopsporing te ondersteunen. Klik met de rechtermuisknop op het Docker-pictogram van het systeemvak, selecteer Instellingen en selecteer Gedeelde stations. Selecteer het station waarin Docker bestanden opslaat. Klik op Toepassen.

Dialoogvenster voor het selecteren van delen van de lokale C-schijf voor containers

Aanbeveling

Visual Studio 2017 versies 15.6 of hoger waarschuwen wanneer gedeelde stations niet zijn geconfigureerd.

Een project toevoegen aan een Docker-container

Als u een ASP.NET Core-project wilt containeriseren, moet het project zich richten op .NET Core. Linux- en Windows-containers worden ondersteund.

Wanneer u Docker-ondersteuning toevoegt aan een project, kiest u een Windows- of Linux-container. Op de Docker-host moet hetzelfde containertype worden uitgevoerd. Als u het containertype in het actieve Docker-exemplaar wilt wijzigen, klikt u met de rechtermuisknop op het Docker-pictogram van het systeemvak en kiest u Overschakelen naar Windows-containers... of overschakelen naar Linux-containers....

Nieuwe app

Wanneer u een nieuwe app maakt met de ASP.NET Core Web Application-projectsjablonen , schakelt u het selectievakje Docker-ondersteuning inschakelen in:

Vinkje Docker-ondersteuning inschakelen

Als het doelframework .NET Core is, kan in de vervolgkeuzelijst van het besturingssysteem een containertype worden geselecteerd.

Bestaande app

Voor ASP.NET Core-projecten die gericht zijn op .NET Core, zijn er twee opties voor het toevoegen van Docker-ondersteuning via de hulpprogramma's. Open het project in Visual Studio en kies een van de volgende opties:

  • Selecteer Docker-ondersteuning in het menu Project .
  • Klik met de rechtermuisknop op het project in Solution Explorer en selecteerDocker-ondersteuning>.

Visual Studio Container Tools biedt geen ondersteuning voor het toevoegen van Docker aan een bestaand ASP.NET Core-project dat gericht is op .NET Framework.

Overzicht van Dockerfile

Een Dockerfile, het recept voor het maken van een definitieve Docker-image, wordt toegevoegd aan de root van het project. Raadpleeg dockerfile-naslaginformatie voor een goed begrip van de opdrachten erin. In dit specifieke Dockerfile wordt een build met meerdere fasen gebruikt met vier afzonderlijke, benoemde buildfasen:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS base
WORKDIR /app
EXPOSE 59518
EXPOSE 44364

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

De voorgaande Dockerfile-installatiekopieën bevatten de ASP.NET Core-runtime en NuGet-pakketten. De pakketten zijn Just-In-Time (JIT) gecompileerd om de opstartprestaties te verbeteren.

Wanneer het selectievakje Configureren voor HTTPS van het nieuwe projectdialoogvenster is ingeschakeld, worden in het Dockerfile twee poorten weergegeven. Eén poort wordt gebruikt voor HTTP-verkeer; de andere poort wordt gebruikt voor HTTPS. Als het selectievakje niet is ingeschakeld, wordt één poort (80) weergegeven voor HTTP-verkeer.

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY HelloDockerTools/HelloDockerTools.csproj HelloDockerTools/
RUN dotnet restore HelloDockerTools/HelloDockerTools.csproj
COPY . .
WORKDIR /src/HelloDockerTools
RUN dotnet build HelloDockerTools.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish HelloDockerTools.csproj -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]

De voorgaande Dockerfile-installatiekopieën bevatten de ASP.NET Core NuGet-pakketten, die just-in-time (JIT) zijn gecompileerd om de opstartprestaties te verbeteren.

Ondersteuning voor containerorchestrator toevoegen aan een app

Visual Studio 2017-versies 15.7 of eerder ondersteunen Docker Compose als de enige oplossing voor containerindeling. De Docker Compose-artefacten worden toegevoegd viaDocker-ondersteuning>.

Visual Studio 2017-versies 15.8 of hoger voegen alleen een orkestratieoplossing toe op instructie. Klik met de rechtermuisknop op het project in Solution Explorer en selecteerContainer Orchestrator-ondersteuning>. De volgende opties zijn beschikbaar:

Docker Compose

Visual Studio Container Tools voegt een docker-compose-project toe aan de oplossing met de volgende bestanden:

  • docker-compose.dcproj: het bestand dat het project vertegenwoordigt. Bevat een <DockerTargetOS> element dat het besturingssysteem opgeeft dat moet worden gebruikt.
  • .dockerignore: toont de bestands- en mappatronen die moeten worden uitgesloten bij het genereren van een buildcontext.
  • docker-compose.yml: Het hoofdbestand van Docker Compose dat wordt gebruikt om de verzameling afbeeldingen te definiëren die met docker-compose build respectievelijk met docker-compose run worden gebouwd en uitgevoerd.
  • docker-compose.override.yml: Een optioneel bestand, gelezen door Docker Compose, met configuratieoverschrijvingen voor services. Visual Studio voert docker-compose -f "docker-compose.yml" -f "docker-compose.override.yml" uit om deze bestanden samen te voegen.

Het docker-compose.yml-bestand verwijst naar de naam van de image die wordt aangemaakt wanneer het project wordt uitgevoerd.

version: '3.4'

services:
  hellodockertools:
    image: ${DOCKER_REGISTRY}hellodockertools
    build:
      context: .
      dockerfile: HelloDockerTools/Dockerfile

In het voorgaande voorbeeld image: hellodockertools wordt de afbeelding hellodockertools:dev gegenereerd wanneer de app wordt uitgevoerd in de foutopsporingsmodus . De hellodockertools:latest afbeelding wordt gegenereerd wanneer de app wordt uitgevoerd in Releasemodus.

Voorzie de naam van de afbeelding van het voorvoegsel van de Docker Hub-gebruikersnaam (bijvoorbeeld dockerhubusername/hellodockertools) als de afbeelding naar het register wordt gepusht. Alternatief kunt u de naam van de afbeelding wijzigen om de privéregister-URL (bijvoorbeeld privateregistry.domain.com/hellodockertools) op te nemen, afhankelijk van de configuratie.

Als u ander gedrag wilt op basis van de buildconfiguratie (bijvoorbeeld Fouten opsporen of vrijgeven), voegt u configuratiespecifieke docker-compose-bestanden toe. De bestanden moeten worden benoemd volgens de buildconfiguratie (bijvoorbeeld docker-compose.vs.debug.yml en docker-compose.vs.release.yml) en op dezelfde locatie worden geplaatst als het docker-compose-override.yml-bestand .

Met behulp van de configuratiespecifieke overschrijfbestanden kunt u verschillende configuratie-instellingen (zoals omgevingsvariabelen of toegangspunten) opgeven voor debug- en release-build-configuraties.

Als Docker Compose een optie voor uitvoering in Visual Studio weergeeft, moet het docker-project het opstartproject zijn.

Service Fabric

Naast de basisvereisten vereist de Service Fabric-indelingsoplossing de volgende vereisten:

Service Fabric biedt geen ondersteuning voor het uitvoeren van Linux-containers in het lokale ontwikkelcluster in Windows. Als het project al een Linux-container gebruikt, wordt in Visual Studio gevraagd om over te schakelen naar Windows-containers.

De Visual Studio Container Tools voeren de volgende taken uit:

  • Hiermee voegt u een <project_name>ApplicationService Fabric-toepassingsproject toe aan de oplossing.

  • Hiermee voegt u een Dockerfile en een .dockerignore-bestand toe aan het ASP.NET Core-project. Als er al een Dockerfile bestaat in het ASP.NET Core-project, wordt de naam gewijzigd in Dockerfile.original. Er wordt een nieuw Dockerfile gemaakt dat er ongeveer als volgt uitziet:

    # See https://aka.ms/containerimagehelp for information on how to use Windows Server 1709 containers with Service Fabric.
    # FROM microsoft/aspnetcore:2.0-nanoserver-1709
    FROM microsoft/aspnetcore:2.0-nanoserver-sac2016
    ARG source
    WORKDIR /app
    COPY ${source:-obj/Docker/publish} .
    ENTRYPOINT ["dotnet", "HelloDockerTools.dll"]
    
  • Voegt een <IsServiceFabricServiceProject> element toe aan het bestand van .csproj het ASP.NET Core-project:

    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
    
  • Hiermee voegt u een PackageRoot-map toe aan het ASP.NET Core-project. De map bevat het servicemanifest en de instellingen voor de nieuwe service.

Zie Een .NET-app implementeren in een Windows-container naar Azure Service Fabric voor meer informatie.

Fouten opsporen

Selecteer Docker in de vervolgkeuzelijst voor foutopsporing in de werkbalk en start de foutopsporing van de app. In de Docker-weergave van het uitvoervenster ziet u de volgende acties die worden uitgevoerd:

  • De 2.1-aspnetcore-runtime tag van de microsoft/dotnet runtime-image wordt verkregen (als deze nog niet in de cache staat). Het image installeert de ASP.NET Core- en .NET Core-runtimes en de bijbehorende bibliotheken. Het is geoptimaliseerd voor het uitvoeren van ASP.NET Core-apps in productie.
  • De ASPNETCORE_ENVIRONMENT omgevingsvariabele wordt ingesteld op Development binnen de container.
  • Er worden twee dynamisch toegewezen poorten weergegeven: één voor HTTP en één voor HTTPS. Met de opdracht kan een query worden uitgevoerd op de docker ps poort die is toegewezen aan localhost.
  • De app wordt gekopieerd naar de container.
  • De standaardbrowser wordt gestart met het foutopsporingsprogramma dat is gekoppeld aan de container met behulp van de dynamisch toegewezen poort.

De resulterende Docker-image van de app wordt getagd als dev. De image is gebaseerd op de 2.1-aspnetcore-runtime tag van de microsoft/dotnet basisimage. Voer de docker images opdracht uit in het venster Package Manager Console (PMC). De afbeeldingen op de machine worden weergegeven.

REPOSITORY        TAG                     IMAGE ID      CREATED         SIZE
hellodockertools  dev                     d72ce0f1dfe7  30 seconds ago  255MB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago      255MB
  • De microsoft/aspnetcore runtime image wordt gedownload indien deze nog niet in de cache aanwezig is.
  • De ASPNETCORE_ENVIRONMENT omgevingsvariabele wordt ingesteld op Development binnen de container.
  • Poort 80 wordt weergegeven en toegewezen aan een dynamisch toegewezen poort voor localhost. De poort wordt bepaald door de Docker-host en kan worden opgevraagd met de docker ps opdracht.
  • De app wordt gekopieerd naar de container.
  • De standaardbrowser wordt gestart met het foutopsporingsprogramma dat is gekoppeld aan de container met behulp van de dynamisch toegewezen poort.

De resulterende Docker-image van de app wordt getagd als dev. De afbeelding is gebaseerd op de microsoft/aspnetcore basisafbeelding. Voer de docker images opdracht uit in het venster Package Manager Console (PMC). De afbeeldingen op de machine worden weergegeven.

REPOSITORY            TAG  IMAGE ID      CREATED        SIZE
hellodockertools      dev  5fafe5d1ad5b  4 minutes ago  347MB
microsoft/aspnetcore  2.0  c69d39472da9  13 days ago    347MB

Opmerking

De dev-image mist de inhoud van de app, omdat Debug-configuraties volumekoppeling gebruiken om de iteratieve ervaring te bieden. Als u een image wilt pushen, gebruikt u de Release configuratie.

Voer de docker ps opdracht uit in PMC. U ziet dat de app wordt uitgevoerd met behulp van de container:

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   21 seconds ago      Up 19 seconds       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Bewerken en doorgaan

Wijzigingen in statische bestanden en Razor weergaven worden automatisch bijgewerkt zonder dat er een compilatiestap nodig is. Breng de wijziging aan, sla deze op en vernieuw de browser om de update weer te geven.

Wijzigingen in codebestanden vereisen compilatie en opnieuw opstarten binnen Kestrel de container. Nadat u de wijziging hebt aangebracht, gebruikt CTRL+F5 u om het proces uit te voeren en de app in de container te starten. De Docker-container wordt niet opnieuw opgebouwd of gestopt. Voer de docker ps opdracht uit in PMC. U ziet dat de oorspronkelijke container al 10 minuten draait.

CONTAINER ID        IMAGE                  COMMAND                   CREATED             STATUS              PORTS                   NAMES
baf9a678c88d        hellodockertools:dev   "C:\\remote_debugge..."   10 minutes ago      Up 10 minutes       0.0.0.0:37630->80/tcp   dockercompose4642749010770307127_hellodockertools_1

Docker-installatiekopieën publiceren

Zodra de ontwikkel- en foutopsporingscyclus van de app is voltooid, helpen de Visual Studio Container Tools bij het maken van de productie-installatiekopieën van de app. Wijzig de configuratie-vervolgkeuzelijst naar Release en build de app. Het hulpprogramma haalt de compileer/publiceer-afbeelding op van Docker Hub (als deze nog niet in de cache aanwezig is). Er wordt een afbeelding geproduceerd met de meest recente tag, die naar het privéregister of Docker Hub kan worden geüpload.

Voer de docker images opdracht uit in PMC om de lijst met afbeeldingen weer te geven. Uitvoer die lijkt op het volgende wordt weergegeven:

REPOSITORY        TAG                     IMAGE ID      CREATED             SIZE
hellodockertools  latest                  e3984a64230c  About a minute ago  258MB
hellodockertools  dev                     d72ce0f1dfe7  4 minutes ago       255MB
microsoft/dotnet  2.1-sdk                 9e243db15f91  6 days ago          1.7GB
microsoft/dotnet  2.1-aspnetcore-runtime  fcc3887985bb  6 days ago          255MB
REPOSITORY                  TAG     IMAGE ID      CREATED         SIZE
hellodockertools            latest  cd28f0d4abbd  12 seconds ago  349MB
hellodockertools            dev     5fafe5d1ad5b  23 minutes ago  347MB
microsoft/aspnetcore-build  2.0     7fed40fbb647  13 days ago     2.02GB
microsoft/aspnetcore        2.0     c69d39472da9  13 days ago     347MB

De microsoft/aspnetcore-build- en microsoft/aspnetcore-afbeeldingen die in de voorgaande uitvoer worden vermeld, worden vanaf .NET Core 2.1 vervangen door microsoft/dotnet-afbeeldingen. Zie de migratieaankondiging voor Docker-opslagplaatsen voor meer informatie.

Opmerking

De docker images opdracht retourneert tussenliggende afbeeldingen met opslagplaatsnamen en tags die zijn geïdentificeerd als <none> (hierboven niet vermeld). Deze niet-benoemde installatiekopieën worden geproduceerd door de Dockerfilemet meerdere fasen. Ze verhogen de efficiëntie bij het opbouwen van de uiteindelijke afbeelding. Alleen de noodzakelijke lagen worden opnieuw opgebouwd wanneer er wijzigingen optreden. Wanneer de tussenliggende afbeeldingen niet meer nodig zijn, verwijder ze dan met de docker rmi-opdracht.

Het wordt verwacht dat de productie- of release-afbeeldingen kleiner zijn dan de ontwikkelafbeeldingen. Vanwege de volumetoewijzing werden het foutopsporingsprogramma en de app uitgevoerd vanaf de lokale computer en niet binnen de container. De meest recente installatiekopie heeft de benodigde app-code verpakt om de app uit te voeren op een hostcomputer. Daarom is de delta de grootte van de app-code.

Aanvullende bronnen