Docker: cos’è e come funziona la più celebre piattaforma per container. Poche tecnologie sono state in grado di rivoluzionare lo sviluppo software come i container (ne abbiamo parlato qui). La loro diffusione e la loro natura open source ha favorito lo sviluppo di tecnologie in grado di supportarli al meglio, esaltando le loro potenzialità, agevolando al tempo stesso una gestione e un’orchestrazione più agevole rispetto a quella offerta dalle feature di base.

In questo contesto, Docker ha segnato un significativo punto di svolta, guadagnandosi nel giro di breve tempo una fortuna insospettabile quanto meritata, per via dei benefici che ha saputo sin da subito assicurare ai team di sviluppo e alle aziende che scelgono di implementare consapevolmente la sua grande varietà tecnologica all’interno dei propri processi.

Cos’è Docker e come funziona

Docker è una piattaforma open source per la creazione, la distribuzione e la gestione dei container, i celebri ambienti di esecuzione virtualizzati, sempre più utilizzati nell’ambito dello sviluppo software, grazie alla loro proverbiale agilità.

Docker è nato nel 2013, quando si diffuse come piattaforma open source con il nome di dotCloud. Docker Inc. si occupava sia del supporto della versione open source che dello sviluppo di una versione commerciale, basata sulla stessa tecnologia. 

Nel 2014 è stata rilasciata la prima versione di Docker Engine, mentre sul fronte dell’orchestrazione, nel 2016 è arrivata una soluzione specifica come Swarm (in Docker Engine 1.12 e successivi), che tuttavia, soprattutto per essere limitata ai soli container Docker, nonostante la sua maggior semplicità, non è mai riuscita ad avvicinare la fortuna critica e la diffusione di Kubernetes, anche per via dei differenti obiettivi alla base del suo sviluppo, per l’appunto molto più settoriali.

Nel 2017 è stata fondata Docker Enterprise, nel 2019 acquisita da Mirantis, che attualmente ne possiede gli asset e le proprietà intellettuali. Nonostante alcune incertezze iniziali, Mirantis ha scelto di supportare fattivamente sia Swarm che Kubernetes, entrambi implementati nella soluzione Mirantis Kubernetes Engine, quali opzioni alternative in merito alla tecnologia di riferimento per l’orchestrazione dei container.

LEGGI ANCHE: Kubernetes, cos’è e come funziona

Come funziona Docker

Docker rappresenta una soluzione open source molto completa, che nel corso degli anni si è arricchita di una serie di strumenti molto efficaci per gestire l’intero ciclo di vita dei container.

Il principale obiettivo di Docker è infatti quello di facilitare la creazione e la gestione di container, garantendo di tenere sempre sotto controllo ogni aspetto del codice eseguito, in un’ampia varietà di possibili scenari che possono presentarsi nel contesto dello sviluppo software. Come tutte le tecnologie container based, Docker è particolarmente impiegata dai team DevOps e più in generale da chi sviluppa software sulla base di un’architettura a microservizi tra loro disaccoppiati.

Come facilmente intuibile, Docker esegue l’applicazione attraverso i container, unità ad elevato livello di standardizzazione che danno luogo ad ambienti dotati di tutto il necessario per eseguire il software: librerie, codice, strumenti di sistema e runtime.

I container Docker non sono un’esclusiva delle tecnologie Linux, come spesso accade nel caso dei container. Trattandosi di una virtualizzazione al livello del sistema operativo, Docker è stato sviluppato per consentire la creazione di container Linux e container Windows, capaci di essere eseguiti ovunque, on-premise e in cloud, utilizzando i più diffusi servizi PaaS (Platform-as-a-Service).

I contenitori Docker possono essere eseguiti ovunque, nei data center on-premise o nel cloud pubblico e privato. Grazie alla virtualizzazione a livello del sistema operativo, tipico di questa tecnologia, Docker consente di creare container in modo nativo sia in ambienti Linux che per Windows, a patto di eseguirle su un host coerente. In altri termini, per eseguire un container Windows, Docker dovrà essere installato su un sistema operativo Windows, idem nel caso delle tecnologie basate su Linux. È pur vero che esistono applicazioni di terze parti che consentono in maniera più o meno agevole l’esecuzione di container Linux su sistemi operativi Windows.

