Perché adottare Docker. I container e i loro vantaggi.

DevOps

12 Gennaio 2022


Condividi :

| |

Come funziona Docker e perché rende più competitivo il tuo business.

Oggi parleremo di Docker, di come funziona, di quali sono i suoi punti di forza, e delle differenze con le Macchine Virtuali, ma soprattutto quali sono i vantaggi dell’adozione di Docker.

Docker non è solo un tool ma un progetto ed una community open source che permette di creare, testare e distribuire applicazioni con la massima rapidità, attraverso la creazione di container, ovvero pacchetti di software leggeri, autonomi ed eseguibili che includono tutto il necessario per eseguire un’applicazione: codice, runtime, strumenti di sistema, librerie di sistema e impostazioni.

Docker è diventato lo standard per l’implementazione di applicazioni basate sui container.

Docker è uno strumento che permette di containerizzare le applicazioni. Un container è un ambiente isolato dall’ambiente di esecuzione che contiene tutte le librerie, le dipendenze ed i file di configurazione necessari al funzionamento dell’applicazione containerizzata. I container sono originati da un file chiamato immagine, il quale specifica come un container deve essere costruito.

Docker sfrutta gli strumenti di virtualizzazione forniti dal sistema operativo per eseguire i container, ciò lo rende estremamente efficiente in quanto i container condividono il kernel del sistema operativo e le risorse da lui offerte pur mantenendo l’isolamento tra i container. Docker per fornire queste funzionalità utilizzava i Linux Container che forniscono alle app containerizzate le proprie risorse in termini di cpu, I/O, Network e memoria, ora invece utilizza un proprio componente scritto in Go. Inoltre ogni container ha il proprio namespace, quindi ha l’illusione di percepire la macchina tutta per sè.

Prima di spiegare i pro e i contro di Docker scendiamo in dettaglio sulle feature principali.

Le Immagini

Come si crea un container? I container sono originati dalle immagini, un’immagine non è altro che un file dopo sono specificati tutti i passaggi necessari per creare un container. Le immagini sono dichiarate usando una serie di tag che possono accettare uno o più parametri.

Qui potete vedere un esempio d’immagine:

Un aspetto molto importate delle immagini è che possono essere usate come base per creare altre immagini. Utilizzare un’immagine come punto di partenza permette di velocizzare il processo di creazione, tant’è che esistono delle immagini chiamate base-images che costituiscono dei punti di partenza, degli esempi sono l’immagine di ubuntu o di NodeJs.

La costruzione di immagini su Docker è reso efficiente da un sistema di caching molto intelligente, infatti se la vostra immagine utilizza ad esempio Ubuntu come immagine base, Docker prima di scaricarla controllerà che questa non sia già presente nel vostro sistema perchè l’avete già scaricata o perchè un’altra immagine che avete già scaricato utilizza anch’essa Ubuntu come immagine base.

Infatti Docker è in grado di ricicliare eventuali parti in comune che le immagini hanno tra di loro grazie al fatto che le immagine sono costitutite in verità da tanti layer uno sopra l’altro detti anche immagini intermedie, ciò rende le immagin modulari e quindi facili da riutilizzare per altri scopi.

Dockerhub

Le immagini sono essere caricate su Dockerhub, una specie di marketplace per le immagini, chiunque può scaricare ed eseguire un’immagine oppure può usarla come base per una propria. Tipicamente un’immagine su Dockerhub è corredata dal dockerfile e da una piccola speigazione su come utilizzarla. Su Dockerhub oltre alle immaini caricate dagli utenti sono presenti anche le immagini ufficiali di varie tecnologie/sistemi operativi o framework varii, le immagini officiali sono direttamente manutenute da un team di Docker.

E’ possibile rendere le immagini private, cioè accessibili solo dalla propria organizzazione ma è necessario pagare.

Network

Pur essendo isolati dal sistema operativo i container posso comunicare tra di loro attraverso dei canali prestabiliti. Lo strumento principale offerto da Docker per questo scopo sono le network. Quando un container viene creato è possibile scegliere in quali network registrarlo.

Di default i container vengono registrani nella network bridge, tutti i container registrati in questa network giacciono nella stessa subnet e possono comunicare tra di loro. I servizi che vengono offerti dai container possono essere acceduti facendo un binding manuale delle porte esposta dal container con le porte della macchina ospitante. Per fare un esempio è possible far girare in un container nginx che espone la porta 80 e mappare quella porta alla porta 8080 della macchina ospitante, in questa maniera dalla porta 8080 sarà possibile accedere al container nginx sulla porta 80

