Che aspetto hanno i processi all'interno di un container Docker?


33

Di recente ho sentito confusione su cosa sia un container Docker, e più precisamente cosa succede all'interno, rispetto ai comandi e ai processi che invoco mentre sono all'interno di un container Docker.

Qualcuno può fornire una panoramica di alto livello di ciò che sta accadendo?


3
Sebbene non sia accurato (e perché non ho intenzione di scriverlo come una risposta) trovo più facile pensare alla finestra mobile come un chroot di fantasia piuttosto che come una macchina virtuale. Non è preciso, ma aiuta quando provo a visualizzarlo nella mia testa.
Coteyr,

2
@coteyr - è divertente che tu menzioni quell'analogia, ho usato quella esatta mentre cercavo di descrivere anche quello che sta facendo Docker. Docker IMO ha molto più in comune con chroot che con la virtualizzazione.
slm

Risposte:


53

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:

    SS01

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:

    SS02

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 1000comandi in background.

    SS03

Notare come all'interno del contenitore Docker ai processi sono assegnati ID di processo (PID) di 48-51. Vedili ps -eafnell'output anche nel loro:

    SS04

Tuttavia, con questa immagine successiva, viene rivelata gran parte della "magia" che Docker sta eseguendo.

    SS05

Vedi come i 4 sleep 1000processi 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 1000comandi 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 -eafdovrebbe apparire così:

    SS06

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.


Inoltre, la finestra mobile crea uno spazio utente isolato per container in esecuzione.
Bhargav Nanekalva,

3

All'interno del contenitore, i processi devono essere isolati (messi in quarantena). In effetti non dovresti vedere alcun processo ma quelli che specifichi (almeno una shell). Non è per i test di "socievolezza". L'unica somiglianza con chroot è che viene utilizzato il kernel host. Docker è eccezionale se è necessario isolare qualcosa o utilizzare versioni diverse del software di architettura della piattaforma rispetto a quelle in esecuzione sull'host. (dicono versioni molto vecchie di Java o un fork diverso di Python). Fai attenzione che le cartelle e i file binari con cui hai a che fare potrebbero non essere gli stessi di quelli sull'host. Non è la stessa cartella / bin ecc.

EDIT: somiglianza con chroot piuttosto che con VM.


1
A cura, stavo pensando con un cappello Xen legacy. Chiaramente non è così quando si esegue Windows in KVM / Qemu o si esegue una VM a 64 bit su un host a 32 bit in VirtualBox. (non chiedere). È simile all'argomento pv vs hvm per AWS.
mckenzm,
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.