Può essere utile distinguere tra immagini e contenitori (documenti). Un'immagine è statico e vive solo su disco. Un contenitore è un'istanza in esecuzione di un'immagine e include il proprio albero dei processi, la RAM e altre risorse di runtime.
Un'immagine è un raggruppamento logico di livelli più metadati su cosa fare durante la creazione di un contenitore e su come assemblare i livelli. Parte di quei metadati è che ogni livello conosce l'ID del suo genitore.
Quindi, cosa va in uno strato? I file (e le directory) che hai aggiunto al genitore. Esistono anche file speciali ("whiteout") che indicano che qualcosa è stato cancellato dal genitore.
Quando docker run
un'immagine, docker
crea un contenitore:decomprime tutti i layer nell'ordine corretto, creando un nuovo file system "root" separato dall'host. docker
legge anche i metadati dell'immagine e avvia il "punto di ingresso" o il "comando" specificato al momento della creazione dell'immagine, che avvia un nuovo sottoalbero del processo. Dall'interno del contenitore, quel primo processo sembra la radice dell'albero, ma dall'host puoi vedere che è un sottoalbero di processi.
Il file system root è ciò che rende una distribuzione Linux diversa da un'altra (possono esserci anche alcune differenze nel modulo del kernel e differenze nel bootloader/file system di avvio, ma di solito sono invisibili ai processi in esecuzione). Il kernel è condiviso con l'host e, di fatto, continua a gestire le sue solite responsabilità all'interno del contenitore. Ma il file system root è diverso, quindi quando ti trovi all'interno del container, sembra che qualunque distro fosse nell'immagine Docker.
Il contenitore non solo ha il proprio file system e albero dei processi, ma ha anche la propria interfaccia di rete logica e, facoltativamente, la propria allocazione di RAM e tempo di CPU. Hai il controllo del contenitore, tuttavia, come operatore, quindi puoi decidere di condividere l'interfaccia di rete dell'host con il contenitore, dargli accesso illimitato a RAM e CPU e persino montare dispositivi, file e directory dall'host nel contenitore. L'impostazione predefinita è mantenere le cose separate, ma hai il potere di infrangere il modello di isolamento quanto necessario.
Docker è un wrapper su LXC Linux Containers e la relativa documentazione ti consentirà di sapere in dettaglio cosa è condiviso e cosa no.
In generale, la macchina host vede/contiene tutto all'interno dei contenitori, dal file system ai processi, ecc. È possibile emettere un comando ps sull'host vm e vedere i processi all'interno del contenitore.
Ricorda che i contenitori docker non sono macchine virtuali, quindi tutto è effettivamente in esecuzione in modo nativo sull'host e utilizza direttamente il kernel dell'host. Ogni contenitore ha il proprio spazio dei nomi utente (simile alle vecchie jail di root). Esistono strumenti/funzionalità che assicurano che i contenitori vedano solo i propri processi, abbiano il proprio file system stratificato sul file system host e uno stack di rete che convoglia allo stack di rete host.