Un altro network è: host, questa network rimuove l’isolamento tra il network stack della macchine che ospita il container ed il container stesso. Ad esempio è possible create un container che ascolta direttamente la porta 80 del host che ospita docker quindi è come se il container prendesse controllo diretto di quella porta.

Infine il terzo tipo di network alla quale è possibile iscriversi è la network none, la quale isola completamente il container da ogni network.

Volumi

Un’altra caratteristica interessanti dei container è che sono sono volatili, qualsiasi modifica che viene effettuata su di essi mentre sono in esecuzione oppure eventuali fili creati o salvati all’interno del container verranno persi quando il container viene interrotto. Per ottenere la persistenza bisogna ricorrere ai volumi, che sono lo strumento offerto da Docker per garantire la persistenza.

I volumi sono interamente gestiti da Docker, questo li rende facili da gestire e trasferire da una macchina all’altra, possono essere collocati in macchine remote o in servizi cloud (per criptarli) e dal momento che sono entità esterne dai container non aumentano lo spazio richiesto dal container per operare. I volumi insieme alle network forniscono un ottimo strumento per far comunicare i container tra di loro.

I container possono usare i volumi per salvare informazioni o per leggere informazioni. Un utilizzo comune è quello di creare un volume con il codice della vostra app all’interno e poi lasciare al container il compito di compilare ed esporre l’app.

Perché usare Docker

Docker è diventato lo standard di fatto per il deployment delle applicazioni in produzione. I vantaggi che derivano dall’utilizzo dei container sono molti:

  • Facilità di riproduzione degli ambienti. Come abbiamo detto, i container sono dei pacchetti di software che includono tutto quello che serve, inoltre il fatto che siano stateless, quindi non modificabili, ci assicura che quando il software arriva in produzione non ci siano sorprese.
  • Scalabilità. I container sono veloci da avviare, quindi diventa veloce anche scalarli.
  • Efficienza. I container sono molto più leggeri delle VM, a parità di server possone essere eseguite molte più applicazioni.
  • Performance. Docker ha bisogno solo delle resource richieste, mentre le VM spesso hanno bisogno di risorse allocate esclusivamente a loro.
  • Features: i container possono accedere alle funzionalità del sistema operativo a cui la VM non può accedere, per esempio le schede grafiche.
  • Integrabilità. Si integra molto bene nelle pipeline CI/CD, ogni volta che codice viene modificato la pipeline può creare una nuova immagine che viene deployata in un container nella vostra infrastruttura, il tutto in pochi minuti.

Docker VS Virtual Machine

Una VM è un’emulazione di una macchina in tutto e per tutto.
Docker invece condivide con il sistema operativo il Kernel, ai container viene data l’illusione che la macchina sia tutta per loro.
Le VM nonostante tutto forniscono un grado di isolamento più alto, l’hypervisor, ovvero il componente che si occupa di controllare le risorse utilizzate dalla macchina virtuale è molto severo
Docker, dal momento che condivide le funzionalità del sistema operativo ospitante è meno isolato e potenzialmente meno sicuro, infatti eventuali bug sul kernel possono essere sfruttati da un container oppure i container possono sfuggire dall’isolamento ed accedere alla macchina ospitante
Le immagini VM oltre al software dell’applicazione comprendono tutto il sistema operativo. Le immagini Docker non comprendono il sistema operativo, contrariamente alle VM quindi sono molto più leggere delle immagini VM

Conclusioni

I container possiedono delle caratteristiche che li hanno resi lo standard de facto per il deployment delle applicazioni. In primis il fatto che non siano modificabili permette di risolvere uno dei più grandi problemi del mondo IT, rendere riproducibili gli ambienti (staging/QA/produzione). Poter riprodurre gli ambienti ci assicura che le applicazioni vengono sviluppate e testate nello stesso ambiente dove verranno eseguite, assicurando di non avere “sorprese” quando si arriva in production.
Infine, mentre introdurre Docker nel proprio stack non è un processo troppo complicato, gestire i container in produzione è tutt’altra storia. Spesso è richiesta l’adozione di altri strumenti come Docker Swarm o Kuberntes, che richiedono tutt’altra conocenza.
Scegliete quindi con attenzione!

Sito ufficiale di Docker: https://www.docker.com/


Ciao a tutti io sono Alberto, lavoro per The I e sono un DevOps Engineer. Il mio lavoro consiste principalmente nel progettare processi di deployment che si inseriscono nel processi già attivi dei nostri client in modo da efficientare i processi che portano il codice in produzione.