Perché dovresti usare Docker e contenitori

Un libro pubblicato nel 1981, intitolato  Nailing Jelly to a Tree , descrive il software come "nebuloso e difficile da controllare". Questo era vero nel 1981, e non è meno vero per quasi quattro decenni da allora. Il software, che si tratti di un'applicazione acquistata o creata da te, rimane difficile da distribuire, difficile da gestire e difficile da eseguire.

I container Docker forniscono un modo per ottenere un controllo sul software. È possibile utilizzare Docker per eseguire il wrapping di un'applicazione in modo tale che i suoi problemi di distribuzione e runtime (come esporla su una rete, come gestire il suo utilizzo di archiviazione, memoria e I / O, come controllare le autorizzazioni di accesso) siano gestiti al di fuori dell'applicazione stessa e in modo coerente in tutte le app "containerizzate". È possibile eseguire il contenitore Docker su qualsiasi host compatibile con il sistema operativo (Linux o Windows) in cui è installato il runtime Docker.

Docker offre molti altri vantaggi oltre a questo pratico incapsulamento, isolamento, portabilità e controllo. I contenitori Docker sono piccoli (megabyte). Cominciano immediatamente. Hanno i propri meccanismi incorporati per il controllo delle versioni e il riutilizzo dei componenti. Possono essere facilmente condivisi tramite il Docker Hub pubblico o il repository privato.

In questo articolo esplorerò come i contenitori Docker semplificano sia la creazione che la distribuzione del software: i problemi risolti dai contenitori, come li affrontano, quando sono la risposta giusta al problema e quando non lo sono.

Prima dei contenitori Docker

Da molti anni ormai, il software aziendale è stato tipicamente distribuito su "bare metal" (cioè installato su un sistema operativo che ha il controllo completo sull'hardware sottostante) o in una macchina virtuale (cioè installato su un sistema operativo che condivide l'hardware sottostante con altri sistemi operativi "guest"). Naturalmente, l'installazione su bare metal rendeva il software estremamente difficile da spostare e da aggiornare, due vincoli che rendevano difficile per l'IT rispondere agilmente ai cambiamenti nelle esigenze aziendali.

Poi è arrivata la virtualizzazione. Le piattaforme di virtualizzazione (note anche come "hypervisor") consentivano a più macchine virtuali di condividere un singolo sistema fisico, ciascuna macchina virtuale emulando il comportamento di un intero sistema, completo del proprio sistema operativo, storage e I / O, in modo isolato . L'IT potrebbe ora rispondere in modo più efficace ai cambiamenti nei requisiti aziendali, perché le VM potrebbero essere clonate, copiate, migrate e attivate o disattivate per soddisfare la domanda o risparmiare risorse.

Le macchine virtuali hanno anche contribuito a ridurre i costi, perché più VM potevano essere consolidate su meno macchine fisiche. I sistemi legacy che eseguono applicazioni meno recenti potrebbero essere trasformati in VM e disattivati ​​fisicamente per risparmiare ancora di più.

Ma le macchine virtuali hanno ancora la loro parte di problemi. Le macchine virtuali sono grandi (gigabyte) e ciascuna contiene un sistema operativo completo. Solo così tante app virtualizzate possono essere consolidate su un unico sistema. Il provisioning di una VM richiede ancora una discreta quantità di tempo. Infine, la portabilità delle VM è limitata. Dopo un certo punto, le VM non sono in grado di fornire il tipo di velocità, agilità e risparmio che le aziende in rapida evoluzione richiedono.

Vantaggi del container Docker

I contenitori funzionano un po 'come le VM, ma in modo molto più specifico e granulare. Isolano una singola applicazione e le sue dipendenze, tutte le librerie software esterne che l'app richiede per l'esecuzione, sia dal sistema operativo sottostante che da altri contenitori. Tutte le app containerizzate condividono un unico sistema operativo comune (Linux o Windows), ma sono compartimentate l'una dall'altra e dal sistema in generale.

I vantaggi dei container Docker si manifestano in molti posti. Ecco alcuni dei principali vantaggi di Docker e contenitori:

Docker consente un uso più efficiente delle risorse di sistema

Le istanze di app containerizzate utilizzano molta meno memoria rispetto alle macchine virtuali, si avviano e si arrestano più rapidamente e possono essere impacchettate molto più densamente sull'hardware host. Tutto ciò equivale a una minore spesa per l'IT.

I risparmi sui costi variano a seconda delle app in gioco e di quanto possano essere dispendiose in termini di risorse, ma i container risultano invariabilmente più efficienti delle VM. È anche possibile risparmiare sui costi delle licenze software, poiché sono necessarie molte meno istanze del sistema operativo per eseguire gli stessi carichi di lavoro.

