Che cos'è Docker?
Suggerimento
Questo contenuto è un estratto dell'eBook, Architettura di microservizi .NET per applicazioni .NET containerizzati, disponibile in documentazione .NET o come PDF scaricabile gratuitamente leggibile offline.
Docker è un progetto open source per automatizzare la distribuzione delle applicazioni come contenitori portabili e autosufficienti che possono essere eseguiti nel cloud o in locale. Docker è anche un'azienda che promuove ed evolve questa tecnologia, collaborando con fornitori cloud, Linux e Windows, tra cui Microsoft.
Figura 2-2. Docker distribuisce i contenitori a tutti i livelli del cloud ibrido.
I contenitori Docker possono essere eseguiti ovunque, in locale nel data center del cliente, in un provider di servizi esterni o nel cloud, in Azure. I contenitori di immagini Docker possono essere eseguiti in modo nativo in Linux e Windows. Tuttavia, le immagini Windows possono essere eseguite solo su host Windows e immagini Linux possono essere eseguite su host Linux e host Windows (usando una macchina virtuale Linux Hyper-V, finora), dove host significa un server o una macchina virtuale.
Gli sviluppatori possono usare ambienti di sviluppo in Windows, Linux o macOS. Nel computer di sviluppo lo sviluppatore esegue un host Docker in cui vengono distribuite le immagini Docker, incluse l'app e le relative dipendenze. Gli sviluppatori che lavorano in Linux o in macOS usano un host Docker basato su Linux e possono creare immagini solo per i contenitori Linux. Gli sviluppatori che lavorano su macOS possono modificare il codice o eseguire l'interfaccia della riga di comando di Docker da macOS, ma a partire dal momento della scrittura, i contenitori non vengono eseguiti direttamente in macOS. Gli sviluppatori che lavorano in Windows possono creare immagini per contenitori Linux o Windows.
Per ospitare contenitori in ambienti di sviluppo e fornire strumenti di sviluppo aggiuntivi, Docker Desktop viene fornito per Windows o per macOS. Questi prodotti installano la macchina virtuale necessaria (l'host Docker) per ospitare i contenitori.
Per eseguire contenitori di Windows, sono disponibili due tipologie di runtime:
I contenitori di Windows Server forniscono l'isolamento delle applicazioni tramite la tecnologia di isolamento dei processi e dello spazio dei nomi. Un contenitore di Windows Server condivide un kernel con l'host contenitore e con tutti i contenitori in esecuzione nell'host.
Hyper-V I contenitori ampliano l'isolamento fornito dai contenitori di Windows Server eseguendo ogni contenitore in una macchina virtuale altamente ottimizzata. In questa configurazione il kernel dell'host contenitore non viene condiviso con i contenitori Hyper-V, offrendo un isolamento migliore.
Le immagini per questi contenitori vengono create nello stesso modo e funzionano allo stesso modo. La differenza consiste nel modo in cui il contenitore viene creato dall'immagine in esecuzione. L'esecuzione di un contenitore Hyper-V richiede un parametro aggiuntivo. Per informazioni dettagliate, vedere Hyper-V Contenitori.
Confronto tra contenitori Docker e macchine virtuali
La figura 2-3 mostra un confronto tra macchine virtuali e contenitori Docker.
Macchine virtuali | Contenitori Docker |
---|---|
Le macchine virtuali includono l'applicazione, le librerie o i file binari necessari e un sistema operativo guest completo. La virtualizzazione completa richiede più risorse rispetto alla containerizzazione. | I contenitori includono l'applicazione stessa e tutte le sue dipendenze. Tuttavia, condividono il kernel del sistema operativo con altri contenitori, in esecuzione come processi isolati nello spazio utente nel sistema operativo host. Ad eccezione dei contenitori Hyper-V, in cui ogni contenitore viene eseguito all'interno di una macchina virtuale speciale per ogni contenitore. |
figura 2-3. Confronto tra macchine virtuali tradizionali e contenitori Docker
Per le macchine virtuali, nel server host sono disponibili tre livelli di base, dal basso verso l'alto: infrastruttura, sistema operativo host e hypervisor e in cima a tutte le macchine virtuali con il proprio sistema operativo e tutte le librerie necessarie. Per Docker, il server host ha solo l'infrastruttura e il sistema operativo e, oltre a questo, il motore del contenitore, che mantiene il contenitore isolato ma condivide i servizi del sistema operativo di base.
Poiché i contenitori richiedono un numero molto inferiore di risorse( ad esempio, non hanno bisogno di un sistema operativo completo), sono facili da distribuire e iniziano rapidamente. Ciò consente di avere una densità più elevata, ovvero consente di eseguire più servizi nella stessa unità hardware, riducendo così i costi.
Come effetto collaterale dell'esecuzione nello stesso kernel, si ottiene meno isolamento rispetto alle macchine virtuali.
L'obiettivo principale di un'immagine è che rende l'ambiente (dipendenze) lo stesso in distribuzioni diverse. Ciò significa che è possibile eseguirne il debug nel computer e quindi distribuirlo in un altro computer con lo stesso ambiente garantito.
Un'immagine del contenitore è un modo per creare un pacchetto di un'app o di un servizio e distribuirlo in modo affidabile e riproducibile. Si potrebbe dire che Docker non è solo una tecnologia, ma anche una filosofia e un processo.
Quando si usa Docker, gli sviluppatori non dicono: "Funziona nel computer, perché non nell'ambiente di produzione?" Si può semplicemente dire che "Viene eseguito in Docker", perché l'applicazione Docker in pacchetto può essere eseguita in qualsiasi ambiente Docker supportato ed esegue il modo in cui è stata progettata per tutte le destinazioni di distribuzione (ad esempio Dev, QA, staging e produzione).
Una semplice analogia
Forse una semplice analogia può aiutare a comprendere il concetto di base di Docker.
Torniamo indietro nel tempo degli anni '50 per un attimo. Non c'erano elaboratori di testo, e le fotocopier sono state usate ovunque (tipo di).
Si supponga di essere responsabile del rilascio rapido di batch di lettere in base alle esigenze, di inviarli ai clienti, usando carta e buste reali, per essere recapitati fisicamente all'indirizzo di ogni cliente (non c'era alcun messaggio di posta elettronica in seguito).
A un certo punto, ci si rende conto che le lettere sono solo una raccolta ampia di paragrafi, i quali vengono prelevati e disposti in base alle esigenze e allo scopo della lettera, così si elabora un sistema per emettere lettere rapidamente, aspettandosi di ottenere un considerevole aumento.
Il sistema è semplice:
Si inizia con un mazzo di fogli trasparenti contenenti un paragrafo ciascuno.
Per rilasciare un set di lettere, si selezionano i fogli con i paragrafi necessari, quindi si impilano e si allineano in modo che sembrino e leggono bene.
Infine, si posiziona il set nella fotocopiatrice e premi start per produrre tutte le lettere necessarie.
Quindi, semplificando, questa è l'idea principale di Docker.
In Docker ogni livello è il set risultante di modifiche apportate al file system dopo l'esecuzione di un comando, ad esempio l'installazione di un programma.
Quindi, quando si "esamina" il file system dopo che il livello è stato copiato, vengono visualizzati tutti i file, inclusi nel livello quando il programma è stato installato.
Si può pensare a un'immagine come un disco rigido di sola lettura ausiliario pronto per l'installazione in un "computer" in cui il sistema operativo è già installato.
Analogamente, è possibile considerare un contenitore come il "computer" con il disco rigido dell'immagine installato. Il contenitore, proprio come un computer, può essere acceso o spento.