La tecnologia

La tecnologia alla base dei container può essere estremamente sintetizzata in tre termini chiave, che vengono ripresi dallo stesso Docker:

  • Builder: tool per la creazione dei container. Nel caso di Docker, parliamo di Dockerfile;
  • Engine: motore di esecuzione dei container, elemento core della tecnologia. In Docker ci riferiamo a Docker command e Dockerd Daemon;
  • Orchestrazione: insieme di tecniche e metodi per la gestione dei container in più ambienti IT, per offrire la costante visibilità del loro stato di esecuzione (attività, server / VM, ecc.). Parliamo in questo caso di Docker Swarm, specifico per i container Docker, o del celebre Kubernetes, piattaforma open source in grado di supportare un’ampia varietà tecnologica.

Come già precisato, Docker crea, rende disponibili ed esegue container grazie alla loro virtualizzazione al livello del sistema operativo, risultando pertanto efficace tanto in ambiente Linux quanto nell’ecosistema software di Microsoft.

La tecnologia del container prevede il package dell’applicazione con tutte le librerie, i file di configurazione, le dipendenze e tutte le parti necessarie per la sua esecuzione. Ogni container condivide i servizi del sistema operativo che gli funge da host.

Le immagini Docker a loro volta contengono tutte le dipendenze che occorrono per l’esecuzione del codice all’interno del container, in modo da garantirne la totale portabilità da un sistema all’altro, a patto di lavorare sullo stesso sistema operativo. Fatta questa debita premessa, Docker consente di raggiungere un livello di flessibilità nella gestione dei container molto elevata, favorendo soprattutto quei contesti in cui si sviluppano grandi quantità di microservizi, che possono essere comodamente istanziati in container in PaaS o distribuiti on-premise su più macchine virtuali, sempre a condizione di lavorare con lo stesso sistema operativo host.

Docker non fa altro che utilizzare le proprietà specifiche del kernel del sistema operativo in questione, per eseguirvi le multiple istanze dei container. La virtualizzazione avviene pertanto ad un livello più alto rispetto a quanto, ad esempio, consentono invece di fare le macchine virtuali, che incapsulano anche il sistema operativo, per eseguirlo su un hardware host.

Docker è attualmente disponibile per Linux, Windows e OSX, con versioni specifiche per gli ecosistemi cloud Amazon Web Services (AWS) e Microsoft Azure.

Immagini Docker e container Docker

Dopo aver esposto i concetti chiave del funzionamento e della tecnologia di virtualizzazione su cui si basa, per avere una visione complessiva di Docker in qualità di piattaforma, manca ancora un passaggio fondamentale: conoscere le caratteristiche e capire le differenze che intercorrono tra immagini e container Docker.

Immagini Docker

L’immagine Docker contiene il codice dell’applicazione, le librerie e le dipendenze necessarie al codice stesso per l’esecuzione come container. L’esecuzione di un’immagine Docker genera pertanto una o più  istanze di container.

L’aspetto più interessante riguarda il versionamento. Le immagini Docker sono formate da più livelli, a cui corrisponde una versione. L’ultimo livello corrisponde con la versione più recente, i livelli sottostanti le versioni precedenti, in modo da garantire la disponibilità di una cronologia semplice da utilizzare e funzionale al ripristino di stati precedenti, oltre logicamente a favore il riutilizzo di alcune versioni dei componenti nel contesto di altre applicazioni, in coerenza con uno dei principi fondamentali dell’architettura software basata sui microservizi.

La possibilità di riutilizzare le immagini Docker è la ragione per cui si è formata una community incredibilmente attiva nel distribuire queste entità, mettendole a disposizione di tutti grazie ai più celebri repository impiegati dagli sviluppatori. Trattandosi di una tecnologia a tutti gli effetti aperta, le immagini Docker possono essere adottate da altri sviluppatori, che a loro volta potranno aggiornarle e distribuire una versione dotata di altre funzioni, alimentando un gioco di risorse potenzialmente senza fine, capace di generare un consistente vantaggio per l’intera community.

Container Docker

Il container Docker non è la stessa cosa rispetto all’immagine Docker, ma rappresenta semplicemente un suo livello. Torniamo a precisare come le modifiche a livello di container, come le operazioni svolte sui file, vengono salvate soltanto in quel livello container, da cui deriva una specifica versione dell’applicazione.

I container Docker rappresentano a tutti gli effetti delle istanze in esecuzione delle immagini Docker. Questo concetto assume risvolti pratici e di semplice comprensione se consideriamo come le immagini Docker siano entità in sola lettura, mentre la componente a cui è concessa la modifica è rappresentata dal container Docker contenuta in uno dei suoi livelli.

L’indipendenza dei vari livelli consente a Docker di gestire le immagini avviando, anche contemporaneamente, varie istanze dell’applicazione, senza che queste incidano sulla versione da cui sono state avviate. Ogni istanza potrà infatti essere salvata su un nuovo livello.

LEGGI ANCHE: Virtualizzazione, cos’è e perché ci sta aiutando ad uscire dall’emergenza

I vantaggi di Docker per il deploy e la gestione dei container

Il vantaggio chiave della tecnologia container è determinato dalla simultanea disponibilità dell’applicazione che dell’ambiente opportunamente configurato per la sua esecuzione. Si tratta di un vantaggio distintivo delle tecnologie di virtualizzazione, che consentono di gestire gli ambienti di esecuzione come delle istanze avviate su un sistema operativo host, senza dover ovviamente reinstallare l’applicazione ogni volta che l’istanza stessa viene eseguita.

L’evoluzione delle tecnologie di virtualizzazione software ha consentito di affinare soluzioni sempre più flessibili, per soddisfare le varie esigenze degli sviluppatori. Un esempio pratico di quanto stiamo affermando è costituito dalle tecnologie serverless, che consentono di avviare un container stateless quando si verifica un determinato evento, cessando la sua esecuzione quando l’esigenza del carico di lavoro viene meno.

Nei contesti serverless, il container non necessita di salvare il suo stato al termine dell’esecuzione. In altri termini, non è condizionato da una soluzione di continuità dell’applicazione e la sua natura risulta del tutto effimera.

Più in generale, quando si verifica un’anomalia, come il più classico dei crash dell’applicazione, il container cessa automaticamente, in quanto decade l’evento alla base della sua esecuzione. Tornando a noi, la possibilità di condizionare il comportamento dei container, correlandoli a eventi specifici, consente di pianificare le loro operazioni in maniera totalmente automatica, senza dover costringere un sistemista ad intervenire manualmente, se non in condizioni del tutto eccezionali.

Le piattaforme di gestione e orchestrazione dei container, come Docker, o lo stesso Kubernetes, consentono quindi di creare dei flussi di lavoro in grado di essere eseguiti in maniera del tutto automatica, per supportare l’intero ciclo di vita del container. Maggiore è il livello di automatizzazione che sono in grado di raggiungere, maggiore è il valore aggiunto in termini di ottimizzazione delle risorse IT dedicate alle applicazioni, che si traduce in costi minori, oltre alla generica riduzione del time-to-market del software.

La crescente diffusione di Docker è pienamente giustificata dai vantaggi che puntualmente genera, a patto di disporre delle competenze adeguate per implementarlo e gestirlo in maniera efficiente e funzionale rispetto alle esigenze di business. Tra i principali vantaggi che le aziende possono ottenere grazie a Docker, è indispensabile citare:

Semplicità e agilità nello sviluppo software

La possibilità di gestire un’applicazione all’interno di un componente, la cui distribuzione e configurazione è di fatto legata ad una singola riga di comando, fa dei container la tecnologia ideale per rende molto più semplice e rapido lo sviluppo del software rispetto a qualsiasi procedura tradizionalmente intesa.

Come abbiamo visto, un cointainer Docker equivale ad un livello contenuto in un’immagine, la cui esecuzione è pari, nel verso senso della parola, alla scrittura di una semplice linea di codice. Addio configurazioni complesse, procedure di installazione, possibili problemi di compatibilità.

