Contenitori 101: fondamenti di Docker

Docker è iniziato nel 2012 come progetto open source, originariamente chiamato dotcloud, per creare container Linux per singola applicazione. Da allora, Docker è diventato uno strumento di sviluppo immensamente popolare, sempre più utilizzato come ambiente di runtime. Poche, se non nessuna, le tecnologie hanno preso piede con gli sviluppatori così rapidamente come Docker.

Uno dei motivi per cui Docker è così popolare è che offre la promessa di "sviluppare una volta, eseguire ovunque". Docker offre un modo semplice per impacchettare un'applicazione e le sue dipendenze di runtime in un unico contenitore; fornisce anche un'astrazione di runtime che consente al contenitore di funzionare su diverse versioni del kernel Linux.

Utilizzando Docker, uno sviluppatore può creare un'applicazione containerizzata sulla sua workstation, quindi distribuire facilmente il container a qualsiasi server abilitato per Docker. Non è necessario ripetere il test o sintonizzare il contenitore per l'ambiente server, sia nel cloud che in locale.

Inoltre, Docker fornisce un meccanismo di condivisione e distribuzione del software che consente agli sviluppatori e ai team operativi di condividere e riutilizzare facilmente il contenuto del contenitore. Questo meccanismo di distribuzione, insieme alla portabilità su più computer, contribuisce a tenere conto della popolarità di Docker presso i team operativi e gli sviluppatori.  

Componenti Docker

Docker è sia uno strumento di sviluppo che un ambiente di runtime. Per comprendere Docker, dobbiamo prima comprendere il concetto di un'immagine del contenitore Docker. Un contenitore inizia sempre con un'immagine ed è considerato un'istanza di quell'immagine. Un'immagine è una specifica statica di ciò che il contenitore dovrebbe essere in runtime, incluso il codice dell'applicazione all'interno del contenitore e le impostazioni di configurazione del runtime. Le immagini Docker contengono livelli di sola lettura, il che significa che una volta creata un'immagine non viene mai modificata.

La figura 1 mostra un esempio di un'immagine del contenitore. Questa immagine mostra un'immagine di Ubuntu con un'installazione di Apache. L'immagine è una composizione di tre livelli di base di Ubuntu più un livello di aggiornamento, con un livello di Apache e un livello di file personalizzato in cima.

Un container Docker in esecuzione è un'istanza di un'immagine. I contenitori derivati ​​dalla stessa immagine sono identici tra loro in termini di codice dell'applicazione e dipendenze di runtime. Ma a differenza delle immagini, che sono di sola lettura, i contenitori in esecuzione includono un livello scrivibile (il livello del contenitore) sopra il contenuto di sola lettura. Le modifiche al runtime, incluse eventuali scritture e aggiornamenti a dati e file, vengono salvate nel livello contenitore. Pertanto, più contenitori in esecuzione simultanei che condividono la stessa immagine sottostante possono avere livelli contenitore che differiscono sostanzialmente.

Quando un contenitore in esecuzione viene eliminato, viene eliminato anche il livello del contenitore scrivibile e non verrà mantenuto. L'unico modo per rendere persistenti le modifiche è eseguire un docker commitcomando esplicito prima di eliminare il contenitore. Quando si esegue un'operazione docker commit, il contenuto del contenitore in esecuzione, incluso il livello scrivibile, viene scritto in una nuova immagine del contenitore e archiviato sul disco. Questa diventa una nuova immagine distinta dall'immagine con cui è stato istanziato il contenitore.

Usando questo docker commitcomando esplicito , è possibile creare una serie successiva e discreta di immagini Docker, ciascuna costruita sopra l'immagine precedente. Inoltre, Docker utilizza una strategia di copia su scrittura per ridurre al minimo il footprint di archiviazione di contenitori e immagini che condividono gli stessi componenti di base. Ciò consente di ottimizzare lo spazio di archiviazione e ridurre al minimo l'ora di inizio del contenitore.

