VM o Docker?

Come capire se hai bisogno di Docker e non di una VM? Devi determinare cosa vuoi isolare. Se è necessario isolare un sistema con risorse garantite e hardware virtuale, allora devi optare per una VM. Se devi isolare applicazioni in esecuzione come processi distinti nel sistema, avrai bisogno di Docker.

Qual è quindi la differenza tra i contenitori Docker e le VM?

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

  • spazio fisso su disco rigido, che consente un accesso più veloce al disco rigido virtuale e evita la frammentazione del file;
  • allocazione dinamica della memoria. Quando vengono installate applicazioni aggiuntive, la memoria verrà allocata dinamicamente per esse, fino a raggiungere il massimo consentito.

Più macchine virtuali sul server, più spazio occupano e richiedono supporto continuo per l'ambiente necessario al funzionamento dell'applicazione.

Docker è un software per creare applicazioni basate su contenitori. I contenitori e macchine virtuali hanno vantaggi simili, ma funzionano in modo diverso. I contenitori occupano meno spazio, poiché riutilizzano una quantità maggiore di risorse condivise del sistema host rispetto alle VM, poiché a differenza delle VM, fornisce virtualizzazione a livello di sistema operativo, non di hardware. Questo approccio garantisce un minor consumo di memoria, distribuzione rapida e scaling più semplice.

Il contenitore offre un meccanismo di incapsulamento delle applicazioni più efficace, fornendo le interfacce necessarie del sistema host. Questa possibilità consente ai contenitori di separare il kernel del sistema, dove ciascun contenitore opera come un processo separato del sistema operativo principale, con il proprio insieme di aree di memoria (spazio di indirizzamento virtuale proprio). Poiché lo spazio di indirizzamento virtuale di ciascun contenitore è esclusivo, 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), sfruttando i suoi principali vantaggi che gli consentono di organizzare la separazione del kernel. L'esecuzione dei contenitori Docker su Windows avviene all'interno di una macchina virtuale con sistema operativo Linux, poiché i contenitori separano il sistema operativo dell'host e il sistema operativo principale per loro è Linux.

Contenitore — come funziona?

Contenitore — è un'astrazione a livello applicativo che unisce codice e dipendenze. I contenitori vengono sempre creati da immagini, aggiungendo uno strato superiore scrivibile e inizializzando diversi parametri. Poiché il contenitore ha il proprio strato per la scrittura e tutte le modifiche vengono salvate in questo strato, più contenitori possono condividere l'accesso alla stessa immagine base.

Ogni contenitore può essere configurato tramite un file nel progetto docker-compose incluso nella soluzione principale — docker-compose.yml. Qui è possibile impostare vari parametri come nome del contenitore, porte, identificatori, limiti delle risorse, dipendenze tra altri contenitori. Se nelle impostazioni non è specificato il nome del contenitore, Docker creerà ogni volta un nuovo contenitore, assegnandogli un nome in modo casuale.

Quando un contenitore viene avviato da un'immagine, Docker monta il file system in lettura e scrittura sopra eventuali strati sottostanti. Qui verranno eseguiti tutti i processi che desideriamo che il nostro contenitore Docker esegua.

Quando Docker avvia per la prima volta un contenitore, lo strato iniziale di lettura-scrittura è vuoto. Quando vengono apportate modifiche, queste vengono applicate a questo strato; ad esempio, se si desidera modificare un file, quel file verrà copiato dallo strato di sola lettura sottostante allo strato di lettura e scrittura.
La versione del file accessibile solo in lettura continuerà a esistere, ma ora sarà nascosta sotto una copia. Per memorizzare i dati, indipendentemente dal ciclo di vita del contenitore, vengono utilizzati i volumi. I volumi vengono inizializzati alla creazione del contenitore.

Come è collegata l'immagine al contenitore?

Immagine — l'elemento principale per ciascun contenitore. L'immagine viene creata da un Dockerfile aggiunto al progetto e rappresenta un insieme di file system (strati) sovrapposti e raggruppati insieme, accessibili solo in lettura; il numero massimo di strati è 127.

Alla base di ogni immagine c'è un'immagine di base, specificata dal comando FROM — il punto di ingresso nella creazione dell'immagine nel Dockerfile. Ogni strato è uno strato readonly e rappresentato da un comando che modifica il file system registrato nel Dockerfile.
Per combinare questi strati in un'unica immagine, Docker utilizza il file system Union a più strati avanzato (AuFS costruito su UnionFS), consentendo a file e directory diversi provenienti da diversi strati di file di sovrapporsi in modo trasparente, creando un file system collegato.

Gli strati contengono metadati che consentono di mantenere informazioni correlate su ciascun strato durante l'esecuzione e la compilazione. Ogni strato contiene un riferimento al successivo; se uno strato non ha un riferimento, significa che è lo strato superiore nell'immagine.

Il Dockerfile può contenere comandi come:

  • FROM — punto di ingresso nella creazione dell'immagine;
  • MAINTAINER — nome del proprietario dell'immagine;
  • RUN — esegue un comando durante la creazione dell'immagine;
  • ADD — copia un file dall'host nella nuova immagine; se si specifica un URL di file, Docker lo scaricherà nella directory specificata;
  • ENV — variabili ambientali;
  • CMD — avvia la creazione di un nuovo contenitore basato sull'immagine;
  • ENTRYPOINT — il comando viene eseguito all'avvio del contenitore.
  • WORKDIR — directory di lavoro per l'esecuzione del comando CMD.
  • USER — imposta l'UID per il contenitore creato basato sull'immagine.
  • VOLUME — monta una directory dell'host nel contenitore.
  • EXPOSE — insieme di porte in ascolto nel contenitore.

Come funziona UnionFS?

UnionFS — file system di tipo stack per Linux e FreeBSD. Questo file system implementa un meccanismo di copia alla scrittura (Copy-On-Write, COW). L'unità di lavoro di UnionFS è il livello, ogni livello deve essere considerato come un vero e proprio file system autonomo con una gerarchia di directory a partire dalla radice. UnionFS crea un montaggio combinato per altri file system e consente all'utente di combinare file e directory di diversi file system (noti come rami) in un unico file system unito.

Il contenuto delle directory con percorsi identici verrà visualizzato insieme in un'unica directory combinata (in uno spazio dei nomi unificato) del file system risultante.

UnionFS combina i livelli seguendo i seguenti principi:

  • uno dei livelli diventa il livello superiore, il secondo e i livelli successivi – livelli inferiori;
  • gli oggetti dei livelli sono accessibili all'utente "dall'alto verso il basso", cioè se l'oggetto richiesto è presente nel livello "superiore", viene restituito, indipendentemente dalla presenza di un oggetto con lo stesso nome nel livello "inferiore"; altrimenti viene restituito l'oggetto del "livello inferiore"; se l'oggetto richiesto non è presente né lì né lì, viene restituito un errore "File o directory non trovati";
  • il livello di lavoro è il "superiore", cioè tutte le azioni dell'utente relative alla modifica dei dati si riflettono solo sul livello superiore, senza influenzare il contenuto dei livelli inferiori.

Docker è la tecnologia più comune per l'uso di container nel lavoro delle applicazioni. È diventato uno standard in questo campo, basandosi su cgroups e spazi dei nomi forniti dal kernel Linux.

Docker ci consente di implementare rapidamente applicazioni e di utilizzare al meglio il file system grazie alla condivisione del kernel del sistema operativo tra tutti i container, funzionando come processi separati del sistema operativo.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster