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