La piattaforma Docker assolve e automatizza qualsiasi processo necessario per rendere disponibile l’ambiente di runtime delle applicazioni. In altri termini, gli sviluppatori possono finalmente preoccuparsi soltanto di programmare software, senza farsi carico dei tecnicismi legati all’infrastruttura sottostante.

Isolamento delle applicazioni

Una delle feature più interessanti di Docker è la garanzia che le applicazioni e le risorse necessarie per eseguirle su un container rimangano sempre isolate rispetto agli altri container. L’assoluta indipendenza tra i vari container facilita di gran lunga la manutenzione a livello generale, oltre a ridurre i rischi in termini di sicurezza, qualora dovesse verificarsi un incidente su una delle istanze in esecuzione: nessun’altra ne risentirebbe, in quanto non ci sono comunicazioni tra un container e l’altro.

In caso di anomalie, è possibile cessare un’istanza e riavviarla sulla base dell’ultima versione ritenuta attendibile, con la possibilità di automatizzare questa eventualità configurando specifici eventi. Allo stesso modo, è possibile eseguire una pulizia periodica dei container potenzialmente obsoleti, ad esempio che non vengono più eseguiti da molto tempo, a prescindere dalla loro utilità. Questo avviene senza alcun timore nel fatto di cancellare una risorsa utile, se non indispensabile, per il funzionamento di altri componenti.

Elevata portabilità per il test delle applicazioni

Per avviare le immagini e i container Docker è sufficiente disporre della piattaforma in grado di eseguirli, a prescindere dalla macchina su cui questa è installata. Questa caratteristica garantire un’elevata portabilità per i container, che possono essere spostati ed eseguiti rapidamente, come spesso accade in fase di test delle applicazioni. A prescindere che si lavori in cloud, piuttosto che on-premise, gli sviluppatori devono semplicemente preoccuparsi di disporre e condividere le immagini Docker più aggiornate. A tutto il resto ci pensa la piattaforma.

Ampia disponibilità di soluzioni in cloud

La proverbiale portabilità di Docker è alla base di un altro vantaggio fondamentale per la fortuna e la diffusione di questa tecnologia: la possibilità di utilizzarlo in un contesto multicloud, eseguendo i container su più ecosistemi cloud. L’unica condizione è la presenza di Docker sul sistema operativo host.

La straordinaria popolarità di Docker ha fatto si che i principali cloud service provider garantiscano ormai da diverso tempo agli sviluppatori delle soluzioni in grado di consentire l’esecuzione di container Docker. L’aspetto più interessante è dato dal poter portare un’istanza definita, ad esempio, con Google Compute Engine in un ambiente differente, senza perdere nulla in termini di funzionalità.

Ciò è possibile grazie all’elevato livello di astrazione che Docker riesce a mantenere nei confronti dell’infrastruttura sottostante. È la ragione per cui gli ecosistemi cloud dei vari hyperscaler ormai dispongono di soluzioni molto efficaci per Docker. Oltre al già citato Google Cloud ritroviamo infatti altri IaaS, come AWS, Microsoft Azure o lo stesso OpenStack, un progetto open source attualmente supportato da oltre 500 realtà, tra cui IBM, HPE, VMware, Intel e Oracle.

Versionamento delle applicazioni

Grazie alla propria struttura basata sui livelli, le immagini Docker consentono di governare i container come versioni differenti delle applicazioni, per assicurare la consistenza tra i vari cicli CI/CD tipiche delle applicazioni cloud native. Le immagini stesse, per la loro semplice natura, possono essere agevolmente gestite mediante i tool di orchestrazione di Docker.

Qualora un aggiornamento non andasse a buon fine, è possibile evitare il downtime dell’applicazione, grazie ad un rollback automatico verso una versione stabile, come quella precedentemente in esecuzione. Allo stesso molto, la visibilità sui vari versionamenti dell’applicazione consente di ottimizzare la gestione dei backup e di tutte le eventuali procedure di ripristino.

Innovazione delle applicazioni

