Docker viene gettato nel secchio di virtualizzazione, perché le persone presumono che stia in qualche modo virtualizzando l'hardware sottostante. Questo è un termine improprio che permea dalla terminologia utilizzata da Docker, principalmente il termine container.
Tuttavia Docker non sta facendo nulla di magico in termini di virtualizzazione dell'hardware di un sistema. Piuttosto sta sfruttando la capacità del kernel Linux di costruire "recinzioni" attorno a strutture chiave, il che consente a un processo di interagire con risorse come rete, file system e autorizzazioni (tra le altre cose) per dare l'illusione di interagire con un sistema completamente funzionale.
Ecco un esempio che illustra cosa sta succedendo quando avviiamo un container Docker e quindi lo inseriamo attraverso l'invocazione di /bin/bash
.
$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#
Ora dall'interno di questo contenitore, se eseguiamo ps -eaf
:
Passando a un'altra scheda terminale in cui siamo connessi al sistema host che ospita il contenitore Docker, possiamo vedere lo spazio di processo che il contenitore sta "effettivamente" occupando:
Ora se torniamo alla scheda Docker e lanciamo diversi processi al suo interno e li background tutti, possiamo vedere che ora abbiamo diversi processi figlio in esecuzione con il processo Bash primario che inizialmente abbiamo avviato come parte del lancio del contenitore Docker.
NOTA: i processi sono 4 sleep 1000
comandi in background.
Notare come all'interno del contenitore Docker ai processi sono assegnati ID di processo (PID) di 48-51. Vedili ps -eaf
nell'output anche nel loro:
Tuttavia, con questa immagine successiva, viene rivelata gran parte della "magia" che Docker sta eseguendo.
Vedi come i 4 sleep 1000
processi sono in realtà solo processi figlio del nostro processo Bash originale? Si noti inoltre che il nostro contenitore Docker originale /bin/bash
è in realtà un processo figlio anche per il demone Docker.
Ora, se dovessimo aspettare oltre 1000 secondi per il completamento dei sleep 1000
comandi originali , quindi eseguirne altri 4 nuovi e avviare un altro contenitore Docker in questo modo:
$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#
L'output del computer host da ps -eaf
dovrebbe apparire così:
E altri container Docker, verranno visualizzati come processi nel demone Docker.
Quindi vedi, Docker non sta davvero virtualizzando ( nel senso tradizionale ), sta costruendo "recinzioni" attorno alle varie risorse del Kernel e limitando la visibilità ad esse per un dato processo + figli.