In questa sezione, andremo più in dettaglio su alcuni aspetti, prevalentemente a basso livello, riguardanti le immagini.

Quando scarichiamo un’immagine, ne specifichiamo solo il nome ed in alcuni casi il tag identificativo. Questo può far pensare di aver a che fare con un oggetto unico.

Nella sezione “Com’è fatta un’immagine” abbiamo visto che non è così, siamo a conoscenza del fatto che esiste un meccanismo che compone le immagini per layer successivi.

Tuttavia vale la pene vederlo con i nostri occhi scaricando due release consecutive della stessa immagine. Facciamo un esempio con redis basato su Alpine:

docker image pull redis:5-alpine

ottenendo questo output:

5-alpine: Pulling from library/redis
cbdbe7a5bc2a: Already exists 
dc0373118a0d: Pull complete 
cfd369fe6256: Pull complete 
3e45770272d9: Pull complete 
558de8ea3153: Pull complete 
a2c652551612: Pull complete 
Digest: sha256:83a3af36d5e57f2901b4783c313720e5fa3ecf0424ba86ad9775e06a9a5e35d0
Status: Downloaded newer image for redis:5-alpine
docker.io/library/redis:5-alpine

Già da qui notiamo che vengono scaricati più frammenti e non un blocco unico. Qualcosa dovrebbe già farci sospettare che l’ipotesi dell’immagine a blocco unico comincia a scricchiolare.
Possiamo inoltre vedere già il primo esempio di riuso (dalla riga “cbdbe7a5bc2a: Already exists”). Dato che stiamo utilizzando le versioni Alpine, probabilmente stiamo riutilizzando il layer del kernel Alpine da un’immagine scaricata in precedenza (qui).
Scarichiamo ora la versione 6-alpine con:

docker image pull redis:6-alpine

ottenendo questo output:

6-alpine: Pulling from library/redis
cbdbe7a5bc2a: Already exists 
dc0373118a0d: Already exists 
cfd369fe6256: Already exists 
e5396613619b: Pull complete 
6809b5ad2cd4: Pull complete 
386ecfe54d06: Pull complete 
Digest: sha256:2586f31f74ac1d7dc6f6c7eabca42f09bba5ec9911fc519d55fbd7508a9c4f01
Status: Downloaded newer image for redis:6-alpine
docker.io/library/redis:6-alpine

Qui il riuso diventa evidente. Alcuni “frammenti” della seconda immagine sono stati recuperati dalla cache del repository locale.

C’è da dire che un utilizzatore di Docker alle prime armi, avrebbe potuto lanciare diversi container senza essere consapevole di tale aspetto. Docker rende tale aspetto assolutamente trasparente, ma è indispensabile conoscerlo per evitare situazioni spiacevoli.

Come vengono aggregati i layer?

L’aggregazione dei livelli (layer) avviene mediante il concetto di Union File System.

Mi piacerebbe andare più a fondo sulla questione (parlando di aufs, overlay2, ecc), ma non vorrei andare troppo fuori tema.

Quello che dobbiamo portarci a casa è che ogni layer può aggiungere file, cartelle o metadati al prodotto dei layer precedenti

I layer vengono applicati uno alla volta, in ordine. Al termine dell’applicazione di un layer X, la struttura file risultante sarà la fusione di tutte le modifiche apportate da tutti i layer precedenti e dal layer X. 

Per il container, la struttura file su cui si poggia può essere intesa come un’entità singola.


Prosegui su: Analizzare la struttura di un’immagine

Immagine: Viaggio foto creata da freepik – it.freepik.com