Container

Cos'è Docker?

Docker è il nome utilizzato per definire il progetto di una community open source, gli strumenti del progetto open source, Docker Inc., la società principale finanziatrice del progetto, e gli strumenti che la società supporta formalmente. Il fatto che le tecnologie e l'azienda condividano lo stesso nome può generare confusione.

Ecco una breve spiegazione.

  • Il software "Docker” è una tecnologia di containerizzazione che consente la creazione e l'utilizzo dei container Linux®.
  • La community Docker open source si impegna a migliorare queste tecnologie a vantaggio di tutti in modo gratuito.
  • Docker Inc., sviluppa i progetti della community Docker rendendoli più sicuri, e condivide le migliorie apportate con la community più ampia. Inoltre, offre soluzioni migliorate di livello enterprise.

DOCKER, considera i container come macchine virtuali modulari estremamente leggere, offrendo la flessibilità di creare, distribuire, copiare e spostare i container da un ambiente all'altro.


Come funziona Docker?

La tecnologia Docker utilizza il kernel di Linux e le sue funzionalità, come Cgroups e namespace, per isolare i processi in modo da poterli eseguire in maniera indipendente. Questa indipendenza è l'obiettivo dei container: la capacità di eseguire più processi e applicazioni in modo separato per sfruttare al meglio l'infrastruttura esistente pur conservando il livello di sicurezza che sarebbe garantito dalla presenza di sistemi separati.

Gli strumenti per la creazione di container, come Docker, consentono il deployment a partire da un'immagine. Ciò semplifica la condivisione di un'applicazione o di un insieme di servizi, con tutte le loro dipendenze, nei vari ambienti. Docker automatizza anche la distribuzione dell'applicazione (o dei processi che compongono un'applicazione) all'interno dell'ambiente containerizzato.

Gli strumenti sviluppati partendo dai container Linux, responsabili dell'unicità e della semplicità di utilizzo di Docker, offrono agli utenti accesso alle applicazioni, la capacità di eseguire un deployment rapido, e il controllo sulla distribuzione di nuove versioni.


La tecnologia Docker è la stessa dei container Linux tradizionali?

No. La tecnologia Docker è stata sviluppata partendo dalla tecnologia LXC, quella che in molti associano ai container Linux "tradizionali", discostandosi però fin da subito da tale dipendenza. La tecnologia LXC era una soluzione di virtualizzazione leggera, ma non offriva un'esperienza ottimale a sviluppatori e utenti. La tecnologia Docker non fornisce la sola capacità di eseguire i container. Consente, ad esempio, di semplificare il processo di creazione e costruzione dei container, di invio di immagini e di versioning delle immagini.

I container Linux tradizionali adottano un sistema init in grado di gestire più processi, consentendo di eseguire più applicazioni come una singola entità. La tecnologia Docker agevola la suddivisione delle applicazioni nei loro vari processi e mette a disposizione gli strumenti per farlo. Questo approccio granulare ha svariati vantaggi.


I vantaggi dei container Docker

Modularità

L'approccio Docker alla containerizzazione si basa sulla capacità di estrarre i singoli componenti di un'applicazione, da aggiornare o riparare. Oltre a questo approccio basato sui microservizi, è possibile condividere i processi tra più applicazioni in modo molto simile a quello usato dalla Service-Oriented Architecture (SOA).

Strati e controllo delle versioni delle immagini

Ogni file immagine Docker è composto da più strati. Uno strato viene creato ad ogni modifica dell'immagine. Ogni volta in cui un utente specifica un comando (es. run o copy), viene creato un nuovo strato.

Docker riutilizza questi strati per velocizzare il processo di creazione dei container. Le modifiche sono condivise tra le immagini, migliorando ulteriormente la velocità, la dimensione e l'efficienza. Il controllo delle versioni fa parte del processo di stratificazione. Ogni volta che viene apportata una modifica, il registro delle modifiche offre il controllo totale sulle immagini containerizzate.

Rollback

Uno dei maggiori vantaggi della stratificazione è la capacità di eseguire il rollback. Ogni immagine è composta da strati. Se l'iterazione di un'immagine non è soddisfacente, è possibile riportala alla versione precedente. Ciò consente uno sviluppo agile, e aiuta ad ottenere l'integrazione e la distribuzione continua (CI/CD).

Deployment rapido

In passato, la configurazione, l'esecuzione ed il provisioning di un nuovo hardware richiedevano giorni e notevoli investimenti. I container basati su Docker possono ridurre il deployment a pochi secondi. Creando un container per ogni processo, puoi condividere con rapidità i processi simili con le nuove applicazioni. Poiché non è necessario riavviare un sistema operativo per aggiungere o spostare un container, i tempi per il deployment sono sostanzialmente più brevi. Inoltre, grazie alla velocità del deployment, attraverso i container è possibile creare ed eliminare dati in modo sicuro, semplice ed economico.

Dunque, la tecnologia Docker è caratterizzata da un approccio basato sui microservizi granulare e controllabile, per un ambiente IT più efficiente.


Ci sono delle limitazioni all'uso di Docker?

Docker, di per sé, è in grado di gestire i singoli container in modo molto efficace. Tuttavia, l'utilizzo di un numero sempre maggiore di container e applicazioni containerizzate, a loro volta scomposte in centinaia di componenti, l'orchestrazione e la gestione possono diventare complesse, al punto tale da rendere necessario il raggruppamento dei container per consentire la distribuzione dei servizi (tra cui servizi di rete, di sicurezza e di telemetria) su tutti i container. A questo punto entra in gioco Kubernetes.

Docker non dispone delle funzionalità di tipo UNIX offerte dai container Linux tradizionali, compresa la capacità di usare processi come cron o syslog all'interno del container, insieme alla tua applicazione. Esistono anche altre limitazioni, come la pulizia dei processi grandchild dopo il completamento dei processi child, un'attività prevista nei container Linux tradizionali. Queste problematiche possono essere mitigate modificando il file di configurazione e configurando queste capacità dall'inizio, cosa che a prima occhiata potrebbe non essere immediatamente ovvia.

Inoltre, ci sono altri sottosistemi e dispositivi Linux che non prevedono namespace, tra cui SELinux, Cgroups e i dispositivi /dev/sd*. Ciò significa che se l'autore di un attacco ottiene il controllo su questi sottosistemi, l'host è compromesso. Lo svantaggio di questi sottosistemi leggeri risiede nella vulnerabilità creata nel momento in cui il kernel dell'host viene condiviso con i container. Ciò non si verifica nel caso delle macchine virtuali, che sono molto più isolate dal sistema host.

Anche il Docker daemon può rappresentare un problema dal punto di vista della sicurezza. Generalmente, per usare ed eseguire i container Docker viene utilizzato il Docker daemon, un runtime persistente per container. Esso richiede privilegi root, quindi si rende necessario un rigido controllo degli accessi a questo processo, e all'ubicazione del processo. Ad esempio, un daemon locale presenta una superficie di attacco inferiore rispetto a un daemon che risiede in una posizione più accessibile, come un server web.

Scopri gli altri vantaggi offerti dai container