Cos'è Docker? La scintilla per la rivoluzione dei container

Docker è una piattaforma software per la creazione di applicazioni basate su contenitori : ambienti di esecuzione piccoli e leggeri che fanno un uso condiviso del kernel del sistema operativo, ma vengono eseguiti separatamente l'uno dall'altro. Sebbene il concetto di container sia in circolazione da un po 'di tempo, Docker, un progetto open source lanciato nel 2013, ha contribuito  a rendere popolare la tecnologia e ha contribuito a guidare la tendenza verso la containerizzazione e i microservizi nello sviluppo di software che è diventato noto come cloud-native sviluppo.

Cosa sono i contenitori?

Uno degli obiettivi dello sviluppo di software moderno è mantenere le applicazioni sullo stesso host o cluster isolate l'una dall'altra in modo che non interferiscano indebitamente con il funzionamento o la manutenzione l'una dell'altra. Questo può essere difficile, grazie ai pacchetti, alle librerie e ad altri componenti software necessari per l'esecuzione. Una soluzione a questo problema sono state le macchine virtuali, che mantengono le applicazioni sullo stesso hardware completamente separate e riducono al minimo i conflitti tra i componenti software e la concorrenza per le risorse hardware. Ma le macchine virtuali sono ingombranti, ognuna richiede il proprio sistema operativo, quindi di solito ha dimensioni gigabyte e difficili da mantenere e aggiornare.

I contenitori , al contrario, isolano gli ambienti di esecuzione delle applicazioni l'uno dall'altro, ma condividono il kernel del sistema operativo sottostante. In genere vengono misurati in megabyte, utilizzano molte meno risorse rispetto alle VM e si avviano quasi immediatamente. Possono essere impacchettati molto più densamente sullo stesso hardware e ruotati su e giù in massa con uno sforzo e un sovraccarico molto inferiori. I contenitori forniscono un meccanismo altamente efficiente e altamente granulare per combinare i componenti software nei tipi di stack di applicazioni e servizi necessari in un'impresa moderna e per mantenere tali componenti software aggiornati e mantenuti.

Docker

Cos'è Docker?

Docker è un progetto open source che semplifica la creazione di contenitori e app basate su contenitori. Creato originariamente per Linux, Docker ora funziona anche su Windows e MacOS. Per capire come funziona Docker, diamo un'occhiata ad alcuni dei componenti che useresti per creare applicazioni containerizzate Docker.

Dockerfile

Ogni contenitore Docker inizia con un Dockerfile . Un Dockerfile è un file di testo scritto in una sintassi di facile comprensione che include le istruzioni per creare un'immagine Docker (ne parleremo tra poco ). Un Dockerfile specifica il sistema operativo che sarà alla base del contenitore, insieme ai linguaggi, alle variabili ambientali, alle posizioni dei file, alle porte di rete e ad altri componenti di cui ha bisogno e, naturalmente, cosa farà effettivamente il contenitore una volta eseguito.

Paige Niedringhaus di ITNext ha una buona ripartizione della sintassi di un Dockerfile.

Immagine Docker

Dopo aver scritto il Dockerfile, richiama l' buildutilità Docker per creare un'immagine basata su quel Dockerfile. Mentre il Dockerfile è l'insieme di istruzioni che spiega buildcome creare l'immagine, un'immagine Docker è un file portatile contenente le specifiche per quali componenti software verrà eseguito il contenitore e come. Poiché un Dockerfile includerà probabilmente istruzioni su come acquisire alcuni pacchetti software da repository online, dovresti fare attenzione a specificare esplicitamente le versioni corrette, altrimenti il ​​tuo Dockerfile potrebbe produrre immagini incoerenti a seconda di quando viene richiamato. Ma una volta creata un'immagine, è statica. Codefresh offre uno sguardo su come costruire un'immagine in modo più dettagliato.

Docker eseguito

L' runutilità di Docker è il comando che avvia effettivamente un contenitore. Ogni contenitore è un'istanza di un'immagine. I contenitori sono progettati per essere temporanei e temporanei, ma possono essere arrestati e riavviati, il che avvia il contenitore nello stesso stato in cui era stato arrestato. Inoltre, più istanze di contenitori della stessa immagine possono essere eseguite contemporaneamente (a condizione che ogni contenitore abbia un nome univoco). La revisione del codice ha un'ottima suddivisione delle diverse opzioni per il runcomando, per darti un'idea di come funziona.

Docker Hub

Sebbene la creazione di contenitori sia facile, non avere l'idea di dover creare tutte le tue immagini da zero. Docker Hub è un repository SaaS per la condivisione e la gestione dei container, in cui troverai immagini Docker ufficiali da progetti open source e fornitori di software e immagini non ufficiali dal pubblico in generale. Puoi scaricare immagini del contenitore contenenti codice utile o caricarne di tue, condividerle apertamente o renderle private. Puoi anche creare un registro Docker locale, se preferisci. (Docker Hub ha avuto problemi in passato con immagini caricate con backdoor incorporate.)

Docker Engine

Docker Engine è il nucleo di Docker, la tecnologia client-server sottostante che crea ed esegue i contenitori. In generale, quando qualcuno dice genericamente Docker e non sta parlando dell'azienda o del progetto nel suo insieme, intendono Docker Engine. Sono disponibili due diverse versioni di Docker Engine: Docker Engine Enterprise e Docker Engine Community.

Docker Community Edition

Docker ha rilasciato la sua Enterprise Edition nel 2017, ma la sua offerta originale, ribattezzata Docker Community Edition, rimane open source e gratuita e non ha perso alcuna funzionalità nel processo. Invece, Enterprise Edition, che costa $ 1.500 per nodo all'anno, ha aggiunto funzionalità di gestione avanzate tra cui controlli per la gestione di cluster e immagini e monitoraggio delle vulnerabilità. Il blog BoxBoat ha una carrellata delle differenze tra le edizioni.

Come Docker ha conquistato il mondo dei container

L'idea che un determinato processo possa essere eseguito con un certo grado di isolamento dal resto del suo ambiente operativo è stata incorporata da decenni nei sistemi operativi Unix come BSD e Solaris. La tecnologia del contenitore Linux originale, LXC, è un metodo di virtualizzazione a livello di sistema operativo per l'esecuzione di più sistemi Linux isolati su un singolo host. LXC è stato reso possibile da due funzionalità di Linux: spazi dei nomi, che racchiudono un insieme di risorse di sistema e le presentano a un processo per far sembrare che siano dedicate a quel processo; e cgroups, che regolano l'isolamento e l'utilizzo delle risorse di sistema, come CPU e memoria, per un gruppo di processi.

I contenitori separano le applicazioni dai sistemi operativi, il che significa che gli utenti possono avere un sistema operativo Linux pulito e minimale ed eseguire tutto il resto in uno o più contenitori isolati. E poiché il sistema operativo viene estratto dai contenitori, è possibile spostare un contenitore su qualsiasi server Linux che supporti l'ambiente di runtime del contenitore.

Docker ha introdotto diverse modifiche significative a LXC che rendono i container più portabili e flessibili da usare. Utilizzando i contenitori Docker, è possibile distribuire, replicare, spostare ed eseguire il backup di un carico di lavoro ancora più rapidamente e facilmente di quanto non si possa fare utilizzando le macchine virtuali. Docker offre flessibilità simile al cloud a qualsiasi infrastruttura in grado di eseguire container. Anche gli strumenti di immagine del contenitore di Docker rappresentavano un progresso rispetto a LXC, consentendo a uno sviluppatore di creare librerie di immagini, comporre applicazioni da più immagini e avviare tali contenitori e applicazioni su un'infrastruttura locale o remota.

Docker Compose, Docker Swarm e Kubernetes

Docker rende anche più facile coordinare i comportamenti tra i contenitori e quindi creare stack di applicazioni collegando i contenitori insieme. Docker Compose è stato creato da Docker per semplificare il processo di sviluppo e test di applicazioni multi-container. È uno strumento da riga di comando, che ricorda il client Docker, che accetta un file descrittore formattato in modo speciale per assemblare applicazioni da più contenitori ed eseguirle insieme su un singolo host. (Guarda il tutorial di Docker Compose per saperne di più.)

Versioni più avanzate di questi comportamenti, la cosiddetta orchestrazione dei contenitori, sono offerte da altri prodotti, come Docker Swarm e Kubernetes. Ma Docker fornisce le basi. Anche se Swarm è nato dal progetto Docker, Kubernetes è diventato di fatto la piattaforma di orchestrazione Docker preferita.

Vantaggi Docker

I container Docker forniscono un modo per creare applicazioni aziendali e line-of-business più facili da assemblare, mantenere e spostare rispetto alle loro controparti convenzionali. 

I contenitori Docker consentono l'isolamento e la limitazione

I contenitori Docker mantengono le app isolate non solo l'una dall'altra, ma anche dal sistema sottostante. Questo non solo crea uno stack software più pulito, ma rende più facile stabilire in che modo una data applicazione containerizzata utilizza le risorse di sistema: CPU, GPU, memoria, I / O, rete e così via. Inoltre, rende più semplice garantire che dati e codice siano tenuti separati. (Vedi "I container Docker sono senza stato e immutabili" di seguito.)

I contenitori Docker consentono la portabilità

Un contenitore Docker viene eseguito su qualsiasi macchina che supporta l'ambiente di runtime del contenitore. Le applicazioni non devono essere collegate al sistema operativo host, quindi sia l'ambiente dell'applicazione che l'ambiente operativo sottostante possono essere mantenuti puliti e ridotti al minimo.

Ad esempio, un contenitore MySQL per Linux funzionerà sulla maggior parte dei sistemi Linux che supportano i contenitori. Tutte le dipendenze per l'app vengono in genere fornite nello stesso contenitore.

Le app basate su container possono essere spostate facilmente dai sistemi in sede agli ambienti cloud o dai laptop degli sviluppatori ai server, a condizione che il sistema di destinazione supporti Docker e uno qualsiasi degli strumenti di terze parti che potrebbero essere in uso con esso, come Kubernetes (vedi "I contenitori Docker facilitano l'orchestrazione e il ridimensionamento" di seguito).

Normalmente, le immagini del contenitore Docker devono essere create per una piattaforma specifica. Un container Windows, ad esempio, non funzionerà su Linux e viceversa. In precedenza, un modo per aggirare questa limitazione era avviare una macchina virtuale che eseguisse un'istanza del sistema operativo necessario ed eseguire il contenitore nella macchina virtuale.

Tuttavia, il team di Docker da allora ha ideato una soluzione più elegante, chiamata  manifesti , che consente di raggruppare immagini per più sistemi operativi fianco a fianco nella stessa immagine. I manifest sono ancora considerati sperimentali, ma suggeriscono come i contenitori potrebbero diventare una soluzione applicativa multipiattaforma oltre che cross-environment. 

I contenitori Docker consentono la componibilità

La maggior parte delle applicazioni aziendali è costituita da diversi componenti separati organizzati in uno stack: un server Web, un database, una cache in memoria. I contenitori consentono di comporre questi pezzi in un'unità funzionale con parti facilmente sostituibili. Ogni pezzo è fornito da un contenitore diverso e può essere mantenuto, aggiornato, sostituito e modificato indipendentemente dagli altri.

Questo è essenzialmente il modello di microservizi di progettazione dell'applicazione. Dividendo la funzionalità dell'applicazione in servizi separati e autonomi, il modello dei microservizi offre un antidoto per rallentare i processi di sviluppo tradizionali e le app monolitiche inflessibili. I contenitori leggeri e portatili semplificano la creazione e la manutenzione di applicazioni basate su microservizi.

I contenitori Docker facilitano l'orchestrazione e il ridimensionamento

Poiché i contenitori sono leggeri e impongono un sovraccarico minimo, è possibile lanciarne molti di più su un dato sistema. Ma i container possono anche essere usati per scalare un'applicazione su cluster di sistemi e per aumentare o diminuire i servizi per soddisfare i picchi di domanda o per risparmiare risorse.

La maggior parte delle versioni di livello aziendale degli strumenti per la distribuzione, la gestione e il ridimensionamento dei contenitori vengono fornite tramite progetti di terze parti. Il principale tra questi è Kubernetes di Google, un sistema per automatizzare il modo in cui i container vengono distribuiti e scalati, ma anche il modo in cui sono collegati tra loro, bilanciati e gestiti. Kubernetes fornisce anche modi per creare e riutilizzare definizioni di applicazioni multi-contenitore o "grafici Helm", in modo che gli stack di app complessi possano essere creati e gestiti su richiesta.

Docker include anche il proprio sistema di orchestrazione integrato, la modalità Swarm, che viene ancora utilizzata per i casi meno impegnativi. Detto questo, Kubernetes è diventato una delle scelte predefinite; infatti, Kubernetes è fornito in bundle con Docker Enterprise Edition.

Avvertenze Docker

I contenitori risolvono moltissimi problemi, ma non sono una panacea. Alcuni dei loro difetti sono di progettazione, mentre altri sono sottoprodotti del loro design.

I contenitori Docker non sono macchine virtuali

L'errore concettuale più comune che le persone commettono con i contenitori è quello di equipararli alle macchine virtuali. Tuttavia, poiché i contenitori e le macchine virtuali utilizzano meccanismi di isolamento diversi, presentano vantaggi e svantaggi nettamente diversi.

Le macchine virtuali forniscono un elevato grado di isolamento per i processi, poiché vengono eseguiti nella propria istanza di un sistema operativo. Neanche quel sistema operativo deve essere lo stesso di quello in esecuzione sull'host. Una macchina virtuale Windows può essere eseguita su un hypervisor Linux e viceversa.

I contenitori, al contrario, utilizzano porzioni controllate delle risorse del sistema operativo host; molte applicazioni condividono lo stesso kernel del sistema operativo, in modo altamente gestito. Di conseguenza, le app containerizzate non sono completamente isolate come le macchine virtuali, ma forniscono un isolamento sufficiente per la stragrande maggioranza dei carichi di lavoro.

I container Docker non forniscono velocità bare metal