Container

Che cos'è Docker?

Il termine Docker si riferisce a vari elementi: il progetto di una community open source, gli strumenti utilizzati, l'azienda che supporta maggiormente il progetto e gli strumenti ufficialmente supportati da Docker. Il fatto che le tecnologie e l'azienda abbiano lo stesso nome può creare confusione.

Per fare chiarezza, ecco alcune definizioni.

  • Il software IT "Docker" è una tecnologia di containerizzazione che permette di creare e utilizzare container Linux.
  • La community open source Docker si occupa di migliorare questa tecnologia, affinché tutti gli utenti possano usufruirne in modo gratuito.
  • L'azienda Docker sviluppa ulteriormente le tecnologie realizzate dalla community, rendendole più sicure, per poi condividere i progressi con tutti gli utenti. Fornisce quindi supporto ai clienti aziendali, per le tecnologie migliorate e potenziate.

Docker permette di gestire i container come macchine virtuali modulari estremamente leggere. Inoltre, è possibile creare, installare, copiare e spostare i container da un ambiente all'altro in modo estremamente flessibile.


Come funziona Docker?

La tecnologia Docker utilizza il kernel di Linux® e le relative funzionalità, come Cgroups e spazi dei nomi, per isolare i processi affinché possano essere eseguiti in modo indipendente. L'obiettivo dei container è proprio quello di garantire tale indipendenza, ovvero la possibilità di eseguire più processi e applicazioni separatamente, per sfruttare in modo più efficace l'infrastruttura disponibile e mantenere al tempo stesso il livello di sicurezza che otterresti utilizzando sistemi separati.

Gli strumenti per i container, incluso Docker, forniscono un modello di deployment basato sull'immagine, che semplifica la condivisione di un'applicazione o un insieme di servizi, con tutte le relative dipendenze, tra più ambienti. Docker permette inoltre di automatizzare il deployment di un'applicazione (o di una serie di processi combinati che formano un'applicazione) all'interno dell'ambiente containerizzato.

Questi strumenti, basati sui container Linux, fanno di Docker uno strumento unico e intuitivo, e forniscono agli utenti metodi completamente nuovi di accesso alle app, oltre alla possibilità di accelerare il deployment e la capacità di controllare il rilascio e la distribuzione di nuove versioni.


La tecnologia Docker è la stessa utilizzata dai container Linux tradizionali?

No. Inizialmente, La tecnologia Docker è stata sviluppata a partire dalla tecnologia LXC, che molti associano ai container Linux tradizionali, ma in seguito si è evoluta. La tecnologia LXC consentiva una virtualizzazione leggera, ma non forniva un'esperienza soddisfacente a sviluppatori e utenti. La tecnologia Docker non consente solo di eseguire i container, ma semplifica - per fare alcuni esempi - la creazione e la realizzazione dei container, il trasferimento delle immagini e il controllo delle relative versioni.

Confronto tra container Linux tradizionali e Docker

I container Linux tradizionali utilizzano un sistema init che consente di gestire più processi, permettendo di eseguire intere applicazioni come una singola entità. La tecnologia Docker promuove la suddivisione delle applicazioni in processi separati e fornisce tutti gli strumenti necessari a tale scopo. Questo approccio granulare fornisce molti vantaggi.


Vantaggi dei container Docker

Modularità

L'approccio Docker alla containerizzazione è incentrato sulla possibilità di disattivare parte di un'applicazione, per aggiornarla o correggerla, senza necessariamente arrestare l'intera app. Oltre a fornire un approccio basato sui microservizi, consente di condividere i processi fra più app, analogamente a quanto avviene con le architetture SOA (Service-Oriented Architecture).

Controllo delle versioni delle immagini e dei livelli

Ciascun file di immagine di Docker è strutturato su più livelli, che insieme costituiscono una singola immagine. La modifica di un'immagine genera un livello. Ogni volta che un utente specifica un comando, ad esempio run o copy, viene creato un nuovo livello.

Docker riutilizza i livelli per generare rapidamente nuovi container. Le modifiche intermedie vengono condivise tra le immagini, migliorando ulteriormente velocità, dimensioni ed efficienza. Il controllo delle versioni va di pari passo con la gestione dei livelli. Ogni volta che viene apportata una modifica, si crea sostanzialmente un registro delle modifiche incorporato, che garantisce un controllo completo sulle immagini del container.

Rollback

La possibilità di eseguire il rollback costituisce probabilmente il vantaggio principale della gestione dei livelli. Ogni immagine contiene livelli. Se l'iterazione corrente dell'immagine non presenta le caratteristiche desiderate, basta eseguire il rollback alla versione precedente. Questo garantisce un approccio agile allo sviluppo, e permette di applicare anche agli strumenti il concetto di integrazione e deployment continui (CI/CD, Continuous Integration/Continuous Deployment).

Deployment rapido

Un tempo, la configurazione, l'attivazione e il provisioning dell'hardware richiedevano giorni, e comportavano carichi di lavoro e costi estremamente gravosi. I container basati su Docker possono ridurre il deployment a pochi secondi. Creando un container per ciascun processo, è possibile condividere rapidamente i processi simili con le nuove app. Inoltre, poiché non è necessario riavviare il sistema operativo per aggiungere o spostare un container, i tempi di deployment sono decisamente inferiori. Proprio grazie a questa velocità di deployment, è possibile creare dati ed eliminare i dati generati dai container in modo semplice ed economico.

Di conseguenza, la tecnologia Docker è un approccio più granulare, controllabile e basato sui microservizi, che valorizza maggiormente l'efficienza.


Esistono limitazioni all'utilizzo di Docker?

Di per sé, Docker gestisce i singoli container in modo estremamente efficiente, ma quando il numero dei container e delle app containerizzate, suddivise in centinaia di componenti, continua ad aumentare, la gestione e l'orchestrazione possono diventare un problema. In questo caso occorre fare un passo indietro e raggruppare i container per fornire servizi (tra cui i servizi di rete, sicurezza e telemetria) a tutti i container utilizzati. Ed è proprio qui che entra in gioco Kubernetes.


Docker non offre le stesse funzionalità di tipo UNIX fornite dai container Linux tradizionali, che includono la possibilità di utilizzare processi quali cron o syslog all'interno del container, insieme all'app. Esistono anche limitazioni che riguardano ad esempio la pulizia dei processi nipote dopo la terminazione dei processi figlio, un aspetto che nei container Linux tradizionali viene gestito intrinsecamente. Questi problemi possono essere in parte risolti modificando il file di configurazione e impostando queste funzionalità fin dall'inizio, anche se tale possibilità non risulta immediatamente ovvia.

Soprattutto, esistono altri dispositivi e sottosistemi Linux che non dispongono di uno spazio dei nomi, quali SELinux, Cgroups e i dispositivi /dev/sd*. Questo significa che, se un hacker riesce a ottenere il controllo di tali sottosistemi, l'host viene compromesso. Tale vulnerabilità di sicurezza è una conseguenza della condivisione del kernel host con i container, che ha lo scopo di assicurare agilità. Questo non avviene invece con le macchine virtuali, che sono molto più isolate dal sistema host.


Anche il demone Docker può creare problemi di sicurezza. Per utilizzare ed eseguire container Docker in genere occorre utilizzare il demone Docker, un runtime persistente per i container. Poiché il demone Docker richiede privilegi di root, è necessario verificare con particolare attenzione chi può accedere a tale processo e dove risiede. Ad esempio, un demone locale presenta una superficie di attacco inferiore, rispetto a un demone che risiede in una posizione più accessibile al pubblico, come un server web.

Ulteriori possibilità offerte dai container