Qual è la differenza tra Docker e una VM?

Docker e macchine virtuali (VM) sono due tecnologie utilizzate nell'implementazione delle applicazioni. Nel ciclo di vita dello sviluppo del software, l'implementazione prepara l'esecuzione del codice applicativo per gli utenti finali. Docker è una piattaforma open source che gli sviluppatori utilizzano per impacchettare il software in unità standardizzate denominate container. Il container contiene sia il codice applicativo che il relativo ambiente, inclusi librerie, strumenti di sistema e runtime. Utilizzando Docker, è possibile implementare e dimensionare le applicazioni su qualsiasi macchina e garantire che il codice venga eseguito in modo coerente. Una macchina virtuale, invece, è una copia digitale di una macchina fisica. È possibile avere più macchine virtuali con i propri sistemi operativi individuali in esecuzione sullo stesso sistema operativo host. Gli sviluppatori configurano la macchina virtuale per creare l'ambiente dell'applicazione. È anche possibile eseguire container Docker su macchine virtuali.

Ulteriori informazioni su Docker »

Virtualizzazione: Docker e macchina virtuale

La virtualizzazione consente la creazione di un'istanza virtuale di risorse reali, come server e reti. Nell'informatica, la virtualizzazione consente a più istanze isolate di un componente virtualizzato di operare sul componente reale.

Ad esempio, più server virtuali potrebbero essere eseguiti su un server fisico. Una volta condivise su più istanze virtuali, le risorse reali vengono utilizzate meglio e sono più convenienti da eseguire. La virtualizzazione è alla base di una notevole quantità di sviluppo e implementazione di applicazioni.

Macchine virtuali

Come suggerisce il nome, le macchine virtuali (VM) offrono la virtualizzazione di un'intera macchina (server). Una macchina virtuale emula i componenti hardware di una macchina fisica, come CPU, memoria, scheda di interfaccia di rete, controller USB e schede audio. È possibile eseguire un sistema operativo guest e più applicazioni nell'ambiente virtuale. 

Le macchine virtuali hanno reso possibili le tecnologie cloud. In Amazon Web Services (AWS), una macchina virtuale è denominata istanza. Queste istanze cloud sono di proprietà e sotto la gestione di AWS e utilizzabili mediante API.

Ulteriori informazioni sulle istanze cloud »

Docker

Una VM consente di eseguire una macchina virtuale su qualsiasi hardware. Docker consente di eseguire un'applicazione su qualsiasi sistema operativo. Utilizza istanze dello spazio utente isolate note come container.

I container Docker dispongono di file system, struttura di dipendenze, processi e funzionalità di rete propri. L'applicazione dispone di tutto il necessario all'interno del container e può essere eseguita ovunque. La tecnologia dei container Docker utilizza direttamente le risorse del kernel del sistema operativo host sottostante. 

Quali sono altre somiglianze tra Docker e macchine virtuali?

Come tecnologie di virtualizzazione, Docker e le macchine virtuali (VM) presentano alcune somiglianze.

Immagini

I container Docker e le macchine virtuali sono entrambi creati a partire da immagini. Ogni immagine funge da schema dell'ambiente virtualizzato. Le immagini consentono agli utenti di creare e condividere ambienti coerenti senza doverli configurare ogni volta.

Un'immagine specifica tutte le risorse di sistema necessarie per eseguire le applicazioni. Ad esempio, un'immagine di VM crea i backup del sistema operativo, mentre l'immagine del container Docker crea un backup dell'ambiente applicativo.

Controllo delle versioni

È possibile creare più versioni sia delle immagini di container Docker che delle immagini di macchine virtuali per tenere traccia delle modifiche alla configurazione dell'ambiente nel corso del tempo.

Il controllo delle versioni in Docker si riferisce alla capacità di tracciare e gestire le modifiche alle immagini Docker nel tempo. Consente agli sviluppatori di tenere traccia delle diverse versioni delle loro applicazioni, ripristinare le versioni precedenti in caso di necessità e distribuire contemporaneamente versioni diverse di un'applicazione. 

In maniera analoga, il controllo delle versioni nelle macchine virtuali si riferisce al processo di tracciamento e gestione delle modifiche all'immagine della macchina virtuale nel tempo. Il controllo delle versioni delle macchine virtuali tiene traccia delle modifiche, ad esempio aggiornamenti e patch, all'hardware virtuale o alla configurazione del sistema operativo.

Portabilità

