Una volta era impensabile scrivere un software senza che potesse essere installabile da chiunque.
Si creava un .exe .msi .bat o equivalenti et voilà.
Oggi le competenze sono aumentate, ma anche i contesti.
Si può pensare ad una distribuzione per server (intranet o pubblici).
Ci sono anche diverse necessità di aggiornamenti: l'eseguibile contiene spesso le librerie che utilizza, anche se potrebbe avvalersi di librerie che, già presenti, si possono aggiornare o non aggiornare autonomamente.
Per tenere tutto sotto controllo, e facilitare la gestione degli aggiornamenti, sono nate le virtual machine, insieme alla possibilità di gestire tutto in ambienti separati da quello di sviluppo.
Significa che tutto viene eseguito in una scatola indipendente dal computer che la ospita. Richiede molte più risorse di un programmino, ma è un ambiente protetto, controllato, e programmato per aggiornarsi da solo.
Per uscire dalla virtual machine ed entrare nel computer ospitante, o andare in rete, ci sono configurazioni speciali che dipendono da ogni singola virtual machine così come progettata.
Di una virtual machine si realizza una immagine, e si distribuisce quella. Di regola contiene tutte le dipendenze, librerie e sistema operativo compreso (linux).
Un container per semplificare, fa lo stesso ma appoggiandosi al sistema operativo in uso.
Il container nasce per dialogare con altri container (spesso anche più piccoli, talvolta micorservizi, ad esempio un microservizio può contenere mysql), vi è quindi un motore che va configurato per dialogare con gli altri container.
Il container può cadere e ripartire da zero: può perdere tutti i dati se non sono memorizzati altrove, in container pensati per mantenere i dati per la vita del progetto.
Il gestore di container più famoso è Docker, anche se ve ne sono altri simili migliori e altri molto più innovativi che risolvono altri problemi.
La diffusione di docker è tale che annebbia i concorrenti, eccetto quelli con diverse tecnologie.
A proposito di sicurezza si nota che le immagini (di vm o di container) sono realizzate dagli sviluppatori, e contengono dipendenze e configurazioni praticamente non verificabili: ci si fida.