Dalla VM al container

Perché passare dalla macchine virtuali ai container Docker

Facciamo una comparazione tra VM (macchina virtuale) e container. Quali differenze ci sono e quali benefici porta l’adozione di container docker rispetto alle tradizionali macchine virtuali?

Perché siamo passati dalle macchine virtuali al container

La VM è una virtualizzazione di un server fisico, che viene ottenuta emulando completamente l’hardware. Partendo da un mondo “fisico” dove i server erano fatti di pezzi, cavi e viti, la possibilità di virtualizzare un sistema operativo  e creare più macchine sullo stesso hardware, magari facendo un po’ di overbooking sulle risorse, è stata una piccola rivoluzione. Questo ha portato a creare agevolmente ambienti più misurati, dove ogni macchina virtuale svolge un solo ruolo.

Il tempo però ha cambiato il modo di concepire le applicazioni. Siamo passati da ambienti con 1 o 2 server (database + web server) ad architetture molto più complesse. Oggi, per realizzare un applicativo web based è possibile disegnare un architettura con 5-10 server (rontend, backend api, redis per la cache, database RDBS, varnish per la cache, kibana,logstash). Moltiplichiamo questo per N ambienti e capiamo perché spesso e volentieri ci troviamo a lavorare in ambienti di test molto semplificati rispetto alla produzione. Le macchine virtuali sono economiche ma non ne possiamo impiegare troppe senza aumentare i costi. Per “costi” ovviamente intendo non solo il prezzo della VM ( che purtroppo deve allocare alcune risorse come RAM e disco a prescindere dal livello di utilizzo) ma soprattutto quelli di installazione e  manutenzione.

Il passaggio da VM a container è  la soluzione per gestire ambienti dinamici e molto articolati. Immaginiamo di avere una macchina virtuale che consuma risorse solo quando servono e solo la parte di spazio disco legato all’applicativo. Ecco, un container si avvicina molto a questa descrizione. Grazie alla virtualizzazione del sistema operativo, invece che dell’hardware, le risorse sottratte alla macchina host sono limite a quelle effettivamente utilizzate. In più, il disco è concepito in modo da occupare per ciascuna VM soltanto la parte di dati che differiscono dalla macchina “padre (torneremo su questo punto più avanti…), riducendo gli sprechi di disco.

Il container sta sopra il sistema operativo. Il container condivide con la macchina host il kernel e potenzialmente anche librerie. Per motivi di sicurezza le parti condivise dalla macchina host sono in sola lettura per il container. I container sono quindi molto leggeri e, grazie alla condivisione di risorse, permettono un’ottimizzazione del loro utilizzo, riducendo l’onere di creare nuovi ambienti. Queste caratteristiche si traducono nel vantaggio di poter creare ambienti senza troppe scocciature e di replicare tutte le componenti sugli ambienti senza eccessivi oneri sistemistici.

I vantaggi dei container

  • più flessibili
  • facilmente portabili
  • possibilità di testare in locale l’intera archiettura
  • ottimizzazione delle risorse

 

I vantaggi delle macchine virtuali

  • maggiore diffusione\conoscenza
  • possibilità di utilizzare un unica VM per più ruoli (sconsigliato da un punto di vista filosofico, ma nella pratica si fa spesso…)
  • maggiore controllo su cosa succede “dentro”)
  • maggiore facilità di backup \ gestione dei dati

 

VM vs container

  • se sviluppi su un applicazione monolitica, rimani pure sulla VM
  • se stai progettando un applicazione a micro servizi o molto articolata,  Docker è un’ottima soluzione
  • se hai tanti ambienti e vuoi replicare il deploy da zero, docker semplifica molto la vita

danielefontani

Actually CTO in Sintra Consulting s.r.l, I'm senior developer and architect specialized on portals, intranets, and others business applications. Particularly interested in Agile developing and open source projects, I worked on some of this as project manager and developer. My experience include: Frameworks \Technlogies: .NET Framework (C# & VB), ASP.NET, Java, php, Spring Client languages: XML, HTML, CSS, JavaScript, Angular.js,Angular. jQuery Platforms: Sharepoint,Liferay, Drupal Databases: MSSQL, ORACLE, MYSQL, Postgres