Qual è la differenza tra Docker e una macchina virtuale (VM)?

0
249

I container Docker forniscono un servizio simile alle macchine virtuali, fornendo un ambiente isolato per applicazioni in cui eseguire, ma sono fondamentalmente due tecnologie diverse. Discuteremo le differenze e cosa rende Docker così utile.

Cosa rende Docker così utile?

Lo scopo principale di una macchina virtuale è di partizionare un server di grandi dimensioni in blocchi più piccoli. La parte importante è che isola i processi in esecuzione su ogni macchina virtuale. Ad esempio, il tuo provider di hosting potrebbe avere una macchina a 32 core e suddividerla in otto VM a 4 core che vende a clienti diversi. Ciò riduce i costi per tutti e sono ottimi se stai eseguendo molti processi o hai bisogno dell'accesso SSH completo all'hardware sottostante.

Tuttavia, se stai eseguendo solo un'app, potresti utilizzare più risorse del necessario. Per eseguire quella singola app, l'hypervisor deve avviare un intero sistema operativo guest, il che significa che la macchina a 32 core esegue otto copie di Ubuntu. Inoltre, hai un sovraccarico della macchina virtuale per ogni istanza.

Docker presenta una soluzione migliore. I container Docker offrono isolamento senza il sovraccarico delle macchine virtuali. Ogni contenitore viene eseguito nel proprio ambiente, separato da spazi dei nomi Linux, ma la parte importante è che il codice nei contenitori viene eseguito direttamente sulla macchina. Non è coinvolta alcuna emulazione o virtualizzazione.

C'è ancora un po' di sovraccarico dovuto alla rete e all'interfacciamento con il sistema host, ma le applicazioni in Docker generalmente girano vicino a velocità bare metal e sicuramente molto più veloci del tuo VPS medio. Non è necessario eseguire 8 copie di Ubuntu, solo una, il che rende economica l'esecuzione di più contenitori Docker su un host. Servizi come Elastic Container Service di AWS e Cloud Run di GCP forniscono modi per eseguire singoli container senza eseguire il provisioning di un server sottostante.

Advertisement

I contenitori raggruppano tutte le dipendenze necessarie per l'esecuzione dell'app, incluse le librerie e i binari utilizzati dal sistema operativo. Puoi eseguire un contenitore CentOS su un server Ubuntu; entrambi usano il kernel Linux e l'unica differenza sono i binari e le librerie inclusi per il sistema operativo.

La differenza principale con i container Docker è che generalmente non hai accesso SSH al container. Tuttavia, non ne hai esattamente bisogno—la configurazione è tutta gestita dal file del contenitore stesso e, se desideri apportare aggiornamenti, dovrai eseguire il push di una nuova versione del contenitore.

Poiché questa configurazione avviene tutta nel codice, ti consente di utilizzare il controllo della versione come Git per il software del tuo server. Poiché il tuo contenitore è una singola immagine, semplifica il monitoraggio di diverse build del tuo contenitore. Con Docker, il tuo ambiente di sviluppo sarà esattamente lo stesso del tuo ambiente di produzione e anche lo stesso dell'ambiente di sviluppo di tutti gli altri, alleviando il problema di “è rotto sulla mia macchina!” 8221;

Se volessi aggiungere un altro server al tuo cluster, non dovresti preoccuparti di riconfigurare quel server e reinstallare tutte le dipendenze di cui hai bisogno. Una volta creato un contenitore, puoi facilmente creare un centinaio di istanze di quel contenitore, senza che sia necessaria molta configurazione. Ciò consente anche un ridimensionamento automatico molto semplice, che può farti risparmiare un sacco di soldi.

Svantaggi di Docker

Naturalmente, Docker non sostituirà le macchine virtuali in tempi brevi. Sono due tecnologie diverse e le macchine virtuali hanno ancora molti vantaggi.

La rete è generalmente più coinvolta. Su una macchina virtuale, di solito hai hardware di rete dedicato esposto direttamente a te. Puoi configurare facilmente i firewall, impostare le applicazioni per l'ascolto su determinate porte ed eseguire carichi di lavoro complessi come il bilanciamento del carico con HAProxy. Su Docker, poiché tutti i contenitori vengono eseguiti sullo stesso host, questo è spesso un po' più complicato. Di solito, però, servizi specifici per container come Elastic Container Service di AWS e Cloud Run di GCP forniranno questa rete come parte del loro servizio.

Pubblicità

Prestazioni su dispositivi non nativi. sistemi operativi è ancora alla pari con le macchine virtuali. Non è possibile eseguire un contenitore Linux su un computer host Windows, quindi Docker per Windows utilizza effettivamente un sottosistema Windows per VM Linux per gestire i contenitori in esecuzione. In questo caso, Docker fornisce essenzialmente uno strato di astrazione sopra la macchina virtuale.

Anche i dati persistenti sono un po' complicati. I container Docker sono progettati per essere apolidi. Questo può essere risolto con montaggi di volumi, che montano una directory sull'host sul contenitore e servizi come ECS consentono di montare volumi condivisi. Tuttavia, non batte la memorizzazione dei dati su un normale server e non vorrai davvero provare a eseguire un database di produzione in Docker.