da studente, recentemente ho sentito molto parlare di containerizzazione e virtualizzazione. Questi termini sembrano essere ovunque, che si tratti di sviluppo software, sicurezza informatica, cloud computing e così via. So che strumenti come Docker e Kubernetes sono fondamentali in questo contesto, ma non ho mai avuto l’opportunità di utilizzarli direttamente nei miei studi.
Pertanto, vorrei aprire una discussione che possa illuminarmi su questo tipo di tecnologia, in particolare, mi piacerebbe sapere:
Cos’è un container esattamente?
Quali sono le principali differenze tra un container e una macchina virtuale (VM)?
Perché è importante conoscere e utilizzare strumenti come Docker e Kubernetes oggi?
Apprezzerei molto se qualcuno potesse spiegarmi questi concetti.
Grazie in anticipo!
Cos’è un container?
Semplice è un sistema di virtualizzazione
Principali differenze tra container e VM?
Allora le VM classiche virtualizzano l’intero hardware, quindi va installato l’intero sistema dal kernel in su, invece con i container si virtualizza sopra al kernel del sistema esistente, quindi, per dire, non si può crerare un container windows
Perché è importante conoscere queste piattaforme ?
Premessa Docker è un software per creare container, invece Kubernetes è un orchestratore che serve per gestire meglio un insieme di server docker eccc, detto questo per il mio personalissimo parere serve conoscerli perché esistono, sono interessanti e nei loro campi anche utili.
Domanda interessante, te la sposto in “Sistemi Operativi” dato che questa domanda è una questione su come i sistemi operativi sono costruiti e della loro architettura interna.
Per farla breve però ti posso dire questo: quando utilizzi docker il kernel è lo stesso di quando utilizzi altri programmi, tipo chromium. In altre parole docker ti permette di separare le risorse, sì, ma solo fino ad un certo punto, perché il kernel sottostante è lo stesso. Quindi sei più limitato.
Quando invece virtualizzi sta succedendo una cosa ben più complessa. Oltre al kernel di base, hai del software che gira sopra il kernel di base e che va ad eseguire un altro kernel, quello della macchina virtuale. Quindi c’é molta più separazione, perché anche i dispositivi hardware sono “virtualizzati” (ovvero implementati in software). Come se avessi
Programma in macchina virtuale
Kernel della macchina virtuale
Hardware della macchina virtuale
Kernel della macchina fisica
Hardware
Da notare che l’hardware della macchina virtuale è implementato tramite software. Quindi hai molta più flessibilità, anche se ovviamente le performance sono più limitate del vero e proprio hardware.
Da queste differenze deriva che:
VM molto più pesanti in termine di risorse, ma offrono un grado di protezione maggiore, quindi sono utilizzate per analizzare ransomware e via dicendo.
Docker molto più leggeri, utilizzati per lo sviluppo e il deployment e per qualche tooling che non necessità di troppa separazione dalla macchina sottostante.
A livello tecnico il kernel della macchina virtuale da quel che ricordo gira in un particolare ring level, ovvero non è considerato come un normale programma utente, ma non è neanche considerato come il kernel principale. Come se ci fosse un layer intermedio.
Diciamo che per capire bene questa differenza ti dovresti studiare un bel corso di sistemi operativi avanzati, che lì trattano queste cose.
Ci sarebbe altro da dire, per adesso mi limito a questo.
Ho capito. Quindi in realtà il concetto di container si applica solamente all’interno di una applicazione singola? Nel senso, posso virtualizzare un’intero sistema operativo, ma non posso “containerizzarlo”.
D’altra parte, se volessi avere una sola applicazione virtualizzata, come ad esempio un server web, un container è più che sufficiente.
Mi sembra di capire che un container non è altro che una versione specifica e limitata rispetto ad una VM, ho capito bene?
In modo approssimato sì, in modo tecnico no. Nel senso utilizzano diverse tecnologie, entrambe supportate dal kernel per fare cose diverse appunto. Diciamo che le parole dell’italiano fanno un po’ fatica a descrivere le differenze tra i due.
Considera i container come un servizio che offri al sistema operativo già esistente. È un servizio che permette di creare “nuovi spazi” per le applicazioni, che però alla fine sono gestite dallo stesso kernel. Da qui derivà anche l’utilità dei container per i devs: un container ti permette di avere un nuovo spazio in cui installare le dipendenze specifiche al tuo progetto, senza sporcare lo spazio di altre applicazioni.
Poi anche lì, la questione con docker diventa complessa perché poi docker ha una sua architettura interna con networking etc etc. Ma l’idea di base è questa.
Virtualizzare invece significa introdurre un nuovo kernel, non un nuovo servizio nello stesso kernel.
Ah e per quanto riguarda Kubernetes, lascialo stare per adesso, è troppo complesso e onestamente serve solo in casi particolari. Concentrati sull’imparare bene l’architettura di base dei sistemi operativi, e poi eventualmente quando studi sistemi distribuiti (dopo aver studiato networking) sarai pronto per kubernetes.
come vedi sopra l’Hypervisor, che e’ il sistema operativo che gestisce le macchine compreso l’hardware virtuale ecc…, trovi le macchine virtuali che sono dei veri e propri sistemi operativi, invece sopra al sistema operativo dei container trovi un software che gestisce la comunicazione e l’isolamento dei container dal sistema sottostante senza la necessita’ di ricreare l’intero OS ma appoggiandosi a quello sottostante.