VM o Docker?

Come capire che hai bisogno di Docker e non di una VM? Devi determinare esattamente cosa vuoi isolare. Se si vuole isolare un sistema con risorse garantite e hardware virtuale, allora la scelta dovrebbe ricadere sulla VM. Se devi isolare le applicazioni in esecuzione come processi di sistema separati, avrai bisogno di Docker.

Quindi qual è la differenza tra i container Docker e le VM?

Macchina virtuale (VM) è un computer virtuale con tutti i dispositivi virtuali e un disco rigido virtuale, su cui è installato un nuovo sistema operativo indipendente insieme a driver di dispositivi virtuali, gestione della memoria e altri componenti. Cioè, otteniamo un'astrazione dell'hardware fisico che consente di eseguire molti computer virtuali su un computer.
Una VM installata può occupare spazio su disco in diversi modi:

  • spazio su disco rigido fisso, che consente un accesso più rapido al disco rigido virtuale ed evita la frammentazione dei file;
  • allocazione dinamica della memoria. Quando si installano applicazioni aggiuntive, la memoria verrà allocata dinamicamente per esse fino a raggiungere la quantità massima assegnata.

Maggiore è il numero di macchine virtuali sul server, maggiore è lo spazio che occupano e richiedono anche il supporto costante dell'ambiente necessario per il funzionamento della tua applicazione.

docker è un software per la creazione di applicazioni basate su container. I container e le macchine virtuali hanno vantaggi simili, ma funzionano in modo diverso. I contenitori occupano meno spazio, perché utilizzare in modo eccessivo più risorse condivise del sistema host rispetto alla VM, perché a differenza di VM, fornisce la virtualizzazione a livello di sistema operativo, non hardware. Questo approccio offre un footprint di memoria inferiore, un'implementazione più rapida e una scalabilità più semplice.

Il contenitore fornisce un meccanismo più efficiente per incapsulare le applicazioni fornendo le interfacce necessarie al sistema host. Questa funzionalità consente ai contenitori di condividere il nucleo del sistema, in cui ciascuno dei contenitori viene eseguito come un processo separato del sistema operativo principale, che ha il proprio set di aree di memoria (il proprio spazio di indirizzi virtuali). Poiché lo spazio degli indirizzi virtuali di ciascun contenitore è proprio, i dati appartenenti a diverse aree di memoria non possono essere modificati.
Il sistema operativo nativo per Docker è Linux (Docker può essere utilizzato anche su Windows e MacOS), utilizza i suoi principali vantaggi, che gli consentono di organizzare un kernel diviso. Il lancio dei container Docker su Windows avverrà all'interno di una macchina virtuale Linux. i contenitori condividono il sistema operativo del sistema host e il sistema operativo principale per loro è Linux.

Contenitore: come funziona?

contenitore è un'astrazione a livello di applicazione che combina codice e dipendenze. I contenitori vengono sempre creati da immagini, aggiungendo un livello superiore scrivibile e inizializzando vari parametri. Poiché un contenitore dispone di un proprio livello di scrittura e tutte le modifiche vengono archiviate in tale livello, più contenitori possono condividere l'accesso alla stessa immagine master.

Ogni contenitore può essere configurato tramite un file nel progetto docker-compose incluso nella soluzione principale, docker-compose.yml. Lì puoi impostare vari parametri come il nome del contenitore, le porte, gli identificatori, i limiti delle risorse, le dipendenze tra altri contenitori. Se non specifichi un nome di contenitore nelle impostazioni, Docker creerà ogni volta un nuovo contenitore, assegnandogli un nome in modo casuale.

Quando un contenitore viene avviato da un'immagine, Docker monta il filesystem di lettura/scrittura sopra qualsiasi livello sottostante. Qui è dove verranno eseguiti tutti i processi che vogliamo vengano eseguiti dal nostro contenitore Docker.

Quando Docker avvia per la prima volta un contenitore, il livello di lettura/scrittura iniziale è vuoto. Quando si verificano modifiche, vengono applicate a quel livello; ad esempio, se desideri modificare un file, quel file verrà copiato dal livello di sola lettura sottostante al livello di lettura-scrittura.
La versione di sola lettura del file esisterà ancora, ma ora è nascosta sotto la copia. I volumi vengono utilizzati per archiviare i dati, indipendentemente dal ciclo di vita del contenitore. I volumi vengono inizializzati quando viene creato un contenitore.