Sia le macchine virtuali che Docker sono stati progettati per risolvere le difficoltà di dover sviluppare diverse configurazioni applicative per diversi tipi di architetture sottostanti. Sebbene adottino approcci diversi, sia le immagini Docker che le immagini di VM sono altamente portabili tra architetture, tanto on-premise quanto nel cloud. 

Principali differenze tra Docker e macchina virtuale

Sia le macchine virtuali (VM) che Docker si occupano della difficoltà di eseguire applicazioni in ambienti diversi. Tuttavia, lo fanno per motivi leggermente diversi e con approcci diversi.

Obiettivo

Le macchine virtuali sono state originariamente progettate per consentire l'esecuzione di più sistemi operativi su un'unica macchina fisica. L'obiettivo è consentire agli utenti di creare un ambiente virtuale isolato dall'hardware sottostante. Le VM astraggono i dettagli hardware per semplificare l'esecuzione di applicazioni su architetture hardware diverse e utilizzare le risorse hardware in modo più efficiente.

Docker, d'altra parte, è stato progettato per fornire un modo leggero e portatile per impacchettare ed eseguire applicazioni in un ambiente isolato e riproducibile. Docker analizza i dettagli del sistema operativo per affrontare la difficoltà di implementare applicazioni in ambienti diversi, come sviluppo, test e produzione. Può essere molto difficile gestire gli aggiornamenti dell'ambiente software e mantenere la coerenza dell'ambiente in ogni suo punto, in particolare nelle organizzazioni che eseguono centinaia di applicazioni o scompongono le applicazioni in centinaia di microservizi. Docker risolve il problema attraverso la containerizzazione. 

Prodotto finale

Docker è il nome della piattaforma di container open source di proprietà e sotto la gestione della società Docker. Esistono piattaforme alternative come Podman, anche se sono molto meno diffuse; Docker è sinonimo di containerizzazione. Il container è l'artefatto, la parte utilizzabile dall'utente finale.

Una macchina virtuale è di per sé la parte utilizzabile dall'utente finale. La tecnologia non è associata a un marchio specifico. È possibile distribuire VM nei data center on-premise o accedervi mediante API come servizio cloud gestito.

Architettura

Una macchina virtuale esegue il proprio kernel e sistema operativo host, insieme alle applicazioni e alle relative dipendenze, come librerie e altri file binari. Un hypervisor esegue il coordinamento tra l'hardware (macchina o server host) e la macchina virtuale. Assegna le risorse hardware fisiche delineate durante l'avvio di un'istanza alla macchina virtuale per il suo uso esclusivo. Su un unico potente server possono esistere più macchine virtuali, gestite da un unico hypervisor, con centinaia di applicazioni in esecuzione su ciascuna di esse.

Un container Docker contiene solo le sue dipendenze. Il software Docker Engine consente la virtualizzazione in Docker. Fornisce il coordinamento tra i container in esecuzione e il sistema operativo sottostante, a prescindere che si tratti di una macchina fisica o virtuale.

Per una gestione della virtualizzazione più avanzata con Docker, utilizza Kubernetes. Ulteriori informazioni sono riportate in Qual è la differenza tra Kubernetes e Docker?

Condivisione delle risorse

Sia le macchine virtuali che i container Docker utilizzano il multiplexing di risorse o la condivisione di risorse tra istanze virtualizzate.

Le macchine virtuali richiedono anticipatamente una quantità specifica di risorse dall'hardware e continuano a occupare costantemente tale quantità finché sono in esecuzione. 

I container Docker, invece, utilizzano le risorse on demand. Anziché richiedere una quantità specifica di risorse hardware fisiche come nel caso delle macchine virtuali, richiedono semplicemente ciò di cui hanno bisogno dal singolo kernel del sistema operativo. Più container condividono lo stesso sistema operativo. I container Docker dirigono la condivisione delle risorse con i lead del kernel e possono utilizzare meno risorse di sistema rispetto a una VM. 

Sicurezza

Poiché condividono il kernel con il sistema operativo host per ridurre il consumo di risorse, i container Docker sono a rischio se il kernel presenta vulnerabilità. Tuttavia, Docker offre anche molti controlli di sicurezza avanzati.

D'altro canto, poiché una VM virtuale esegue un intero sistema operativo, c'è un ulteriore livello di isolamento durante l'esecuzione delle applicazioni. Le VM offrono una maggiore sicurezza a condizione che il sistema operativo disponga di misure di sicurezza rigorose.

Quando utilizzare Docker e macchina virtuale