La figura 2 illustra la differenza tra un'immagine e un contenitore in esecuzione. Notare che ogni contenitore in esecuzione può avere un diverso livello scrivibile.

Oltre al concetto di immagine, Docker ha alcuni componenti specifici diversi da quelli dei contenitori Linux tradizionali.

  • Demone Docker. Conosciuto anche come Docker Engine, il daemon Docker è un sottile strato tra i contenitori e il kernel Linux. Il daemon Docker è l'ambiente di runtime persistente che gestisce i contenitori delle applicazioni. Qualsiasi contenitore Docker può essere eseguito su qualsiasi server abilitato per Docker-daemon, indipendentemente dal sistema operativo sottostante.
  • Dockerfile. Gli sviluppatori utilizzano Dockerfile per creare immagini di container, che poi diventano la base per l'esecuzione di container. Un Dockerfile è un documento di testo che contiene tutte le informazioni di configurazione e i comandi necessari per assemblare un'immagine del contenitore. Con un Dockerfile, il daemon Docker può creare automaticamente un'immagine del contenitore. Questo processo semplifica notevolmente i passaggi per la creazione del contenitore.

Più specificamente, in un Dockerfile, devi prima specificare un'immagine di base da cui inizia il processo di compilazione. Quindi si specifica una successione di comandi, dopodiché è possibile creare una nuova immagine del contenitore.

  • Strumenti dell'interfaccia della riga di comando Docker. Docker fornisce una serie di comandi CLI per la gestione del ciclo di vita dei contenitori basati su immagini. I comandi Docker comprendono funzioni di sviluppo come compilazione, esportazione e etichettatura, nonché funzioni di runtime come esecuzione, eliminazione, avvio e arresto di un contenitore e altro ancora.

È possibile eseguire comandi Docker su un particolare demone Docker o un registro. Ad esempio, se esegui il docker -pscomando, Docker restituirà un elenco di contenitori in esecuzione sul daemon.

Distribuzione dei contenuti con Docker

Oltre all'ambiente di runtime e ai formati contenitore, Docker fornisce un meccanismo di distribuzione del software, comunemente noto come registro, che facilita l'individuazione e la distribuzione del contenuto del contenitore.

Il concetto di registro è fondamentale per il successo di Docker, poiché fornisce una serie di utilità per imballare, spedire, archiviare, scoprire e riutilizzare il contenuto del contenitore. Docker, la società gestisce un registro pubblico e gratuito chiamato Docker Hub.

  • Registro. Un registro Docker è un luogo in cui vengono pubblicate e archiviate le immagini del contenitore. Un registro può essere remoto o locale. Può essere pubblico, quindi tutti possono usarlo o privato, limitato a un'organizzazione o a un insieme di utenti. Un registro Docker viene fornito con una serie di API comuni che consentono agli utenti di creare, pubblicare, cercare, scaricare e gestire le immagini dei contenitori.
  • Docker Hub. Docker Hub è un registro contenitori pubblico basato su cloud gestito da Docker. Docker Hub offre supporto per il rilevamento, la distribuzione e la collaborazione delle immagini. Inoltre, Docker Hub ha una serie di immagini ufficiali certificate da Docker. Si tratta di immagini di noti produttori di software come Canonical, Red Hat e MongoDB. Puoi utilizzare queste immagini ufficiali come base per creare le tue immagini o applicazioni.

La Figura 3 illustra un flusso di lavoro in cui un utente costruisce un'immagine e la carica nel registro. Altri utenti possono estrarre l'immagine dal registro per creare contenitori di produzione e distribuirli agli host Docker, ovunque si trovino.

L'immutabilità dei contenitori Docker

Una delle proprietà più interessanti dei container Docker è la loro immutabilità e la conseguente apolidia dei container.

Come abbiamo descritto nella sezione precedente, un'immagine Docker, una volta creata, non cambia. Un contenitore in esecuzione derivato dall'immagine ha un livello scrivibile che può memorizzare temporaneamente le modifiche di runtime. Se il contenitore viene docker commitsottoposto a commit prima dell'eliminazione con , le modifiche nel livello scrivibile verranno salvate in una nuova immagine distinta dalla precedente.

