Introduzione a Docker

Intro

In questo articolo andremo ad introdurre Docker soffermandoci su alcune nozioni principali e concluderemo con l’installazione su una macchina Linux, in modo da avere l’ambiente pronto per i prossimi articoli dedicati a Docker.

Docker è una piattaforma software che permette di creare, testare e distribuire applicazioni con la massima rapidità.
Il vantaggio principale di Docker è quello di consentire agli utenti di impacchettare un’applicazione con tutte le sue dipendenze in un unico “contenitore” chiamato container e di eseguirlo con estrema rapidità.

Container

I container sono unità standardizzate che offrono tutto il necessario per la corretta esecuzione delle applicazioni, incluse librerie, strumenti di sistema, codice e runtime. In altre parole è un ambiente che crea un contesto completo per l’esecuzione di un’applicazione.

I contenitori offrono un meccanismo di packaging logico in cui le applicazioni possono essere astratte dall’ambiente in cui vengono effettivamente eseguite. Questo consente di distribuire le applicazioni basate su container in modo semplice e coerente, indipendentemente dal fatto che l’ambiente di destinazione sia un data center privato, un cloud pubblico o persino un laptop personale di uno sviluppatore. Ciò offre agli sviluppatori la possibilità di creare ambienti prevedibili isolati dal resto delle applicazioni e che possono essere eseguiti ovunque.

Container vs. VM

Il container può essere considerato una forma di virtualizzazione: come la macchina virtuale virtualizza l’hardware del server host, i container invece virtualizzano il suo sistema operativo.

Avendo un loro sistema operativo, le macchine virtuali sono ottime per fornire l’isolamento completo dei processi delle applicazioni, ma questo isolamento ha un costo elevato in termini di risorse. Invece con i container, che sfruttano il kernel del SO guest, a discapito di un minor isolamento, si ha la possibilità di eseguire facilmente un gran numero di container su un host senza che questo batta ciglio; infatti, a differenza delle macchine virtuali, i container non hanno un sovraccarico elevato e quindi consentono un utilizzo più efficiente del sistema e delle risorse sottostanti.

Quindi riassumendo, un container, a differenza di una macchina virtuale:

  • non ha bisogno dell’installazione di un sistema operativo
  • non richiede l’allocazione fissa di risorse come RAM e CPU.
  • occupa il minimo spazio indispensabile
  • offre maggior facilità di portabilità

Immagini

Un container Docker a sua volta è un’istanza di un’immagine Docker in fase di esecuzione, quest’immagine rappresenta tutto il contenuto e definisce quale applicativo sarà eseguito all’interno del container.

Un’ immagine Docker:

  • occupa uno spazio di archiviazione minimo e non utilizza alcuna risorsa di sistema
  • è in sola lettura, non può essere modificata dopo la creazione
  • può essere usata per creare un numero illimitato di container simili

Riguardo al secondo punto è utile precisare che è possibile aggiungere modifiche a un’immagine Docker esistente, ma questo creerà una nuova immagine. Proprio per la possibilità di modifica, un’immagine Docker è composta da più livelli di sola lettura: per ogni operazione che porta a una modifica del file system dell’immagine, viene creato un nuovo livello. L’approccio utilizzato è solitamente indicato come “copy-on-write”: un accesso in scrittura crea una copia modificata dell’immagine in un nuovo livello mentre i dati originali rimangono invariati, definendo quindi una struttura a più strati, composti da più immagini intermedie.

Come vedremo le immagini possono essere create ma anche scaricate da repository pubblici come Docker Hub, in modo da avere a disposizione una raccolta di immagini sempre pronte all’uso.

Docker

Docker è un prodotto open source, realizzato in linguaggio Go, disponibile in due versioni principali:

  • Docker CE (Community Edition): gratuito, utilizzabile pienamente come supporto alla containerizzazione;
  • Docker EE (Enterprise Edition): a pagamento, offre certificazioni e supporto nonché elementi architetturali ideali per soluzioni di grande respiro.

Noi ci concentriamo su Docker CE, il più utilizzato dagli sviluppatori perché offre una piattaforma ricca e completa per soluzioni professionali anche di livello notevole;

L’architettura di Docker è basata sul concetto Client-Server, abbiamo infatti:

  • Docker client, non è altro che la riga di comando che consente all’utente di interagire con il server
  • Docker Engine (detto anche dockerd o semplicemente docker server), permette l’esecuzione dei container con le varie applicazioni

È possibile installare un docker client su una macchina remota rispetto al Docker Engine ma solitamente è consigliato utilizzare la stessa macchina per questioni di sicurezza.

Docker quindi viene installato sul server e fornisce semplici comandi con cui creare, avviare o interrompere i container partendo da un’immagine a disposizione. L’installazione è disponibile per ogni tipo di piattaforma:

  • Per MacOS e Windows (e anche per Linux) possiamo installare Docker Desktop
  • Per Linux, ambiente nativo, l’installazione di Docker Engine è disponibile anche mediante pacchetti precompilati disponibili nei repository

Installazione

Configuriamo il repository

Per installare Docker Engine su una nuova macchina host, è necessario prima configurare il repository Docker. 

  • Aggiorniamo l’indice del pacchetto apt e installiamo i pacchetti per consentire l’utilizzo di un repository su HTTPS:
$ sudo apt-get update

$ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  • Aggiungiamo la chiave GPG ufficiale di Docker:
 sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • Utilizziamo il comando seguente per configurare il repository in versione stable.
 $ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Installiamo Docker Engine

  • Ora che il repository è configurato aggiorniamo l’ indice del pacchetto e installiamo l’ ultima versione dei pacchetti necessari
    Se hai necessità di installare una versione precedente consulta la documentazione ufficiale.
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • Una volta terminata l’installazione, abilitiamo docker per fare in modo che il servizio si avviii automaticamente ad ogni riavvio della macchina e verifichiamo che Docker Engine sia installato correttamente eseguendo l’ immagine di test hello-world.
$ systemctl enable docker
$ sudo docker run hello-world

L’ultimo comando scarica un’immagine di prova e la esegue in un contenitore. Quando questo contenitore viene eseguito, stampa un messaggio “hello word” ed esce dall’esecuzione, se questo accade vuol dire che Docker Engine è installato correttamente

N.B. : durante l’ìinstallazione, il gruppo docker viene creato ma non vengono aggiunti utenti. È quindi necessario utilizzare sudo per eseguire correttamente i comandi. Segui il link alla post-installazione di Linux per consentire agli utenti non privilegiati di eseguire i comandi Docker e per altri passaggi di configurazione facoltativi.

Conclusioni

Docker è uno strumento che può arricchire molto il bagaglio culturale di un programmatore. E’ ricco di concetti particolari, ma non bisogna farsi spaventare perché è perfettamente abbordabile, interessante, gratuito e si rende utile sin dai primi momenti di utilizzo. Una volta rotto il ghiaccio con l’utilizzo dei comandi, non si installerà mai più un database, un linguaggio o un tool direttamente sulla propria workstation solo per provarlo: si cercherà un’immagine su Docker Hub, si eseguirà il container e, una volta terminato lo si rimuoverà rapidamente. Poi, raggiunta la dimestichezza necessaria, poche righe di Docker Compose permetteranno di avviare ambienti di lavoro più articolati composti da più elementi.

Approfondiremo questi ed altri concetti nei prossimi articoli dedicati a Docker, restate sintonizzati con noi!

1 commento su “Introduzione a Docker

  1. Pingback: I comandi base di Docker | Fontana Marco IT Consulting

I commenti sono chiusi.