Perché utilizziamo un'immagine di base del sistema operativo con Docker se i contenitori non dispongono di sistema operativo guest?


84

Ho appena iniziato a studiare Docker e c'è qualcosa di abbastanza confuso per me. Come ho letto sul sito Web di Docker, un contenitore è diverso da una macchina virtuale. Come ho capito, un contenitore è solo una sandbox all'interno della quale viene eseguito un intero file system isolato.

Ho anche letto che un container non ha un SO guest installato. Invece si basa sul kernel del sistema operativo sottostante.

Va tutto bene. Ciò che mi confonde è che ci sono immagini Docker che prendono il nome dai sistemi operativi. Vediamo immagini come Ubuntu, Debian, Fedora, CentOS e così via.

Il mio punto è: quali sono quelle immagini, davvero? In che modo è diverso creare un contenitore basato sull'immagine Debian rispetto alla creazione di una macchina virtuale e all'installazione di Debian?

Pensavo che i container non avessero installato SO guest, ma quando creiamo immagini li basiamo su alcune immagini che prendono il nome da un SO.

Inoltre, negli esempi che ho visto quando lo facciamo docker run ubuntu echo "hello world", sembra che stiamo facendo girare una VM con Ubuntu e facendola eseguire il comando echo "hello world".

Allo stesso modo, quando lo facciamo docker run -it ubuntu /bin/bash, sembra che stiamo facendo girare una VM con Ubuntu e accedendo da riga di comando.

Ad ogni modo, come si chiamano quelle immagini che prendono il nome dai sistemi operativi? Quanto è diverso eseguire un container con una di quelle immagini e far girare una VM con il SO guest corrispondente?

È l'idea che condividiamo semplicemente il kernel con il sistema operativo host (e di conseguenza abbiamo accesso alle risorse hardware della macchina sottostante, senza la necessità di virtualizzare l'hardware), ma continuiamo a utilizzare i file e i binari di ogni diverso sistema sui contenitori per supportare qualsiasi applicazione che vogliamo eseguire?


2
Secondo me, i tuoi obiettivi nella virtualizzazione sono le chiavi. Se hai bisogno di librerie, lingue, ecc. Sul sistema operativo, i contenitori del sistema operativo sono adatti alle tue esigenze. Ma se il tuo bisogno è solo un'applicazione come componente, non è necessario usare il sistema operativo come immagine di base. Penso che questo articolo possa spiegarlo chiaramente blog.risingstack.com/…
metamorph

Risposte:


68

Poiché tutte le distribuzioni Linux eseguono lo stesso kernel Linux (sì, è un po 'semplificato) e differiscono solo nel software userland, è abbastanza facile simulare un diverso ambiente di distribuzione - semplicemente installando quel software userland e fingendo che sia un'altra distribuzione. Essendo specifici, l'installazione del contenitore CentOS all'interno del sistema operativo Ubuntu significherà che otterrai la userland da CentOS, mentre esegui ancora lo stesso kernel, nemmeno un'altra istanza del kernel.

Quindi la virtualizzazione leggera è come avere scomparti isolati all'interno dello stesso sistema operativo. Al contrario, la vera virtualizzazione sta avendo un altro sistema operativo completo nel sistema operativo host. Ecco perché la finestra mobile non può eseguire FreeBSD o Windows all'interno di Linux.

Se ciò fosse più semplice, puoi pensare che la docker sia un ambiente chroot molto sofisticato e avanzato.


3
Quindi è per questo che posso ospitare il mio codice Golang compilato nel contenitore Scratch vuoto - perché il codice compilato ha bisogno solo del kernel?
Francis Norton,

Quindi, come fa il SO guest a usare il kernel del SO host (e come farlo)? AFAIK, le basi delle immagini della finestra mobile utilizzano immagini del sistema operativo standard. Nel tuo esempio, non è che esista una build CentOS personalizzata che sappia usare il kernel del genitore? O è semplice come un trucco di file system (aufs) in cui Docker reindirizza le letture / centre degli ospiti (CentOS ') di / boot all'host (Ubuntu)? In tal caso, il guest (CentOS) installerebbe la propria copia di / boot, ma non verrà mai letto?
James S,

Mi piace la tua spiegazione, ma come spieghi allora l'esecuzione di container Linux su Windows? Server 2016 e Windows 10 contengono un kernel Linux per abilitare l'uso di Docker? È per questo che quelle versioni sono necessarie?
duct_tape_coder

Questo è semplice: funzionano semplicemente sotto uno stack di virtualizzazione completo di Hyper-V, all'interno di una VM Linux nativa: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
drookie il

1

I contenitori vengono eseguiti su un singolo kernel. In altre parole, tutti i contenitori hanno un singolo kernel (sistema operativo host). Mentre d'altra parte gli hypervisor hanno più kernals. Ogni macchina virtuale gira su kernel diversi.

E "docker run ubuntu" è proprio come creare un ambiente chroot.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.