Docker consente cicli di consegna del software più rapidi

Il software aziendale deve rispondere rapidamente alle mutevoli condizioni. Ciò significa sia una facile scalabilità per soddisfare la domanda che un facile aggiornamento per aggiungere nuove funzionalità in base alle esigenze dell'azienda. 

I contenitori Docker rendono facile mettere rapidamente in produzione nuove versioni di software, con nuove funzionalità aziendali e, se necessario, tornare rapidamente a una versione precedente. Inoltre facilitano l'implementazione di strategie come le implementazioni blu / verdi.

Docker consente la portabilità dell'applicazione

Il luogo in cui si esegue un'applicazione aziendale è importante: dietro il firewall, per mantenere le cose vicine e protette; o in un cloud pubblico, per un facile accesso pubblico e un'elevata elasticità delle risorse. Poiché i contenitori Docker incapsulano tutto ciò di cui un'applicazione deve essere eseguita (e solo quelle cose), consentono alle applicazioni di essere spostate facilmente tra gli ambienti. Qualsiasi host con il runtime Docker installato, sia esso il laptop di uno sviluppatore o un'istanza di cloud pubblico, può eseguire un container Docker.

Docker brilla per l'architettura dei microservizi

Leggeri, portatili e autonomi, i container Docker semplificano la creazione di software secondo linee lungimiranti, in modo da non cercare di risolvere i problemi di domani con i metodi di sviluppo di ieri.

Uno dei contenitori di modelli software semplificati è rappresentato dai microservizi, in cui le applicazioni sono costituite da molti componenti liberamente accoppiati. Scomponendo le applicazioni tradizionali "monolitiche" in servizi separati, i microservizi consentono alle diverse parti di un'app line-of-business di essere ridimensionate, modificate e servite separatamente, da team separati e su linee temporali separate, se ciò si adatta alle esigenze del attività commerciale. 

I contenitori non sono necessari per implementare i microservizi, ma sono perfettamente adatti all'approccio dei microservizi e ai processi di sviluppo agili in generale.

Problemi che i contenitori Docker non risolvono

La prima cosa da tenere a mente sui contenitori è lo stesso consiglio che si applica a qualsiasi tecnologia software: questo non è un proiettile d'argento. I container Docker da soli non possono risolvere ogni problema. In particolare:

Docker non risolverà i tuoi problemi di sicurezza

Il software in un container può essere più sicuro per impostazione predefinita rispetto al software eseguito su bare metal, ma è come dire che una casa con le porte chiuse è più sicura di una casa con le porte sbloccate. Non dice nulla sulle condizioni del quartiere, sulla presenza visibile di oggetti di valore che tentano un ladro, sulla routine delle persone che vi abitano e così via. I contenitori possono aggiungere un livello di sicurezza a un'app, ma solo come parte di un programma generale di protezione di un'app nel contesto.

Docker non trasforma magicamente le applicazioni in microservizi

Se si containerizza un'app esistente, è possibile ridurre il consumo di risorse e semplificarne la distribuzione. Ma non cambia automaticamente il design dell'app o il modo in cui interagisce con altre app. Questi vantaggi derivano solo dal tempo e dagli sforzi degli sviluppatori, non solo dall'obbligo di spostare tutto nei contenitori.

Metti un'app monolitica o in stile SOA della vecchia scuola in un contenitore e ti ritroverai con, beh, una vecchia app in un contenitore. Questo non lo rende più utile per il tuo lavoro; semmai, potrebbe renderlo meno utile. 

Docker non è un sostituto delle macchine virtuali

Un mito persistente dei contenitori è che rendono obsolete le VM. Molte app che venivano eseguite in una VM possono essere spostate in un contenitore, ma ciò non significa che tutte possano o dovrebbero. Se operi in un settore con requisiti normativi pesanti, ad esempio, potresti non essere in grado di scambiare i contenitori con le VM, perché le VM forniscono più isolamento rispetto ai contenitori.

Il caso dei container Docker

Il lavoro di sviluppo aziendale è noto per essere limitato e lento a reagire ai cambiamenti. Gli sviluppatori aziendali si sforzano continuamente di fronte a tali vincoli: i limiti imposti loro dall'IT, le richieste loro fatte dall'azienda in generale. Docker e contenitori offrono agli sviluppatori più libertà che desiderano, fornendo allo stesso tempo modi per creare app aziendali che rispondano rapidamente alle mutevoli condizioni aziendali.