Ricerca nel sito web

LFCA: apprendi i concetti di base sull'utilizzo dei contenitori - Parte 22


Nel corso del tempo, con la crescita della domanda di test e implementazione rapidi delle applicazioni e cicli aziendali più rapidi, le organizzazioni sono state costrette a innovarsi per stare al passo con il frenetico ambiente aziendale.

La ricerca di modernizzare le applicazioni e crearne di nuove per creare flussi di lavoro agili ha portato al concetto di utilizzo dei contenitori. La tecnologia di containerizzazione è vecchia quasi quanto la virtualizzazione. Tuttavia, i container non hanno suscitato grande entusiasmo fino a quando Docker non è esploso sulla scena nel 2013, suscitando un interesse frenetico tra gli sviluppatori e altri professionisti IT.

Attualmente, tutti i giganti della tecnologia come Google, Amazon, Microsoft e Red Hat, per citarne alcuni sono saliti sul carro dei vincitori.

Perché i contenitori?

Una delle sfide che gli sviluppatori hanno dovuto affrontare è stata la differenza degli ambienti informatici in ogni fase dello sviluppo del software. I problemi sorgono quando l'ambiente software è diverso da una fase a quella successiva.

Ad esempio, un'applicazione può essere eseguita senza problemi in un ambiente di test utilizzando Python 3.6. Tuttavia, l'applicazione si comporta in modo strano, restituisce alcuni errori o si blocca del tutto quando viene trasferita in un ambiente di produzione che esegue Python 3.9.

I container sono entrati in scena per affrontare questa sfida e garantire che le applicazioni funzionino in modo affidabile quando vengono spostate da un ambiente informatico a quello successivo in ogni fase dello sviluppo del software, dal PC degli sviluppatori fino all’ambiente di produzione. E non è solo l’ambiente software che può causare tali incoerenze, ma anche le differenze nella topologia della rete e nelle policy di sicurezza.

Cosa sono i contenitori?

Un contenitore è un'unità software isolata che racchiude tutto il codice binario, le librerie, gli eseguibili, le dipendenze e i file di configurazione in un unico pacchetto in modo tale che l'applicazione funzioni senza problemi quando viene trasferita da un ambiente informatico ad un altro. Non viene fornito con un'immagine del sistema operativo che lo rende leggero e facilmente trasportabile.

Un'immagine contenitore è un pacchetto autonomo, leggero ed eseguibile che raggruppa tutto il necessario per eseguire l'applicazione. In fase di esecuzione, un'immagine del contenitore si trasforma in un contenitore. Nel caso di Docker, ad esempio, un'immagine Docker diventa un contenitore docker quando eseguita su Docker Engine. Docker è un ambiente runtime utilizzato per creare applicazioni containerizzate.

I container vengono eseguiti in completo isolamento dal sistema operativo sottostante e le applicazioni containerizzate verranno sempre eseguite in modo coerente indipendentemente dall'ambiente informatico o dall'infrastruttura. È per questo motivo che uno sviluppatore può sviluppare un'applicazione comodamente da questo laptop e distribuirla facilmente su un server.

La coerenza e l'affidabilità dei contenitori in esecuzione offrono agli sviluppatori la tranquillità di sapere che le loro applicazioni verranno eseguite come previsto, indipendentemente da dove vengono distribuite.

In cosa differiscono i contenitori dalle macchine virtuali?

Una cosa comune che i contenitori e le macchine virtuali condividono è che operano in un ambiente virtualizzato. La containerizzazione, in un certo senso, è una forma di tecnologia virtualizzata. Tuttavia, i contenitori differiscono dalle macchine virtuali in più di un modo.

Macchine virtuali

Una macchina virtuale, chiamata anche istanza virtuale o VM in breve, è un'emulazione di un server fisico o PC. La virtualizzazione è una tecnologia che consente di creare macchine virtuali. Il concetto di virtualizzazione risale ai primi anni ’70 e ha gettato le basi per la prima generazione della tecnologia cloud.

Nella virtualizzazione, viene creato uno strato di astrazione sopra un server bare metal o l'hardware del computer. Ciò rende possibile la condivisione delle risorse hardware di un singolo server su più macchine virtuali.

Il software utilizzato per creare il livello di astrazione viene definito hypervisor. L'hypervisor astrae la macchina virtuale e il sistema operativo guest dall'effettivo bare metal o dall'hardware del computer. Pertanto, una macchina virtuale si trova sopra l'hypervisor che rende disponibili le risorse hardware grazie al livello di astrazione.

Le macchine virtuali eseguono un sistema operativo completo (sistema operativo guest) che è indipendente dal sistema operativo sottostante (sistema operativo host) su cui è installato l'hypervisor. Il sistema operativo guest fornisce quindi una piattaforma per creare, testare e distribuire applicazioni insieme alle relative librerie e file binari.

Esistono due tipi di hypervisor:

Hypervisor di tipo 1 (Hypervisor bare metal)

Questo hypervisor è installato direttamente su un server fisico o sull'hardware sottostante. Non esiste un sistema operativo che si trovi tra l’hypervisor e l’hardware del computer, da qui il nome del tag hypervisor bare-metal. Fornisce un supporto eccellente poiché le risorse non sono condivise con il sistema operativo host.