I container Docker funzionano su architettura Linux e richiedono funzionalità specifiche del kernel Linux come namespace e gruppi di controllo (cgroup). Gli sviluppatori spesso eseguono la piattaforma Docker su macchine virtuali basate su Linux. Docker impacchetta il codice applicativo in container eseguibili ovunque. Gli aggiornamenti dell'ambiente vengono eseguiti una sola volta nel container. Non è necessario aggiornare l'ambiente applicativo. 

Ad esempio, è possibile avviare un'istanza in AWS e caricarla immediatamente con un'Amazon Machine Image (AMI) già preconfigurata con Docker. 

 

Tuttavia, se si deve decidere nello specifico se utilizzare una macchina virtuale (VM) o Docker per l'implementazione delle applicazioni, la soluzione dipende dai requisiti di esecuzione dell'applicazione.

Quando utilizzare una macchina virtuale

È consigliabile utilizzare una macchina virtuale se si eseguono applicazioni con questi requisiti: 

  • Dipendenze specifiche del sistema operativo
  • Requisiti di risorse hardware sostanziali
  • Necessità di impostare vari controlli nei sistemi operativi
  • Applicazioni legacy che non funzionano più su sistemi operativi moderni
  • Requisiti di sistema operativo diversi con un'unica infrastruttura fisica sottostante a disposizione

Quando usare Docker

È consigliabile utilizzare Docker quando si eseguono applicazioni con questi requisiti: 

  • Requisiti di risorse leggeri o un'architettura a microservizi
  • Un ambiente con infrastruttura fisica distribuita, inclusi server basati su cloud
  • Cicli di implementazione rapidi (perché i file Docker sono più facili da gestire rispetto alle configurazioni delle VM)
  • Necessità di scalabilità rapida

Riepilogo della differenza tra Docker e VM

 

Container Docker

VM

In cosa consiste?

Docker è una piattaforma software per creare ed eseguire container Docker. Un container Docker è un'emulazione di un'istanza dello spazio utente, la parte del sistema operativo in cui vengono eseguiti i processi dell'utente.

Un'emulazione di una macchina fisica, incluso l'hardware virtualizzato, che esegue un sistema operativo.

Virtualizzazione

Il container astrae i dettagli del sistema operativo dal codice applicativo.

La VM astrae i dettagli hardware dal codice applicativo.

Obiettivo

Astrarre i dettagli hardware e aumentare l'utilizzo dell'hardware.

Migliorare la gestione dell'ambiente applicativo e aumentare la coerenza tra più ambienti.

Gestito da

Docker Engine esegue il coordinamento tra sistema operativo e container Docker.

L'hypervisor esegue il coordinamento tra l'hardware fisico della macchina e le macchine virtuali.

Architettura

Condivide le risorse con il kernel host sottostante.

Esegue kernel e sistema operativo propri.

Condivisione delle risorse

On demand.

Una quantità fissa, impostata nei requisiti di configurazione di un'immagine di macchina virtuale.

In che modo AWS può supportare i requisiti di implementazione delle applicazioni?

Amazon Web Services (AWS) offre una gamma di servizi progettati specificamente per le macchine virtuali (VM) e la gestione di Docker:

  • Amazon Elastic Cloud Compute (Amazon EC2)  offre oltre seicento diversi tipi di istanze sicure, affidabili e scalabili. Grazie al caricamento di un modello Amazon Machine Image (AMI) è possibile ottenere un server completamente specificato per ambienti di sviluppo, test o produzione pronto all'uso in pochi minuti.
  • Amazon Elastic Container Service (Amazon ECS) è un servizio di orchestrazione di container completamente gestito che semplifica l'implementazione e il dimensionamento delle applicazioni containerizzate. I clienti possono configurare le istanze di container per accedere a un registro di immagini Docker privato all'interno di un cloud privato virtuale (VPC) o a un registro accessibile all'esterno del VPC.
  • Amazon Elastic Container Registry (Amazon ECR) consente di archiviare, condividere e implementare facilmente i container ovunque. Amazon ECR si integra con l'interfaccia a riga di comando (CLI) Docker per semplificare i flussi di lavoro di sviluppo e produzione. Ad esempio, è possibile inviare le immagini dei container ad Amazon ECR utilizzando la CLI Docker dalla propria macchina di sviluppo. Gli orchestratori di container di Amazon potranno poi estrarle direttamente per le implementazioni di produzione.
  • AWS Fargate è un servizio serverless che consente di implementare e gestire container senza la necessità di gestire un server fisico o macchine virtuali.

Comincia a sviluppare applicazioni su AWS creando un account oggi stesso.