Con buona pace per i puristi, che potrebbero lecitamente storcere il naso di fronte a questa affermazione, a livello concettuale è innegabile come Docker costituisca una tecnologia di gestione dei container sicura grazie al design stesso della sua architettura funzionale, in grado di fare propri i principi fondamentali della virtualizzazione per creare delle sandbox in cui è possibile testare le applicazioni senza aver paura di causare danni a livello di sistema, nel caso in cui qualcosa dovesse girare storto. E in fase di test, le cose molto spesso non vanno esattamente nella direzione desiderata.

Grazie a questa caratteristica, Docker è una tecnologia che favorisce l’innovazione del software, consentendo di testare molte soluzioni alternative, semplicemente avviando varie istanze della stessa configurazione di base.

Docker e sicurezza dei Container

Le implicazioni tra Docker e i container meritano un discorso a parte per quanto riguarda la sicurezza. Come abbiamo rilevato nella considerazione relativa all’isolamento, i container eseguiti con Docker sono tra loro assolutamente isolati e indipendenti ed è pertanto possibile avere il completo controllo sulla loro visibilità e gestione, senza alcun vincolo di sorta. I vantaggi sul piano della sicurezza informatica sono evidenti.

Qualora un container venisse corrotto, ad esempio sfruttando una vulnerabilità dell’applicazione che esegue, tale evento non pregiudica il funzionamento degli altri container in esecuzione. L’isolamento impedisce, o per lo meno rende più complessa, la propagazione della minaccia all’interno del sistema host, consentendo a Docker di cessare l’istanza corrotta e riavviarla in condizioni totalmente sicure, oltre a disporre traccia di quanto accaduto nei log di sistema, preziosa risorsa per i SOC e i team di incident response.

Alcuni team eseguono Docker all’interno di macchine virtuali opportunamente predisposte, per garantire di fatto un doppio livello di isolamento nei confronti dell’infrastruttura hardware sottostante.

Grazie a successivi affinamenti della tecnologia progressivamente introdotta nelle varie stable release che si sono susseguite negli anni, Docker è oggi una soluzione in grado di garantire avanzate funzionalità in termini di sicurezza e policy relative a conservazione e trattamento dei dati lungo l’intero ciclo di vita delle applicazioni che i suoi container regolarmente eseguono.

Le vulnerabilità di un’applicazione, in particolare quelle cloud native, possono interessare le autenticazioni e le autorizzazioni da parte di utenti e device, l’integrità delle immagini dei container e ovviamente il traffico di rete che interessa l’esecuzione dei container stessi. Docker generalmente garantisce i diritti di root all’host, almeno nelle condizioni impostate di default, ma è possibile personalizzare ogni aspetto relativo alle autorizzazioni sui container. Inutile sottolineare l’opportunità di affidarsi a specialisti esperti.

Docker ha continuamente implementato nella sua piattaforma nuove soluzioni di sicurezza, con l’obiettivo di rendere sempre più affidabile la gestione dei container. Tra queste abbiamo visto nel tempo arrivare funzioni come image scanning, secure node introduction, cluster segmentation, cryptographic node identity e secure secret distribution.

Alcune di queste feature sono diffuse anche in Kubernetes ed altre tecnologie di gestione / orchestrazione dei container. Vari ISV sono inoltre costantemente impegnati nello sviluppo di strumenti di scansione specifici per la sicurezza dei container, offrendo un’ampia scelta agli specialisti di sicurezza nello sviluppo delle applicazioni. Per tali ragioni, Docker facilita pertanto anche l’implementazione di un ciclo di vita del software che vede la sicurezza quale un elemento nativo, come nel caso di DevSecOps.

Docker è in grado di assicurare la sicurezza delle applicazioni senza sacrificare alcunché in termini di portabilità, garantendo la piena operatività sia on-premise che in cloud, utilizzando API aperte e chiuse, per rispondere in maniera ottimale a qualsiasi esigenza di business.

Docker: cos’è e come funziona la più celebre piattaforma per container ultima modifica: 2022-06-30T10:32:38+02:00 da Francesco La Trofa

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui