Definire i contenitori

Completato

Contoso sta eseguendo la migrazione e la virtualizzazione di diversi carichi di lavoro e può presentarsi l'opportunità di inserirne alcuni all'interno di contenitori. L'amministratore di Windows Server valuterà i contenitori, ne apprenderà il funzionamento ed esaminerà i vantaggi derivanti dall'utilizzarli. I vantaggi possono includere mobilità, agilità, e aumento dell'efficienza e della densità dei server. Tutti questi vantaggi contribuiscono a ottimizzare i carichi di lavoro dei server e la coerenza degli ambienti di sviluppo.

Che cosa sono i contenitori?

Un contenitore si usa per creare il pacchetto di un'applicazione insieme a tutte le relative dipendenze e astrarlo dal sistema operativo host in cui verrà eseguito. I contenitori offrono un ambiente di sviluppo e di runtime leggero, in cui le applicazioni possono essere eseguite e condivise facilmente durante lo sviluppo. Un contenitore è isolato non solo dal sistema operativo host, ma anche dagli altri contenitori. I contenitori isolati forniscono un runtime virtuale, contribuendo anche a migliorare la sicurezza e l'affidabilità delle app eseguite al loro interno.

Tradizionalmente, un'applicazione software viene sviluppata per l'esecuzione in uno specifico sistema operativo e con specifici processori e componenti hardware. Perché possa supportare piattaforme di runtime diverse, in genere è necessario scrivere codice aggiuntivo. Visto il numero elevato di sistemi di elaborazione presenti sul mercato, sono necessari una piattaforma di gestione e uno sviluppo del software più efficienti per supportare la portabilità tra più ambienti di elaborazione. I contenitori consentono di offrire questa portabilità.

Vantaggi dell'uso dei contenitori

Ecco alcuni vantaggi offerti dall'uso dei contenitori:

  • Possono essere eseguiti ovunque. I contenitori possono essere eseguiti su diverse piattaforme, ad esempio sistemi operativi Linux, Windows e Mac. È possibile ospitarli in una workstation locale, nei server di data center locali o effettuarne il provisioning nel cloud.

  • Isolamento. Per un'applicazione, un contenitore appare come un sistema operativo completo. Le risorse di CPU, memoria, archiviazione e rete sono virtualizzate all'interno del contenitore e isolate dalla piattaforma host e da altre applicazioni.

  • Maggiore efficienza. I contenitori possono essere distribuiti, aggiornati e ridimensionati rapidamente per supportare un ciclo di vita di sviluppo, test e produzione più agile. Poiché sono più efficienti in termini di risorse utilizzate, hanno un footprint ridotto, che consente una maggiore densità nei server.

  • Un ambiente di sviluppo coerente. Gli sviluppatori usano i contenitori come un ambiente di sviluppo coerente e prevedibile che supporta svariati linguaggi di sviluppo, ad esempio Java, .NET, Python e Node.js. Gli sviluppatori sanno che, indipendentemente da dove verrà distribuita l'applicazione, il contenitore assicurerà che funzioni come previsto.

Funzionamento dei contenitori

Il processore in un computer Windows standard dispone di due modalità diverse: una modalità kernel e una modalità utente. I componenti di base del sistema operativo e la maggior parte dei driver di dispositivo vengono eseguiti in modalità kernel, mentre le applicazioni vengono eseguite in modalità utente.

Quando si installa la tecnologia dei contenitori in un computer, ogni contenitore crea un silo isolato e leggero, che viene usato per l'esecuzione di un'app nel sistema operativo host. Per ottenere l'accesso al file system e al Registro di sistema, un contenitore si basa sul kernel del sistema operativo host, di cui condivide la maggior parte.

Ogni contenitore dispone di una copia dei file di sistema della modalità utente, che sono isolati dagli altri contenitori e dall'ambiente in modalità utente dell'host. L'isolamento della modalità utente è reso possibile mediante un'immagine di base del contenitore, che è costituita dai file di sistema in modalità utente necessari per supportare un'app in pacchetto. I modelli di immagine di base del contenitore offrono un livello essenziale dei servizi del sistema operativo usati dall'app nel contenitore che non sono forniti dal livello kernel dell'host oppure sono limitati.

Il livello in cui vengono apportate le modifiche alle applicazioni e al codice risiede in questi livelli di immagine del sistema operativo di base del contenitore predefiniti. Questi livelli del sistema operativo di base vengono sviluppati e aggiornati separatamente rispetto ai livelli del contenitore usati attivamente per le modifiche alle applicazioni o al codice. I livelli di base vengono scaricati nell'ambiente di lavoro locale senza essere aggiornati, quindi il lavoro viene avviato nei livelli del contenitore eseguiti sui livelli di base. Questo rende l'ambiente di sviluppo più piccolo, più leggero e più portabile.

Diagramma che mostra un livello contenitore di esempio impostato con livelli in uno stack nell'ordine seguente dal basso verso l'alto: livello del sistema operativo di base, livello IIS, livello ASP.NET e livello del sito Web.

Quando si compila un'immagine del contenitore personalizzata per ospitare l'applicazione, si inizia sfruttando un'immagine del sistema operativo di base del contenitore o un'immagine del contenitore predefinita con le dipendenze necessarie. Oltre a questi livelli, si creano livelli personalizzati con l'applicazione che si vuole eseguire in un contenitore. Ogni operazione per creare l'immagine del contenitore si basa sull'ultima. Questa operazione viene aggiunta alle dimensioni dell'immagine, ma consente di separare facilmente il sistema operativo, il framework, le dipendenze e i livelli dell'applicazione.

Contenitori e microservizi

Le applicazioni di microservizi sono definite come un approccio architetturale nativo del cloud in cui una singola applicazione è costituita da molti componenti o servizi distribuibili in modo indipendente e ad accoppiamento libero e indipendente. Ognuno di questi componenti o servizi più piccoli può essere rappresentato da un contenitore. Tuttavia, i contenitori non implementano necessariamente un'architettura di microservizi.

Un contenitore può ospitare un'applicazione monolitica, ma non sono stati progettati per tale scopo. Per impostazione predefinita, Docker (o un altro runtime di contenitori) e l'agente di orchestrazione del contenitore presuppongono che un contenitore possa essere sempre eliminato/rimosso in modo sicuro e un altro contenitore possa semplicemente assumere la propria posizione, se necessario. In una macchina virtuale, se si configura un'applicazione per la scrittura nel disco della macchina virtuale, è possibile arrestare e avviare in modo sicuro la macchina virtuale e i dati verranno mantenuti nel disco, proprio come la macchina virtuale verrà avviata in modo sicuro e continuerà l'operazione. Con i contenitori, se si rimuove un contenitore e ne viene portato un altro al suo posto, saranno presenti solo i livelli esistenti dell'immagine del contenitore. In un ambiente di microservizi, questo non dovrebbe essere un problema se si verifica la persistenza dello stato e dei dati.

Anche se è possibile eseguire un contenitore e gestirlo in modo analogo a una macchina virtuale, è consigliabile adottare le procedure di separazione dello stato e dei dati e assicurarsi che il contenitore possa sostenere l'eliminazione. In questo modo sarà possibile sfruttare altre procedure, ad esempio DevOps.

In pratica, non è consigliabile archiviare dati o stati all'interno dell'immagine del contenitore e dei relativi livelli. È invece consigliabile usare l'archiviazione permanente esterna che consente a qualsiasi istanza del contenitore di accedervi.