Creare un'app .NET Core in contenitori

Si applica a: Windows Server 2022, Windows Server 2019, Windows Server 2016

Questo argomento descrive come creare il pacchetto di un'app .NET di esempio esistente per la distribuzione come contenitore Windows, dopo avere configurato l'ambiente come descritto in Introduzione: Preparare Windows per i contenitori ed eseguire il primo contenitore come descritto in Eseguire il primo contenitore Windows.

È anche necessario aver installato il sistema di controllo del codice sorgente Git nel computer. Per installarlo, visitare Git.

Clonare il codice di esempio da GitHub

Tutto il codice sorgente di esempio del contenitore è disponibile nel repository GIT Virtualization-Documentation nella cartella denominata windows-container-samples.

  1. Aprire una sessione di PowerShell e passare alla cartella in cui si vuole archiviare il repository. Funzionano anche altri tipi di finestra del prompt dei comandi, ma i comandi di questo esempio usano PowerShell.

  2. Clonare il repository nella directory di lavoro corrente:

    git clone https://github.com/MicrosoftDocs/Virtualization-Documentation.git
    
  3. Passare alla directory di esempio disponibile in Virtualization-Documentation\windows-container-samples\asp-net-getting-started e creare un documento Dockerfile, usando i comandi seguenti.

    Un Dockerfile è come un makefile, ovvero un elenco di istruzioni che indicano al motore dei contenitori come compilare l'immagine del contenitore.

    # 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
    

Scrivere il Dockerfile

Aprire il Dockerfile appena creato con l'editor di testo preferito e quindi aggiungere il contenuto seguente:

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

Verrà scomposto riga per riga e verrà fornita una spiegazione per ogni istruzione.

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

Il primo gruppo di righe dichiara quale immagine di base verrà usata per compilare il contenitore. Se nel sistema locale non è ancora presente questa immagine, Docker proverà a recuperarla automaticamente. mcr.microsoft.com/dotnet/core/sdk:2.1 è incluso in .NET Core 2.1 SDK, quindi questa operazione verrà eseguita dall'attività di creazione di progetti ASP .NET Core destinati alla versione 2.1. L'istruzione successiva modifica la directory di lavoro nel contenitore in modo che tutti /appi comandi seguenti vengano eseguiti in questo contesto.

COPY *.csproj ./
RUN dotnet restore

Queste istruzioni copiano quindi i file con estensione csproj nella directory /app del contenitore build-env. Una volta copiato il file, ne verrà eseguita la lettura tramite .NET, che in seguito recupererà tutte le dipendenze e gli strumenti necessari per il progetto.

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

Dopo che .NET ha completato il pull di tutte le dipendenze nel contenitore build-env, l'istruzione successiva copia tutti i file di origine del progetto nel contenitore. Viene quindi indicato a .NET di pubblicare l'applicazione con una configurazione di rilascio e si specifica il percorso di output in.

La compilazione dovrebbe avere esito positivo. A questo punto è necessario compilare l'immagine finale.

Suggerimento

Questa guida di avvio rapido compila un progetto .NET Core dall'origine. Quando si compilano immagini del contenitore, è consigliabile includere solo il payload di produzione e le relative dipendenze nell'immagine del contenitore. Questo per evitare che .NET Core SDK sia incluso nell'immagine finale, in quanto è necessario solo il runtime di .NET Core. Viene quindi eseguita la scrittura nel dockerfile affinché venga usato un contenitore temporaneo incluso in un pacchetto con l'SDK denominato build-env per compilare l'app.

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

Poiché si tratta di un'applicazione ASP.NET, specificare un'immagine con il runtime incluso. Copiare quindi nel contenitore finale tutti i file nella directory di output del contenitore temporaneo. Il contenitore viene configurato per l'esecuzione con la nuova app come punto di ingresso all'avvio del contenitore

È stata eseguita la scrittura del Dockerfile per l'esecuzione di una compilazione a più fasi. Quando viene eseguito il Dockerfile, verrà usato il contenitore temporaneo, build-env, con .NET Core 2.1 SDK per compilare l'app di esempio e quindi verranno copiati i file binari restituiti in un altro contenitore contenente solo il runtime di .NET Core 2.1, in modo da ridurre al minimo le dimensioni del contenitore finale.

Compilare ed eseguire l'app

Dopo la scrittura del Dockerfile, è possibile puntare Docker verso il Dockerfile e comunicargli di compilare ed eseguire l'immagine:

  1. In una finestra del prompt dei comandi passare alla directory in cui risiede il Dockerfile, quindi eseguire il comando docker build per compilare il contenitore dal Dockerfile.

    docker build -t my-asp-app .
    
  2. Per eseguire il contenitore appena compilato, eseguire il comando docker run.

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

    Ora verrà analizzato questo comando:

    • -d indica a Docker di eseguire il contenitore 'scollegato', ovvero senza alcuna console collegata alla console all'interno del contenitore. Il contenitore viene eseguito in background.
    • -p 5000:80 indica a Docker di eseguire il mapping della porta 5000 nell'host alla porta 80 nel contenitore. Ogni contenitore ottiene il proprio indirizzo IP. ASP .NET rimane in ascolto per impostazione predefinita sulla porta 80. Il mapping delle porte consente di passare all'indirizzo IP dell'host tramite la porta mappata e Docker inoltrerà tutto il traffico alla porta di destinazione all'interno del contenitore.
    • --name myapp indica a Docker di assegnare a questo contenitore un nome intuitivo per l'esecuzione di query, per evitare di dover cercare l'ID contenitore assegnato in fase di esecuzione da Docker.
    • my-asp-app è l'immagine che Docker dovrà eseguire. Si tratta dell'immagine del contenitore generata nel corso del processo docker build.
  3. Aprire un Web browser e passare a http://localhost:5000 per visualizzare l'applicazione in contenitori, come illustrato in questo screenshot:

    Pagina Web di ASP.NET Core, in esecuzione da localhost in un contenitore

Passaggi successivi

  1. Il passaggio successivo consiste nel pubblicare l'app Web ASP.NET in contenitori in un registro privato usando il Registro Azure Container. Questo ne consentirà la distribuzione all'interno dell'organizzazione.

    Quando si arriva alla sezione in cui si esegue il push dell'immagine del contenitore nel registro, specificare il nome dell'app ASP.NET di cui è stato creato il pacchetto (my-asp-app) insieme al registro contenitori (ad esempio: contoso-container-registry):

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

    Per visualizzare altri esempi di app e i dockerfile associati corrispondenti, vedere Esempi di contenitori aggiuntivi.

  2. Dopo aver pubblicato l'app nel registro contenitori, il passaggio successivo consiste nel distribuire l'app in un cluster Kubernetes creato con il servizio Azure Kubernetes.