Introduzione a .NET e Docker

I contenitori sono uno dei modi più diffusi per distribuire e ospitare applicazioni cloud, con strumenti come Docker, Kubernetes e Podman. Molti sviluppatori scelgono i contenitori perché è semplice creare un pacchetto di un'app con le relative dipendenze e fare in modo che l'app venga eseguita in modo affidabile in qualsiasi host contenitore. È disponibile un ampio supporto per l'uso di .NET con contenitori.

Docker offre un'ottima panoramica dei contenitori. Docker Desktop: Community Edition è un ottimo strumento per usare i contenitori nel computer desktop per sviluppatori.

Immagini .NET

Le immagini del contenitore ufficiali .NET vengono pubblicate nel Registro artefatti Microsoft e sono individuabili in Docker Hub. Sono disponibili immagini di runtime per la produzione e immagini SDK per la creazione di codice per Linux (Alpine, Debian, Ubuntu, Mariner) e Windows. Per altre informazioni, vedere immagini del contenitore .NET.

Le immagini .NET vengono aggiornate regolarmente ogni volta in cui viene pubblicata una nuova patch .NET o quando viene aggiornata un'immagine di base del sistema operativo.

Le immagini del contenitore create in Chisel sono immagini del contenitore Ubuntu con un set minimo di componenti richiesti dal runtime .NET. Queste immagini sono inferiori di circa 100 MB rispetto alle normali immagini Ubuntu e hanno meno CVE perché presentano meno componenti. In particolare, non contengono una shell o una gestione pacchetti, che migliora significativamente il profilo di sicurezza. Includono anche un utente non radice e sono configurate con tale utente abilitato.

Creazione di immagini del contenitore

È possibile creare un'immagine del contenitore con un Dockerfile o fare affidamento su .NET SDK per produrre un'immagine. Per esempi sulla creazione di immagini, vedere dotnet/dotnet-docker e dotnet/sdk-container-builds.

L'esempio seguente illustra la compilazione e l'esecuzione di un'immagine del contenitore in pochi rapidi passaggi (supportate con .NET 8 e .NET 7.0.300).

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init è una nuova opzione per gli sviluppatori che vogliono usare Dockerfile.

Porti

Il mapping delle porte è una parte fondamentale dell'uso dei contenitori. Le porte devono essere pubblicate all'esterno del contenitore per rispondere alle richieste Web esterne. Immagini del contenitore ASP.NET Core cambiate in .NET 8 per l'ascolto sulla porta 8080, per impostazione predefinita. Ascolto di .NET 6 e 7 sulla porta 80.

Nell'esempio precedente con docker run, la porta host 8000 viene mappata alla porta del contenitore 8080. Kubernetes funziona in modo simile.

Le variabili di ambiente ASPNETCORE_HTTP_PORTS, ASPNETCORE_HTTPS_PORTS e ASPNETCORE_URLS possono essere usate per configurare questo comportamento.

Utenti

A partire da .NET 8, tutte le immagini includono un utente non radice denominato app. Per impostazione predefinita, le immagini create in Chisel sono configurate con questo utente abilitato. L'app di pubblicazione come funzionalità contenitore .NET (illustrata nella sezione Compilazione di immagini del contenitore) configura anche le immagini con questo utente abilitato per impostazione predefinita. In tutti gli altri scenari, l'utente app può essere impostato manualmente, ad esempio con l'istruzione USERDockerfile. Se un'immagine è stata configurata con app e i comandi devono essere eseguiti come root, l'istruzione USER può essere usata per impostare l'utente su root.

Rimanere sempre aggiornati

Le notizie relative ai contenitori vengono pubblicate nelle discussioni dotnet/dotnet-docker e nella categoria "contenitori" del blog .NET.

Servizi di Azure

Diversi servizi di Azure consentono l'uso di contenitori. È possibile creare un'immagine Docker per un'applicazione e distribuirla in uno dei servizi seguenti:

  • Servizio Azure Kubernetes (AKS)
    È possibile ridimensionare e orchestrare contenitori Windows e Linux usando Kubernetes.

  • Servizio app di Azure
    Permette di distribuire app Web o API usando contenitori in un ambiente platform as a service.

  • App contenitore di Azure
    Consente di eseguire i carichi di lavoro dei contenitori senza gestire server, orchestrazione o infrastruttura e sfruttare il supporto nativo per Dapr e KEDA per l'osservabilità e il ridimensionamento a zero.

  • Istanze di Azure Container
    È possibile creare singoli contenitori nel cloud senza servizi di gestione generali.

  • Azure Batch
    Consente di eseguire processi di calcolo ripetitivi usando contenitori.

  • Azure Service Fabric
    Consente di trasferire in modalità lift-and-shift e modernizzare le applicazioni .NET trasformandole in microservizi tramite contenitori Windows e Linux.

  • Registro Azure Container
    Consente di archiviare e gestire immagini dei contenitori per tutti i tipi di distribuzioni di Azure.

Passaggi successivi