Perché l'immutabilità è buona? Immagini e contenitori immutabili portano a un'infrastruttura immutabile e un'infrastruttura immutabile ha molti vantaggi interessanti che non sono ottenibili con i sistemi tradizionali. Questi vantaggi includono quanto segue:

  • Controllo della versione. Richiedendo commit espliciti che generano nuove immagini, Docker ti obbliga a eseguire il controllo della versione. È possibile tenere traccia delle versioni successive di un'immagine; tornare a un'immagine precedente (quindi a un componente di sistema precedente) è del tutto possibile, poiché le immagini precedenti vengono mantenute e non vengono mai modificate.
  • Aggiornamenti più puliti e modifiche di stato più gestibili. Con l'infrastruttura immutabile, non è più necessario aggiornare l'infrastruttura del server, il che significa che non è necessario modificare i file di configurazione, nessun aggiornamento software, nessun aggiornamento del sistema operativo e così via. Quando sono necessarie modifiche, è sufficiente creare nuovi contenitori e spingerli fuori per sostituire quelli vecchi. Questo è un metodo molto più discreto e gestibile per il cambiamento di stato.
  • Deriva ridotta al minimo. Per evitare deviazioni, è possibile aggiornare periodicamente e in modo proattivo tutti i componenti del sistema per assicurarsi che siano le versioni più recenti. Questa pratica è molto più semplice con contenitori che incapsulano componenti più piccoli del sistema rispetto a software tradizionali e voluminosi.

La differenza Docker

Il formato immagine di Docker, le API estese per la gestione dei container e l'innovativo meccanismo di distribuzione del software lo hanno reso una piattaforma popolare sia per i team di sviluppo che per quelli operativi. Docker porta questi notevoli vantaggi a un'organizzazione.

  • Sistemi minimi e dichiarativi. I container Docker danno il meglio se sono piccole applicazioni monouso. Ciò dà origine a contenitori di dimensioni minime, che a loro volta supportano la consegna rapida, l'integrazione continua e la distribuzione continua.
  • Operazioni prevedibili. Il problema più grande delle operazioni di sistema è sempre stato il comportamento apparentemente casuale dell'infrastruttura o delle applicazioni. Costringendoti a fare aggiornamenti più piccoli e più gestibili e fornendo un meccanismo per ridurre al minimo la deriva del sistema, Docker ti aiuta a creare sistemi più prevedibili. Quando le derive vengono eliminate, hai la certezza che il software si comporterà sempre in modo identico, indipendentemente da quante volte lo distribuisci.
  • Ampio riutilizzo del software. I contenitori Docker riutilizzano i livelli di altre immagini, il che promuove naturalmente il riutilizzo del software. La condivisione delle immagini Docker tramite i registri è un altro ottimo esempio di riutilizzo dei componenti, su larga scala.
  • Vera portabilità multicloud. Docker consente una vera indipendenza dalla piattaforma, consentendo ai container di migrare liberamente tra diverse piattaforme cloud, infrastrutture locali e workstation di sviluppo.

Docker sta già cambiando il modo in cui le organizzazioni creano sistemi e forniscono servizi. Sta iniziando a rimodellare il modo in cui pensiamo alla progettazione del software e all'economia della fornitura del software. Prima che queste modifiche attecchiscano veramente, le organizzazioni devono comprendere meglio come gestire la sicurezza e le policy per l'ambiente Docker. Ma questo è un argomento per un altro articolo.

Chenxi Wang è il responsabile della strategia per l'azienda di sicurezza dei container Twistlock.

Il New Tech Forum offre un luogo per esplorare e discutere la tecnologia aziendale emergente in profondità e ampiezza senza precedenti. La selezione è soggettiva, in base alla nostra scelta delle tecnologie che riteniamo importanti e di maggiore interesse per i lettori. non accetta materiale di marketing per la pubblicazione e si riserva il diritto di modificare tutti i contenuti forniti. Invia tutte le richieste a [email protected]