Mancano i concetti base di Docker. È una cosa completamente diversa.
La prima cosa che devi sapere è la filosofia di Docker: eseguire un processo isolato in un contenitore. Non eseguirai un sistema operativo in un contenitore Docker, eseguirai un processo all'interno di un contenitore con un contenuto di filesystem di root basato su una distribuzione Linux di tua scelta. Ubuntu è una scelta tra gli altri.
Ora dovresti chiederti come è possibile ottenere un processo in esecuzione all'interno di un'immagine di base Linux diversa dalla distribuzione di Linux con cui è in esecuzione il tuo host. Perché un sistema operativo funzioni fondamentalmente è necessario:
- Un filesystem di avvio: contiene il bootloader e il kernel che risiederà in memoria una volta caricato. Non ci importa di questo nel caso dei container Docker perché il kernel è condiviso con l'host ed è la parte comune tra tutte le distribuzioni di Linux.
- Un filesystem di root: contiene la struttura del filesystem. Potrebbe essere diverso da una distribuzione Linux a un'altra. È di sola lettura fino al termine della sequenza di avvio.
Docker utilizza UnionFS per gestire strati di blocchi del disco all'interno di un contenitore in modo da poterli impilare.
Dietro le quinte, utilizza un mount union che consente di montare più filesystem contemporaneamente, apparendo come uno intero virtuale. In effetti, rilascia il livello dell'immagine di base come modalità di lettura-scrittura sopra il file system radice di base in modalità di sola lettura.
Qui hai una pila di blocchi di dischi stratificati in modo tale che la distribuzione di Linux da cui proviene l'immagine di base conterrà lo stesso filesystem una volta installato in un host reale, ma questa volta è all'interno di un container.
L'ultima cosa che manca ora è: come gestisci questa cosa isolata?
La risposta è: spazi dei nomi. Non entrerò nei dettagli qui perché si discosterebbe un po 'dalla domanda originale. Ma quello che devi sapere è che dal kernel 2.4.19, negli anni sono comparsi spazi dei nomi di vario genere. Attualmente sono disponibili i seguenti spazi dei nomi:
- IPC: spazio dei nomi IPC (comunicazioni tra processi)
- MNT: mount namespace
- NET: spazio dei nomi di rete
- PID: spazio dei nomi pid
- UTENTE: spazio dei nomi utente (uid)
- UTS: spazio dei nomi UTS (nomi host)
Gli spazi dei nomi sono strutture isolate all'interno del kernel che consentono ai processi di essere eseguiti con un ambiente particolare. Ad esempio lo spazio dei nomi MNT sarà la caratteristica chiave per ottenere un processo in esecuzione nelle specificità del filesystem di root dell'immagine di base. Lo spazio dei nomi NET sarà un'altra caratteristica chiave per un container che abbia interfacce di rete specifiche per comunicare con il docker bridge ecc.
Quindi, sì, lo scopo principale di tutto questo è eseguire un'applicazione isolata, spedirla dall'ambiente locale alla produzione facilmente con all'interno di una scatola chiamata container.
Sarebbe una buona idea leggere la documentazione della finestra mobile prima di approfondire ulteriormente.