[Nota, questa risposta si concentra sui contenitori Linux e potrebbe non essere completamente applicabile ad altri sistemi operativi. ]
Cos'è un container?
È un'app : un contenitore è un modo per eseguire applicazioni isolate l'una dall'altra. Piuttosto che virtualizzare l'hardware per eseguire più sistemi operativi, i container si basano sulla virtualizzazione del sistema operativo per eseguire più applicazioni. Ciò significa che puoi eseguire più contenitori sullo stesso hardware rispetto alle VM perché hai solo una copia del sistema operativo in esecuzione e non è necessario preallocare la memoria e i core della CPU per ogni istanza della tua app. Proprio come qualsiasi altra app, quando un contenitore ha bisogno della CPU o della memoria, le alloca e quindi le libera al termine, consentendo ad altre app di utilizzare le stesse risorse limitate in un secondo momento.
Sfruttano gli spazi dei nomi del kernel : ogni contenitore per impostazione predefinita riceverà un ambiente in cui i seguenti sono spazi dei nomi:
- Mount: filesystem,
/
nel contenitore sarà diverso /
dall'host.
- PID: ID processo, pid 1 nel contenitore è l'applicazione avviata, questo pid sarà diverso se visualizzato dall'host.
- Rete: i contenitori vengono eseguiti con la propria interfaccia di loopback (127.0.0.1) e un IP privato per impostazione predefinita. Docker utilizza tecnologie come le reti bridge Linux per connettere più container insieme nella propria lan privata.
- IPC: comunicazione tra processi
- UTS: include il nome host
- Utente: puoi opzionalmente spostare tutti gli ID utente in modo che vengano compensati da quello dell'host
Ognuno di questi spazi dei nomi impedisce inoltre a un contenitore di vedere cose come il filesystem o i processi sull'host o in altri contenitori, a meno che non rimuova esplicitamente quell'isolamento.
E altri strumenti di sicurezza di Linux : i contenitori utilizzano anche altre funzionalità di sicurezza come SELinux, AppArmor, Capabilities e Seccomp per limitare gli utenti all'interno del contenitore, incluso l'utente root, dalla possibilità di sfuggire al contenitore o avere un impatto negativo sull'host.
Creare un pacchetto delle app con le relative dipendenze per la portabilità : il confezionamento di un'applicazione in un contenitore implica l'assemblaggio non solo dell'applicazione stessa, ma di tutte le dipendenze necessarie per eseguire tale applicazione, in un'immagine portatile. Questa immagine è il filesystem di base utilizzato per creare un contenitore. Poiché stiamo isolando solo l'applicazione, questo filesystem non include il kernel e altre utilità del sistema operativo necessarie per virtualizzare un intero sistema operativo. Pertanto, un'immagine per un contenitore dovrebbe essere notevolmente più piccola di un'immagine per una macchina virtuale equivalente, rendendo più rapida la distribuzione ai nodi attraverso la rete. Di conseguenza, i contenitori sono diventati un'opzione popolare per la distribuzione di applicazioni nel cloud e nei data center remoti.
Può sostituire una macchina virtuale dedicata allo sviluppo?
Dipende : se il tuo ambiente di sviluppo esegue Linux e non hai bisogno di accedere ai dispositivi hardware, o è accettabile avere accesso diretto all'hardware fisico, allora troverai una migrazione a un contenitore Linux abbastanza semplice. L'obiettivo ideale per un contenitore Docker sono applicazioni come API basate sul Web (ad esempio un'app REST), a cui si accede tramite la rete.
Qual è lo scopo, in parole semplici, dell'utilizzo di Docker nelle aziende? Il vantaggio principale ?
Dev o Ops : Docker viene in genere portato in un ambiente in uno dei due percorsi. Sviluppatori che cercano un modo per sviluppare e testare localmente più rapidamente la loro applicazione e operazioni che cercano di eseguire più carico di lavoro su meno hardware di quanto sarebbe possibile con le macchine virtuali.
O Devops : uno degli obiettivi ideali è sfruttare Docker immediatamente dallo strumento di distribuzione CI / CD, compilare l'applicazione e creare immediatamente un'immagine che viene distribuita a sviluppo, CI, prod, ecc. I contenitori spesso riducono il tempo per spostare l'applicazione dal check-in del codice fino a quando non è disponibile per il test, rendendo gli sviluppatori più efficienti. E se progettata correttamente, la stessa immagine che è stata testata e approvata dagli sviluppatori e dagli strumenti CI può essere distribuita in produzione. Poiché quell'immagine include tutte le dipendenze dell'applicazione, il rischio di interruzioni nella produzione che hanno funzionato durante lo sviluppo sono notevolmente ridotti.
Scalabilità : un ultimo vantaggio chiave dei contenitori che menzionerò è che sono progettati per la scalabilità orizzontale in mente. Quando si dispone di app senza stato sotto carico pesante, i contenitori sono molto più facili e veloci da scalare in orizzontale grazie alle dimensioni dell'immagine più piccole e al ridotto overhead. Per questo motivo vedi che i contenitori vengono utilizzati da molte delle più grandi società basate sul Web, come Google e Netflix.