Contenitore docker del sistema operativo: qual è la differenza con una macchina virtuale allora?


10

Qual è lo scopo di utilizzare un sistema operativo in un contenitore docker?

Nel repository docker, trovi un'immagine docker di Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Pensavo che Docker fosse più a livello di "app".

Quali sono le differenze tra un contenitore docker Ubuntu e una macchina virtuale Ubuntu? Se hai un intero sistema operativo in un contenitore docker, non è inutile usare Docker allora?

Grazie

Risposte:


11

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.


Grazie, ciò significa che un'immagine "Ubuntu" come questa: register.hub.docker.com/_/ubuntu non ha "senso" da sola e serve da base per un contenitore più definito come un "contenitore nginx"? Non so se abbia senso?
Michael,

Si. Questo è esattamente quello per cui è usato. E di solito sentirai le persone chiamarle immagini di base per questo motivo.
Xavier Lucas,

Ho esaminato la documentazione e c'è una cosa di cui non sono sicuro. Diciamo che la dimensione dell'immagine di Ubuntu è 140 Mb. Quindi, un'altra immagine basata su questa immagine aggiunge altri 10 Mb. Se eseguo 2 contenitori da questa immagine, ogni contenitore sarà 150 Mb e avrò bisogno di 300 Mb di spazio su disco O la dimensione totale rimarrà 150 Mb? Grazie
Michael,

Caspita, ho appena scaricato l'immagine ufficiale di Python e la dimensione virtuale è di 802,4 MB. Il download è durato un po '. Se eseguo 10 container da esso, quanto spazio occuperanno i container? Grazie
Michael,

2
@YAmikep Alcune immagini possono essere grandi a causa di dipendenze non adeguatamente pulite. Se avvii 10 contenitori con la stessa immagine, ciò non significa che lo spazio su disco utilizzato sarà 10 volte più grande dell'immagine. Scarica un'immagine una volta ma la esegui da più contenitori. Docker usa copia su scrittura quando esegue più contenitori dalla stessa immagine, il che significa sostanzialmente che condividerà l'immagine tra contenitori e creerà una copia privata di un file all'interno di un'immagine solo se il contenitore la aggiunge / modifica. Pertanto, la dimensione effettiva utilizzata è collegata all'attività all'interno dei contenitori, non al numero di esecuzioni.
Xavier Lucas,
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.