Docker non è una metodologia di virtualizzazione. Si basa su altri strumenti che implementano effettivamente la virtualizzazione basata su container o la virtualizzazione a livello di sistema operativo. Per questo, Docker inizialmente utilizzava il driver LXC, quindi si spostava su libcontainer che ora è stato rinominato come runc. Docker si concentra principalmente sull'automazione della distribuzione di applicazioni all'interno di contenitori di applicazioni. I contenitori di applicazioni sono progettati per impacchettare ed eseguire un singolo servizio, mentre i contenitori di sistema sono progettati per eseguire più processi, come le macchine virtuali. Pertanto, Docker è considerato uno strumento di gestione dei container o di distribuzione delle applicazioni su sistemi containerizzati.
Per sapere come è diverso dalle altre virtualizzazioni, passiamo alla virtualizzazione e ai suoi tipi. Quindi, sarebbe più facile capire qual è la differenza lì.
virtualizzazione
Nella sua forma concepita, è stato considerato un metodo di divisione logica dei mainframe per consentire l'esecuzione simultanea di più applicazioni. Tuttavia, lo scenario è cambiato drasticamente quando le aziende e le comunità open source sono state in grado di fornire un metodo per gestire le istruzioni privilegiate in un modo o nell'altro e consentire l'esecuzione simultanea di più sistemi operativi su un singolo sistema basato su x86.
hypervisor
L'hypervisor gestisce la creazione dell'ambiente virtuale su cui operano le macchine virtuali guest. Supervisiona i sistemi guest e si assicura che le risorse siano allocate agli ospiti secondo necessità. L'hypervisor si trova tra la macchina fisica e le macchine virtuali e fornisce servizi di virtualizzazione alle macchine virtuali. Per realizzarlo, intercetta le operazioni del sistema operativo guest sulle macchine virtuali ed emula l'operazione sul sistema operativo della macchina host.
Il rapido sviluppo delle tecnologie di virtualizzazione, principalmente nel cloud, ha spinto ulteriormente l'uso della virtualizzazione consentendo la creazione di più server virtuali su un singolo server fisico con l'aiuto di hypervisor, come Xen, VMware Player, KVM, ecc., E integrazione del supporto hardware nei processori di materie prime, come Intel VT e AMD-V.
Tipi di virtualizzazione
Il metodo di virtualizzazione può essere classificato in base al modo in cui imita l'hardware a un sistema operativo guest ed emula un ambiente operativo guest. In primo luogo, esistono tre tipi di virtualizzazione:
- Emulazione
- paravirtualizzazione
- Virtualizzazione basata su container
Emulazione
L'emulazione, nota anche come virtualizzazione completa, esegue il kernel del sistema operativo della macchina virtuale interamente nel software. L'hypervisor utilizzato in questo tipo è noto come hypervisor di tipo 2. È installato nella parte superiore del sistema operativo host che è responsabile della traduzione del codice del kernel del SO guest in istruzioni software. La traduzione viene eseguita interamente in software e non richiede alcun coinvolgimento hardware. L'emulazione consente di eseguire qualsiasi sistema operativo non modificato che supporti l'ambiente da emulare. L'aspetto negativo di questo tipo di virtualizzazione è un sovraccarico di risorse di sistema aggiuntivo che porta a una riduzione delle prestazioni rispetto ad altri tipi di virtualizzazioni.
Esempi in questa categoria includono VMware Player, VirtualBox, QEMU, Bochs, Parallels, ecc.
paravirtualizzazione
La paravirtualizzazione, nota anche come hypervisor di tipo 1, viene eseguita direttamente sull'hardware o "bare metal" e fornisce servizi di virtualizzazione direttamente alle macchine virtuali in esecuzione su di esso. Aiuta il sistema operativo, l'hardware virtualizzato e l'hardware reale a collaborare per ottenere prestazioni ottimali. Questi hypervisor in genere hanno un ingombro piuttosto ridotto e non richiedono essi stessi risorse estese.
Esempi in questa categoria includono Xen, KVM, ecc.
Virtualizzazione basata su container
La virtualizzazione basata su container, nota anche come virtualizzazione a livello di sistema operativo, consente l'esecuzione multipla di esecuzioni all'interno di un singolo kernel del sistema operativo. Ha le migliori prestazioni e densità possibili e offre una gestione dinamica delle risorse. L'ambiente di esecuzione virtuale isolato fornito da questo tipo di virtualizzazione è chiamato contenitore e può essere visualizzato come un gruppo di processi tracciati.
Il concetto di contenitore è reso possibile dalla funzione namespace aggiunta alla versione 2.6.24 del kernel Linux. Il contenitore aggiunge il proprio ID a ogni processo e aggiunge nuovi controlli di controllo dell'accesso a ogni chiamata di sistema. Vi accede dal clone () chiamata di sistema che consente di creare istanze separate di spazi dei nomi precedentemente globali.
Gli spazi dei nomi possono essere utilizzati in molti modi diversi, ma l'approccio più comune è quello di creare un contenitore isolato che non abbia visibilità o accesso agli oggetti all'esterno del contenitore. I processi in esecuzione all'interno del contenitore sembrano essere in esecuzione su un normale sistema Linux sebbene condividano il kernel sottostante con processi situati in altri spazi dei nomi, lo stesso per altri tipi di oggetti. Ad esempio, quando si utilizzano gli spazi dei nomi, l'utente root all'interno del contenitore non viene trattato come root all'esterno del contenitore, aggiungendo ulteriore sicurezza.
Il sottosistema Linux Control Groups (cgroups), il prossimo componente principale per abilitare la virtualizzazione basata su container, viene utilizzato per raggruppare i processi e gestirne il consumo aggregato di risorse. È comunemente usato per limitare il consumo di memoria e CPU dei container. Poiché un sistema Linux containerizzato ha un solo kernel e il kernel ha piena visibilità nei container, esiste solo un livello di allocazione e pianificazione delle risorse.
Sono disponibili numerosi strumenti di gestione per container Linux, tra cui LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, ecc.
Contenitori vs macchine virtuali
A differenza di una macchina virtuale, un contenitore non ha bisogno di avviare il kernel del sistema operativo, quindi i contenitori possono essere creati in meno di un secondo. Questa funzionalità rende la virtualizzazione basata su container unica e desiderabile rispetto ad altri approcci di virtualizzazione.
Poiché la virtualizzazione basata su container aggiunge un sovraccarico minimo o nullo al computer host, la virtualizzazione basata su container offre prestazioni quasi native
Per la virtualizzazione basata su container, non è necessario alcun software aggiuntivo, a differenza di altre virtualizzazioni.
Tutti i contenitori su una macchina host condividono lo scheduler della macchina host risparmiando risorse aggiuntive.
Gli stati del contenitore (immagini Docker o LXC) sono di dimensioni ridotte rispetto alle immagini della macchina virtuale, quindi le immagini del contenitore sono facili da distribuire.
La gestione delle risorse nei container è ottenuta tramite cgroups. I cgroups non consentono ai contenitori di consumare più risorse di quelle assegnate a loro. Tuttavia, a partire da ora, tutte le risorse della macchina host sono visibili nelle macchine virtuali, ma non possono essere utilizzate. Questo può essere realizzato eseguendo top
ohtop
su contenitori e macchine host contemporaneamente. L'output in tutti gli ambienti sarà simile.
Aggiornare:
In che modo Docker esegue i contenitori in sistemi non Linux?
Se i contenitori sono possibili a causa delle funzionalità disponibili nel kernel Linux, la domanda ovvia è come i sistemi non Linux eseguono i contenitori. Sia Docker per Mac che Windows utilizzano macchine virtuali Linux per eseguire i contenitori. Docker Toolbox utilizzato per eseguire contenitori nelle macchine virtuali Virtual Box. Ma l'ultimo Docker utilizza Hyper-V in Windows e Hypervisor.framework in Mac.
Ora, lasciami descrivere come Docker per Mac gestisce i contenitori in dettaglio.
Docker per Mac utilizza https://github.com/moby/hyperkit per emulare le funzionalità dell'hypervisor e Hyperkit utilizza hypervisor.framework nel suo nucleo. Hypervisor.framework è la soluzione hypervisor nativa di Mac. Hyperkit utilizza inoltre VPNKit e DataKit rispettivamente per la rete dello spazio dei nomi e il filesystem.
La VM Linux che Docker esegue in Mac è di sola lettura. Tuttavia, puoi bash in esso eseguendo:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Ora possiamo persino controllare la versione del kernel di questa VM:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Tutti i contenitori vengono eseguiti all'interno di questa VM.
Ci sono alcune limitazioni a hypervisor.framework. Per questo motivo Docker non espone docker0
l'interfaccia di rete in Mac. Pertanto, non è possibile accedere ai contenitori dall'host. A partire da ora, docker0
è disponibile solo all'interno della VM.
Hyper-v è l'hypervisor nativo in Windows. Stanno anche cercando di sfruttare le capacità di Windows 10 per eseguire nativamente i sistemi Linux.