Tag immagini in ambiente Docker a supporto di uno sviluppo più virtuoso. Per capire meglio i vantaggi associati a questo tipo di approccio fondato sulla containerizzazione è utile inquadrare il contesto.
Che cos’è un’immagine Docker
Un’immagine Docker è un file, composto da più livelli di comandi, utilizzato per eseguire codice in un container Docker . Un’immagine è essenzialmente costruita da una serie di istruzioni che, integrate, vanno poi a costituire la versione completa ed eseguibile di un’applicazione, basata sul kernel del sistema operativo host. Più in dettaglio, un’immagine Docker include gli elementi necessari per eseguire un’applicazione come:
- container
- codice
- file di configurazione
- variabili di ambiente
- librerie
- tempo di esecuzione
A cosa serve un’immagine Docker
Se l’immagine viene distribuita in un ambiente Docker, può essere eseguita come contenitore Docker. Il comando Docker run creerà un contenitore da una data immagine. Quando l’utente Docker esegue un’immagine, può eseguire una o più istanze di quel contenitore. Un caso d’uso per un’immagine Docker è l’intermediazione tra le altre funzioni Docker.
Le immagini Docker sono anche una risorsa riutilizzabile che può essere distribuita su qualsiasi host.
Un container che si sposta da un ambiente Docker a un altro con lo stesso sistema operativo funzionerà senza modifiche, poiché l’immagine include tutte le dipendenze necessarie per eseguire correttamente il codice. Docker utilizzerà le funzionalità di isolamento delle risorse nel kernel del sistema operativo, come cgroups in Linux, per eseguire più container indipendenti sullo stesso sistema operativo.
Tag immagine Docker: cosa sono e come funzionano
I tag immagine sono semplici etichette di testo che classificano o descrivono un’immagine del contenitore Docker. Un tag trasmette informazioni che possono essere, ad esempio, la versione del sistema operativo di base o l’aggiornamento più recente dell’immagine. In questo modo, i tag aiutano gli sviluppatori e gli amministratori a distinguere tra le varie immagini disponibili in un repository.
Gli amministratori IT possono utilizzare i tag immagine per essere più mirati e specifici sui tipi di immagini del contenitore estratti da un repository Docker. I tag immagine Docker svolgono anche un ruolo chiave nel ciclo di vita dello sviluppo, poiché gli sviluppatori possono utilizzarli, ad esempio, per limitare l’uso dell’infrastruttura per una build di sviluppo.
Nozioni di base sulla codifica
I tag sono specificati dopo il nome dell’immagine. Come regola generale, sebbene non sia precisato durante un pull, verrà sempre utilizzato il tag immagine più recente, a meno che gli amministratori non lo sovrascrivano con un tag personalizzato, come sarà approfondito in seguito. Ad esempio, il docker pull ubuntu estrarrà sempre l’ultima versione di Ubuntu per impostazione predefinita. Per estrarre tutte le versioni contrassegnate di un’immagine Ubuntu, si usa:
docker pull ubuntu -a
È anche possibile determinare quali versioni di Ubuntu sono disponibili senza il tag -a. In un browser, si deve utilizzare il seguente URL, supponendo che si stia usando il repository di Docker:
Questo emetterà un file JSON che risulta leggibile (con l’accortezza di usare Firefox per nascondere tutte le voci in eccesso). Ci sono altri modi per farlo anche dalla riga di comando. Per esplorare altri tipi di immagini, basta sostituire la parte “ubuntu” del percorso.
Ubuntu, insieme alla maggior parte delle principali distribuzioni di sistemi operativi, contrassegnerà ogni versione principale in modo simile. Se un’applicazione è stata progettata per Ubuntu 16.04 LTS (supporto a lungo termine), è necessario includere queste informazioni nel pull per ottenere l’ultima immagine disponibile di Ubuntu 16.04, dove “16.04” è solo un semplice tag immagine Docker:
docker pull ubuntu:16.04
Esistono molti altri tag che possono essere sostituiti con altre versioni, come il 18.04.
Se l’applicazione è basata su una specifica versione o sotto-versione della piattaforma, è bene continuare a utilizzare la stessa versione con l’immagine di build più recente, includendo le più recenti correzioni e le misure di sicurezza.
Come contrassegna un’immagine Docker locale
Per taggare un’immagine locale, ovvero che si trova sulla propria macchina, va usato questo comando:
docker tag “image id” image/tag
In questo modo si va a etichettare una versione nota di un’immagine (identificata in modo univoco dall’ID immagine) finalizzata ai propri scopi, come un’immagine base per un prossimo ulteriore utilizzo: quando viene eseguito un pull con quel tag, tramite docker pull image/tag, si farà riferimento a quella specifica immagine. Ricordatevi che queste modifiche interessano solo il proprio ambiente, non quelli altrui.
Quando sono disponibili diverse versioni del Dockerfile di build, è utile taggare le build di immagine. Se uno sviluppatore ha diverse versioni di un’applicazione come, ad esempio, le versioni per la produzione, il test e lo sviluppo, bisogna definire un modo per specificare quale sia l’immagine che esegue il pull. Per applicare un tag immagine Docker a una build, utilizzare l’opzione -t. L’esempio qui di seguito crea un tag di “myapp_debug” sull’immagine:
docker build -t myapp:debug -f Dockerfile.debug .
Per ripetere questo processo per la build di produzione, utilizzare un tag di “myapp_production” dalla cartella Dockerfile di produzione.
La riga di comando può contenere più tag tramite l’uso ripetuto dell’opzione -t. Per esempio:
docker build -f dockerfiles/Dockerfile.debug -t myapp_debug -t appv2 .
Tutte le righe di comando precedenti sono configurate e utilizzate localmente. Per inviare l’immagine a un repository remoto, in loco o basato su cloud, utilizzare docker push, supponendo che si disponga di un account Docker.
Dopo aver completato questi passaggi, eseguire un pull con il comando:
docker pull ;account/repo_name:myapp_debug
In questo modo, per impostazione predefinita, verrà disattivata l’ultima versione dell’immagine contrassegnata con “myapp_debug“.
Contenitore Docker e immagine Docker: le differenze
Un’immagine Docker è più o meno equivalente a uno snapshot tipici degli ambienti virtualizzati. A tutti gli effetti è un record di una macchina virtuale Docker, o container Docker, in un determinato momento. Idealmente, un’immagine Docker è come un’immagine digitale: il container Docker può essere visto come una stampa di quell’immagine. Le immagini Docker hanno la caratteristica speciale di essere immutabili. Non possono essere modificate, ma possono essere duplicate e condivise o eliminate. L’immutabilità è utile quando si testano nuovi software o configurazioni perché, qualunque cosa accada, l’immagine rimane intatta, utilizzabile come sempre.
Repository di immagini Docker
Gli utenti Docker possono archiviare immagini in repository privati o pubblici e da lì possono distribuire contenitori, testare immagini e condividerle. Docker offre Docker Hub, un servizio di registrazione basato su cloud che include archivi di immagini pubblici e privati. Ha anche Docker Trusted Registry, che aggiunge funzionalità di gestione delle immagini e controllo degli accessi. Le immagini ufficiali sono prodotte direttamente da Docker, mentre le immagini della comunità sono create dagli utenti Docker. Gli esperti sottolineano di fare attenzione al concetto di immagine più recente che può creare confusione. Le immagini Docker contrassegnate con “: latest” non sono necessariamente le ultime in senso letterale. Il tag più recente non fa riferimento alla versione di un’immagine inviata più di recente. In effetti, è semplicemente un tag predefinito.
Attenzione alla sicurezza della programmazione
Un’immagine esistente può essere utilizzata anche per creare una nuova immagine. Inoltre, gli utenti possono caricare la propria immagine personalizzata nell’hub Docker utilizzando il comando push docker. Per garantire la qualità delle immagini della comunità, Docker esamina l’immagine e fornisce feedback all’autore dell’immagine prima della pubblicazione. Una volta pubblicata, l’autore dell’immagine è responsabile degli aggiornamenti. Usare dunque una certa cautela quando si acquisisce un’immagine da un’altra parte, poiché gli aggressori possono accedere a un sistema tramite immagini clonate progettate per indurre un utente a pensare che provengano da una fonte attendibile.