Come viene associata l'immagine al contenitore?

Образ - l'elemento principale per ogni contenitore. L'immagine viene creata da un Dockerfile aggiunto al progetto ed è un insieme di file system (livelli) sovrapposti uno sopra l'altro e raggruppati insieme, disponibili solo per la lettura; il numero massimo di livelli è 127.

Al centro di ogni immagine c'è un'immagine di base, specificata dal comando FROM, il punto di ingresso durante la generazione di un'immagine Dockerfile. Ogni layer è di sola lettura ed è rappresentato da un singolo comando che modifica il file system, scritto in un Dockerfile.
Per combinare questi livelli in un'unica immagine, Docker utilizza il file system Union a più livelli avanzato (AuFS è basato su UnionFS), consentendo a diversi file e directory di diversi livelli di file di sovrapporsi in modo trasparente, creando un file system associato.

I livelli contengono metadati che consentono di archiviare le informazioni correlate su ciascun livello in fase di esecuzione e di compilazione. Ogni livello contiene un collegamento al livello successivo, se il livello non ha alcun collegamento, questo è il livello più in alto nell'immagine.

Dockerfile può contenere comandi come:

  • A PARTIRE DAL - punto di ingresso nella formazione dell'immagine;
  • MAINTAINER - il nome del proprietario dell'immagine;
  • RUN - esecuzione del comando durante l'assemblaggio dell'immagine;
  • AGGIUNGI - copiando il file host in una nuova immagine, se specifichi un file URL, Docker lo scaricherà nella directory specificata;
  • ENV - variabili d'ambiente;
  • CMD - avvia la creazione di un nuovo contenitore basato sull'immagine;
  • ENTRYPOINT - Il comando viene eseguito all'avvio del contenitore.
  • WORKDIR è la directory di lavoro per l'esecuzione del comando CMD.
  • USER - Imposta l'UID per il contenitore creato dall'immagine.
  • VOLUME - Monta la directory host nel contenitore.
  • EXPOSE è un insieme di porte in ascolto nel contenitore.

Come funziona UnionFS?

UnionFS - file system dello stack di servizio (FS) per Linux e FreeBSD. Questo FS implementa il meccanismo copy-on-write (Copy-On-Write, COW). L'unità di lavoro di UnionFS è un livello, ogni livello dovrebbe essere considerato come un file system completo separato con una gerarchia di directory dalla radice stessa. UnionFS crea un montaggio di unione per altri filesystem e consente di unire in modo trasparente file e directory da diversi filesystem (chiamati rami) in un unico filesystem collegato, in modo trasparente per l'utente.

I contenuti delle directory con gli stessi percorsi verranno visualizzati insieme in una directory combinata (nello stesso spazio dei nomi) del file system risultante.

UnionFS combina i livelli in base ai seguenti principi:

  • uno degli strati diventa uno strato di livello superiore, il secondo e gli strati successivi diventano strati di livello inferiore;
  • gli oggetti layer sono accessibili all'utente "dall'alto verso il basso", cioè se l'oggetto richiesto si trova nel livello "superiore", viene restituito, indipendentemente dalla presenza di un oggetto con lo stesso nome nel livello "inferiore"; in caso contrario, viene restituito l'oggetto livello "inferiore"; se l'oggetto richiesto non è né presente né presente, viene restituito l'errore "No such file or directory";
  • il livello di lavoro è quello "superiore", ovvero tutte le azioni dell'utente per modificare i dati si riflettono solo sul livello di livello superiore, senza influire sul contenuto dei livelli di livello inferiore.

Docker è la tecnologia più comune per l'utilizzo dei contenitori nel lavoro dell'applicazione. È diventato lo standard in quest'area, basandosi sui cgroup e sui namespace forniti dal kernel Linux.

Docker ci consente di distribuire rapidamente le applicazioni e sfruttare al meglio il file system condividendo il kernel del sistema operativo tra tutti i contenitori, in esecuzione come processi del sistema operativo separati.

Fonte: habr.com

Aggiungi un commento