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 USER
Dockerfile. 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
- Vedere le informazioni su come distribuire un'applicazione .NET Core in un contenitore.
- Vedere le informazioni su come distribuire un'applicazione ASP.NET Core in un contenitore.
- Provare l'esercitazione sulla creazione di microservizi ASP.NET Core.
- Vedere informazioni sugli strumenti per contenitori in Visual Studio