VM o Docker?

Come capire se hai bisogno di Docker anziché di una VM? Devi determinare cosa desideri isolare. Se hai bisogno di isolare un sistema con risorse dedicate garantite e un hardware virtuale, allora la scelta deve ricadere sulla VM. Se devi isolare applicazioni in esecuzione come processi separati del sistema, avrai bisogno di Docker.

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

Una macchina virtuale (VM) è un computer virtuale con tutti i dispositivi virtuali e un'unità disco virtuale, su cui viene installato un nuovo sistema operativo indipendente insieme ai driver virtuali, alla gestione della memoria e ad altri componenti. Cioè, otteniamo un'astrazione dell'hardware fisico che consente di eseguire più computer virtuali su un singolo computer.
Una VM installata può occupare spazio sul disco del computer in vari modi:

  • spazio fisso sul disco rigido, che consente un accesso più rapido all'unità disco virtuale e aiuta a evitare la frammentazione del file;
  • allocazione dinamica della memoria. Durante l'installazione di applicazioni aggiuntive, la memoria verrà allocata dinamicamente per esse fino a raggiungere il massimo consentito.

Maggiore è di macchine virtuali sul server, maggiore è lo spazio che occupano, e richiedono anche un supporto costante dell'ambiente necessario per far funzionare la tua applicazione.

Docker è un software per la creazione di applicazioni basate su container. I container e macchine virtuali presentano vantaggi simili, ma operano in modo diverso. I container occupano meno spazio poiché riutilizzano un numero maggiore di risorse condivise del sistema host rispetto alle VM, poiché, a differenza delle VM, forniscono virtualizzazione a livello di sistema operativo, e non di hardware. Questo approccio garantisce un minore utilizzo di memoria, un rapido deployment e una scalabilità più semplice.

Il contenitore offre un meccanismo di incapsulamento delle applicazioni più efficiente, fornendo le interfacce necessarie del sistema host. Questa possibilità consente ai contenitori di condividere il kernel del sistema, dove ognuno dei contenitori funge da processo separato del sistema operativo principale, avendo il proprio insieme di aree di memoria (spazio di indirizzamento virtuale proprio). Poiché lo spazio di indirizzamento virtuale di ogni contenitore è autonomo, 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), sfrutta i suoi principali vantaggi che gli consentono di organizzare la separazione del kernel. L'esecuzione dei contenitori Docker su Windows avverrà all'interno di una macchina virtuale con sistema operativo Linux, in quanto i contenitori condividono il sistema operativo del sistema host e il loro sistema operativo principale è Linux.

Contenitore - come funziona?

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

Ogni container può essere configurato tramite un file nel progetto docker-compose, incluso nella soluzione principale — docker-compose.yml. Qui possono essere impostati vari parametri come il nome del container, le porte, gli identificatori, i limiti delle risorse e le dipendenze tra altri container. Se non viene specificato un nome per il container nelle impostazioni, Docker creerà ogni volta un nuovo container assegnandogli un nome a caso.

Quando un container viene avviato dall'immagine, Docker monta il file system per la lettura e la scrittura sopra gli strati sottostanti. È qui che verranno eseguiti tutti i processi che vogliamo che il nostro container Docker esegua.

Quando Docker avvia per la prima volta un container, il livello iniziale di lettura-scrittura è vuoto. Quando si verificano modifiche, queste vengono applicate a questo livello; ad esempio, se vuoi modificare un file, quel file verrà copiato dal livello di sola lettura sottostante al livello di lettura-scrittura.
La versione del file disponibile solo in lettura continuerà a esistere, ma ora sarà nascosta sotto la copia. I volumi vengono utilizzati per memorizzare i dati, indipendentemente dal ciclo di vita del container. I volumi vengono inizializzati quando viene creato il container.

Come è legata un'immagine a un container?

Immagine — il componente principale di ogni container. L'immagine viene creata da un Dockerfile, aggiunto al progetto, e rappresenta un insieme di file system (livelli) sovrapposti e raggruppati insieme, accessibili solo in lettura; il numero massimo di livelli è 127.

Ogni immagine è basata su un'immagine di base, specificata dal comando FROM — il punto di ingresso durante la creazione dell'immagine Dockerfile. Ogni livello è un livello di sola lettura e rappresentato da un comando che modifica il file system scritto nel Dockerfile.
Per unire questi strati in un'unica immagine, Docker utilizza il file system Union multi-layered avanzato (AuFS è basato su UnionFS), consentendo a file e directory diversi di sovrapporsi in modo trasparente da diversi strati, creando un file system unificato.

Gli strati contengono metadati che permettono di mantenere informazioni associate su ogni strato durante l'esecuzione e la costruzione. Ogni strato contiene un riferimento al successivo; se uno strato non ha riferimenti, significa che è lo strato superiore nell'immagine.

Il Dockerfile può contenere comandi come:

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

Come funziona UnionFS?

UnionFS è un file system stackable (FS) per Linux e FreeBSD. Questo FS implementa un meccanismo di copia alla scrittura (Copy-On-Write, COW). L'unità di lavoro di UnionFS è lo strato, ognuno dei quali deve essere considerato come un vero e proprio file system con una gerarchia di directory a partire dalla radice. UnionFS crea un montaggio unificato per altri file system e consente di combinare file e directory di diversi file system (chiamati rami) in un unico file system coerente in modo trasparente per l'utente.

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

UnionFS combina gli strati seguendo i seguenti principi:

  • uno degli strati diventa lo strato di livello superiore, i secondi e successivi diventano strati di livello inferiore;
  • Per l'utente, gli oggetti dei livelli sono accessibili "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 l'errore "File o directory non trovati";
  • Il livello di lavoro è il "superiore", cioè tutte le azioni dell'utente per modificare i dati si riflettono solo sul livello superiore, senza influenzare il contenuto dei livelli inferiori.

Docker è la tecnologia più diffusa per l'utilizzo dei container nelle applicazioni. È diventato uno standard in questo campo, basandosi su cgroups e spazi dei nomi forniti dal kernel Linux.

Docker ci consente di distribuire rapidamente le applicazioni e di ottimizzare al massimo l'uso del filesystem grazie alla condivisione del kernel del SO tra tutti i container, funzionando come processi separati del SO.

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