Grazie alla loro efficienza, gli hypervisor di tipo 1 vengono utilizzati principalmente in ambienti aziendali. I fornitori di hypervisor di tipo 1 includono VMware Esxi e KVM.

Hypervisor di tipo 2:

Anche questo è considerato un hypervisor ospitato. È installato sul sistema operativo host e condivide le risorse hardware sottostanti con il sistema operativo host.

Gli hypervisor di tipo 2 sono ideali per ambienti informatici di piccole dimensioni e vengono utilizzati principalmente per testare sistemi operativi e ricerche. I fornitori di hypervisor di tipo 2 includono Oracle VirtualBox e VMware Workstation Pro.

Lo svantaggio delle macchine virtuali

Le macchine virtuali tendono ad essere di dimensioni enormi (possono occupare diversi GB), lente nell'avvio e nell'arresto e divorano molte risorse di sistema portando a blocchi e prestazioni lente a causa delle risorse limitate. Pertanto, una macchina virtuale è considerata ingombrante ed è associata a costi generali elevati.

Contenitori

A differenza di una macchina virtuale, un contenitore non richiede un hypervisor. Un contenitore si trova sopra un server fisico e il suo sistema operativo e condivide lo stesso kernel del sistema operativo, oltre ad altre cose come librerie e file binari. Sullo stesso sistema possono essere eseguiti più contenitori, ciascuno dei quali esegue il proprio set di applicazioni e processi dagli altri. Le piattaforme di contenitori più popolari includono Docker e Podman.

A differenza delle macchine virtuali, i contenitori vengono eseguiti in completo isolamento dal sistema operativo sottostante. I contenitori sono eccezionalmente leggeri – solo pochi megabyte – occupano meno spazio e sono rispettosi delle risorse. Sono facili da avviare e arrestare e possono gestire più applicazioni di una macchina virtuale.

Vantaggi dell'utilizzo dei contenitori

I contenitori forniscono un modo conveniente per progettare, testare e distribuire applicazioni dal tuo PC direttamente in un ambiente di produzione, sia esso on-premise o cloud. Ecco alcuni dei vantaggi derivanti dall'utilizzo di applicazioni containerizzate.

1. Maggiore modularità

Prima dei contenitori, avevamo il vecchio modello monolitico in cui un'intera applicazione comprendente sia componenti frontend che backend veniva raggruppata in un unico pacchetto. I contenitori consentono di suddividere un'applicazione in più componenti singoli che possono comunicare tra loro.

In questo modo, i team di sviluppo possono collaborare su varie parti di un'applicazione a condizione che non vengano apportate modifiche sostanziali al modo in cui le applicazioni interagiscono tra loro.

Su questo si basa il concetto di microservizi.

2. Aumento della produttività

Una maggiore modularità significa maggiore produttività poiché gli sviluppatori sono in grado di lavorare su singoli componenti dell'applicazione ed eseguire il debug degli errori molto più velocemente di prima.

3. Costi generali ridotti

Rispetto alle macchine virtuali e ad altri ambienti informatici convenzionali, i contenitori utilizzano meno risorse di sistema poiché non includono un sistema operativo. Ciò evita spese inutili per l'acquisto di server costosi per creare e testare applicazioni.

4. Maggiore portabilità

Grazie al loro ingombro ridotto, le applicazioni containerizzate possono essere facilmente distribuite in più ambienti informatici/sistemi operativi.

5. Maggiore efficienza e flessibilità

I contenitori consentono una rapida distribuzione e scalabilità delle applicazioni. Forniscono inoltre la flessibilità necessaria per distribuire applicazioni in più ambienti software.

In che modo i container apportano vantaggi ai team DevOps?

I container svolgono un ruolo chiave in DevOps e sarebbe impossibile immaginare come sarebbe la situazione senza le applicazioni containerizzate. Allora, cosa portano in tavola i contenitori?

Innanzitutto, i contenitori sostengono l’architettura dei microservizi, consentendo di sviluppare, distribuire e ridimensionare in modo indipendente gli elementi costitutivi di un’intera applicazione. Come accennato, ciò garantisce una maggiore collaborazione e una rapida implementazione delle applicazioni.

La containerizzazione svolge inoltre un ruolo importante nel facilitare le pipeline CI/CD fornendo un ambiente controllato e coerente per la creazione di applicazioni. Tutte le librerie e le dipendenze sono raggruppate insieme al codice in un'unica unità per una distribuzione più rapida e semplice. L'applicazione testata sarà esattamente lo stesso software che verrà distribuito in produzione.

Inoltre, i contenitori migliorano l'implementazione di patch e aggiornamenti quando un'applicazione è suddivisa in più microservizi, ciascuno in un contenitore separato. I singoli contenitori possono essere esaminati, applicati patch e riavviati senza interrompere il resto dell'applicazione.

Conclusione

Qualsiasi organizzazione che cerchi di raggiungere la maturità in DevOps dovrebbe prendere in considerazione l'idea di sfruttare la potenza dei contenitori per implementazioni agili e senza interruzioni. La sfida sta nel sapere come configurarli, proteggerli e distribuirli senza problemi in più ambienti.