Cos’è la containerizzazione?
La containerizzazione è una tecnologia di virtualizzazione leggera che consente di eseguire e isolare le applicazioni e i processi, in ambienti virtuali autonomi chiamati "container". Un container rappresenta un ambiente di esecuzione isolato, contenente l'applicazione, le librerie e le risorse necessarie per il suo funzionamento. Ciò consente di eseguire applicazioni in modo efficiente e affidabile su diverse piattaforme, senza dover preoccuparsi delle differenze nell'ambiente di esecuzione sottostante.
In altre parole: la containerizzazione permette di confezionare un'applicazione insieme a tutte le sue dipendenze in un pacchetto singolo, chiamato container, che può essere eseguito su qualsiasi sistema operativo o infrastruttura, che supporti la tecnologia di containerizzazione utilizzata (ad esempio, Docker o Kubernetes).
Le principali caratteristiche della containerizzazione includono:
- Isolamento: ogni container è isolato dagli altri, il che significa che le applicazioni contenute in esso possono eseguire senza interferire con altre applicazioni o risorse sul sistema host.
- Portabilità: i container sono indipendenti dal sistema operativo e dall'infrastruttura sottostante, quindi possono essere facilmente spostati e distribuiti su diverse piattaforme, senza dover modificare il codice dell'applicazione.
- Rapido avvio e arresto: i container possono essere avviati e arrestati molto rapidamente, permettendo una scalabilità rapida ed efficiente delle applicazioni.
- Riduzione delle risorse: poiché i container condividono il kernel del sistema host, richiedono meno risorse rispetto alle tradizionali macchine virtuali, dove è necessario eseguire un sistema operativo completo per ciascuna istanza.
- Versionamento e gestione semplificata: la containerizzazione consente di gestire e versionare le applicazioni in modo più semplice, garantendo coerenza tra ambienti di sviluppo, test e produzione.
La containerizzazione è estremamente popolare per lo sviluppo di applicazioni, soprattutto nel contesto di architetture a microservizi, poiché semplifica il processo di sviluppo, distribuzione e gestione delle applicazioni, consentendo di ottenere un'infrastruttura più flessibile, scalabile e resiliente.
Cos’è la virtualizzazione?
La virtualizzazione è una tecnologia che consente di creare e gestire ambienti di esecuzione virtuali, noti come "macchine virtuali" (VM), all'interno di un unico sistema fisico detto "host". Ogni macchina virtuale funge da un computer autonomo con il proprio sistema operativo, risorse hardware e applicazioni, ma condivide le risorse fisiche dell'host con altre macchine virtuali.
In altre parole, la virtualizzazione permette di eseguire più sistemi operativi e le loro applicazioni in modo simultaneo sullo stesso hardware fisico, creando un ambiente isolato per ciascuna macchina virtuale. Questo approccio consente di sfruttare al massimo le risorse hardware, ottimizzando l'utilizzo della CPU, della memoria e dello spazio su disco.
Le principali caratteristiche della virtualizzazione includono:
- Isolamento: ogni macchina virtuale è completamente isolata dalle altre, il che significa che le modifiche o i problemi su una VM non influiscono sulle altre.
- Compatibilità multi-piattaforma: le macchine virtuali possono essere eseguite su diversi sistemi operativi e hardware, rendendo più facile il porting delle applicazioni tra ambienti diversi.
- Snapshot e clonazione: la possibilità di creare snapshot e clonare macchine virtuali consente di creare copie esatte di ambienti per scopi di backup, test o distribuzione.
- Gestione centralizzata: le piattaforme di virtualizzazione offrono strumenti per la gestione centralizzata delle macchine virtuali, semplificando l'orchestrazione e il controllo delle risorse.
- Migrazione e bilanciamento del carico: Le VM possono essere facilmente spostate tra diversi host fisici per ridistribuire il carico o per operazioni di manutenzione, garantendo continuità di servizio.
La virtualizzazione è ampiamente utilizzata in diversi contesti, come lo sviluppo di software, la gestione di server, l'ambito aziendale e il cloud computing. Le piattaforme di virtualizzazione più note includono VMware, Microsoft Hyper-V e KVM (Kernel-based Virtual Machine) per ambienti Linux. Questa tecnologia è stata un importante passo avanti nella semplificazione della gestione delle risorse informatiche e ha contribuito a ridurre i costi e migliorare l'efficienza delle infrastrutture IT.
Cosa succede oggi nella realtà?
Nel panorama attuale è abbastanza comune avere macchine virtualizzate (VM) su cui vengono poi usati dei container, in un sistema di “scatole” su “scatole” , che permette di avere sistemi sempre più flessibili e resistenti. Una volta che si ha una VM (virtual machine) si ha in pratica un approccio operativo, molto simile a quello di avere una macchina fisica. Si possono ovviamente avere degli snapshot e una rapido accesso al restore dei backup, però il plus di tecnologie come docker, che permettono isolamento e maggiore velocità nelle operazioni di rilascio di cambiamenti al codice anche molto consistenti, non ha pari.
Un caso reale
Nel lavoro di tutti i giorni, mi trovo ad utilizzare sul mio Mac Docker Desktop un'applicazione sviluppata da Docker, Inc. che offre una buona esperienza di sviluppo, con molti strumenti per gestire i container Docker, su sistemi operativi Windows e macOS. Progettata per semplificare il processo di creazione, gestione e distribuzione di container Docker su desktop locali, rendendo la containerizzazione accessibile e facile a qualunque elemento del team, qualsiasi sia la sua formazione. Questa soluzione, solitamente molto valida, ha mostrato un po’ di pecche su un paio di progetti al limite, costringendomi a trovare un’altra soluzione. È lì che mi sono interessato a Multipass Run.
Il vantaggio di Multipass.run
Con multipass.run ho potuto crearmi in maniera asciutta e senza fronzoli, tramite shell, una VM Ubuntu in maniera molto veloce. Questa Virtual machine ha il vantaggio di essere una “vera” macchina ubuntu, che replica molto più fedelmente quello che poi mi ritrovo spesso in produzione, ovvero una docherizzazione su macchine virtuali.
Facciamo un mini progetto assieme!
Andiamo su sito https://multipass.run/ e iniziamo a spulciare un po’ di documentazione.
Scopriamo inanzitutto come installare multipass.run sullla nostra macchina
Se abbiamo MacOs, ci basterà usare il gestore di pacchetti Brew. Non avendo testato su Windows, riporto solo la soluzione sperimentata su mac, lasciando agli utenti di windows testare in autonomia l’ottima documentazione.
brew install --cask multipass
Potremmo aver bisogno di usare una VM abbastanza corposa, quindi meglio saper usare da subito il comando di creazione della macchina, che ci permette di specificare cpu, ram e dimensione hd.
multipass launch --cpus 2 --disk 10G --memory 2G
Otterremo quindi il nome della nostra macchina, nel mio caso: discerning-goldfinch
Entriamo nella nostra VM
multipass shell discerning-goldfinch
usiamo
sudo su
per diventare utente con accessi di amministratore, ed installiamo docker e docker compose
# Install Docker
apt-get -y update
apt-get -y install ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get -y update
apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
#install docker compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#install doacker
sudo curl -L https://github.com/lotrekagency/doacker/archive/master.tar.gz | tar xvfz - --strip 2 -C /usr/local/bin/
Adesso possiamo copiare il nostro progetto velocemente con il comando multipass transfer, qui per continuare con il nostro esempio, creeremo un banalissimo docker-compose.yml, che ci permetterà ditirare su un’istanza di nginx su porta 80
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx_container
ports:
- "80:80"
multipass transfer /percorso-completo-del-file/docker-compose.yml discerning-goldfinch:/home/ubuntu
lanciamo quindi
docker compose up -d
recuperiamo con
multipass list
l’ip della vm che abbiamo creato, nel mio caso 192.168.64.6
andiamo nel nostro browser, inseriamo l’indirizzo ip della VM, ed ecco rispondere nginx
In soldoni
Abbiamo appena appena toccato la superficie di multipass.run, uno strumento molto veloce per creare agilissime VM ubuntu, su cui poter testare piuttosto fedelmente e facilmente i nostri progetti. Sicuramente una freccia in più, leggera e flessibile, al nostro Arco.