Abbiamo già parlato di Compute Engine, l'offerta IaaS di Google Cloud con accesso a server, file system e reti, e di App Engine, l'offerta PaaS di Google Cloud. In questa sezione del corso, esploreremo i container e ti aiuteremo a capire come si usano. L'Infrastructure as a Service, o IaaS, consente di condividere le risorse di calcolo con altri sviluppatori usando macchine virtuali per virtualizzare l'hardware. Ciò consente a ogni sviluppatore il deployment del proprio sistema operativo, l'accesso all'hardware e la creazione di app in un ambiente autonomo con accesso a RAM, file system, interfacce di rete, ecc. È qui che entrano in gioco i container. La funzione di un container è fornire la scalabilità indipendente dei carichi di lavoro in PaaS e il livello di astrazione di sistemi operativi e hardware in IaaS. Un sistema configurabile consente di installare il tuo runtime, server web, database o middleware preferito, configurare risorse di sistema sottostanti, come spazio su disco, I/O del disco o reti, e creare a tuo piacimento. Ma la flessibilità ha un costo. L'unità di computing più piccola è un'app con la sua VM. Il sistema operativo guest potrebbe essere di vari GB di dimensione e richiedere alcuni minuti per l'avvio. Con l'aumento della domanda della tua app, devi copiare un'intera VM e avviare il sistema operativo guest per ogni istanza, il che può essere lento e costoso. Con App Engine, puoi accedere ai servizi di programmazione, quindi devi solo scrivere il codice in carichi di lavoro autonomi che usano questi servizi e includono eventuali librerie dipendenti. Ciò significa che con l'aumento della domanda della tua app, la piattaforma scala l'app in modo continuo e indipendente in base al carico di lavoro e all'infrastruttura. Puoi scalare rapidamente, ma non ottimizzare l'architettura sottostante per risparmiare sui costi. Un container è una scatola invisibile che racchiude il codice e le dipendenze con accesso limitato alla partizione del file system e all'hardware. Per crearlo bastano poche chiamate di sistema e si avvia rapidamente come un processo. Su ogni host serve solo un kernel del sistema operativo che lo supporti e un runtime del container. In sostanza, il sistema operativo viene virtualizzato. È scalabile come un sistema PaaS, ma è quasi flessibile come un sistema IaaS. Ciò rende il codice ultra portatile e sistema operativo e hardware possono essere trattati come black box. Puoi passare dallo sviluppo alla gestione temporanea, alla produzione o dal laptop al cloud, senza modificare o ricreare nulla. Ad esempio, immaginiamo di voler scalare un server web. Con un container puoi farlo in pochi secondi, con decine o centinaia di deployment, a seconda delle dimensioni o del carico di lavoro, su un singolo host. Questo è solo un esempio di scalabilità di un container che esegue l'intera app su un singolo host. Probabilmente, però, vorrai creare le tue app utilizzando molti container, ognuno dei quali esegue la propria funzione, come con i microservizi. Se crei app in questo modo e le colleghi alle connessioni di rete, puoi renderle modulari, di facile deployment e scalabili in modo indipendente su un gruppo di host. Gli host possono fare scale up e scale down e avviare e arrestare i container in base alla domanda dell'app o agli errori degli host.