Le immagini Docker sono progettate per essere immutabili, garantendo che una volta create, rimangano invariate. Questa caratteristica contribuisce a creare un ambiente affidabile per sviluppatori e operatori, poiché ogni contenitore istanziato dalla stessa immagine funziona in modo identico. Inoltre, semplifica la gestione di diverse versioni delle immagini. Tuttavia, potrebbero verificarsi casi in cui sia necessario modificare elementi all’interno di un contenitore in esecuzione, ad esempio aggiornando una configurazione o aggiungendo nuovi pacchetti software. In tali scenari, il docker commitcomando è prezioso, poiché consente di preservare le modifiche apportate a un contenitore in esecuzione e di generare una nuova immagine basata su tali modifiche. Questa funzionalità è particolarmente utile per test rapidi, sviluppo iterativo e creazione di immagini personalizzate senza la necessità di una ricostruzione completa.
Comprendere l’immutabilità delle immagini Docker
L’architettura delle immagini Docker prevede più livelli di sola lettura. Quando un contenitore viene eseguito, Docker aggiunge un livello scrivibile, noto come livello del contenitore, al di sopra. Tutte le modifiche avvengono esclusivamente in questo livello superiore. Una volta rimosso il contenitore, tutte le modifiche apportate al suo interno vengono perse, preservando l’integrità dell’immagine originale. Questa progettazione offre diversi vantaggi chiave:
- Comportamento uniforme tra i contenitori derivati dalla stessa immagine, garantendo coerenza.
- Isolamento delle modifiche tra i contenitori per una maggiore prevedibilità.
- Etichettatura sicura di versioni specifiche delle immagini senza preoccuparsi che le modifiche possano avere ripercussioni sulle altre.
Sebbene questa struttura favorisca la stabilità, pone delle sfide quando si tratta di apportare modifiche istantanee a un contenitore in esecuzione. In questo caso, il docker commitcomando si rivela cruciale.
Generazione di una nuova immagine da un contenitore in esecuzione
Utilizzando il docker commitcomando è possibile creare uno snapshot dello stato corrente di un contenitore in esecuzione, con conseguente creazione di una nuova immagine. Questa operazione cattura tutte le modifiche apportate, come applicazioni installate o modifiche alla configurazione, salvandole di fatto in un nuovo livello. L’immagine originale rimane inalterata, consentendo sperimentazioni e iterazioni rapide.

Questa funzionalità è ideale per preservare configurazioni personalizzate per un utilizzo futuro, applicare piccole correzioni durante i test o condividere immagini aggiornate con il team senza dover ripartire da zero. La sintassi generale del docker commitcomando è la seguente:
docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]
In questa sintassi:
-
CONTAINER_ID: ID univoco o nome del contenitore che si desidera catturare. -
NEW_IMAGE_NAME: Nome desiderato per l’immagine appena creata. -
TAG: Parametro facoltativo, il cui valore predefinito è “più recente”.
Il docker commitcomando offre anche diverse opzioni per aggiungere metadati, implementare modifiche alla configurazione e modificare il comportamento del commit. La tabella seguente illustra le opzioni disponibili:
| Opzione | Forma lunga | Descrizione | Esempio |
|---|---|---|---|
| -UN | -autore | Include il nome dell’autore nei metadati dell’immagine. | docker commit -a "Anees"my-container my-image |
| -C | -modifica | Applica istruzioni Dockerfile come ENV, LABEL o CMD alla nuova immagine. | docker commit -c "ENV APP_ENV=prod"my-container my-image |
| -M | -messaggio | Allega un breve messaggio che riassume le modifiche apportate all’immagine. | docker commit -m "Installed curl"my-container my-image |
| -P | -pausa | Mette in pausa il contenitore durante il processo di commit per garantire la coerenza (predefinito: true). | docker commit --pause=false my-container my-image |
Guida passo passo all’utilizzo di docker commit
Per illustrare l’uso pratico di docker commit, supponiamo di voler installare l’utility curl in un container Alpine senza dover modificare il Dockerfile. Inizierai avviando un container dall’immagine base Alpine:
docker run -it alpine:latest /bin/sh
Una volta all’interno del contenitore, eseguire i seguenti comandi per implementare le modifiche necessarie:
apk update && apk add curl

Dopo aver completato le modifiche, uscire dal contenitore:
exit
Successivamente, esegui queste modifiche per creare una nuova immagine:
docker commit <container_id> alpine-with-curl:1.0

Per confermare la creazione della nuova immagine, esegui:
docker images
Ora puoi utilizzare la nuova immagine, in cui curl è preinstallato:

Test della nuova immagine Docker
Una volta creata la nuova immagine, puoi eseguire un contenitore basato su di essa per assicurarti che le modifiche vengano salvate:
docker run -it alpine-with-curl:1.0 /bin/sh
Questo comando apre una shell interattiva all’interno del contenitore generato dall’immagine alpine-with-curl:1.0. Puoi verificare che le modifiche vengano mantenute:
curl --version
L’esecuzione di questo comando confermerà che le modifiche sono intatte nella nuova immagine.

docker commit vs Dockerfile: scegliere lo strumento giusto
Sebbene sia Dockerfile che Dockerfile docker commitfacilitino la creazione di immagini Docker, hanno scopi e applicazioni distinti. Un Dockerfile è l’approccio preferito quando si richiedono build coerenti e riproducibili, particolarmente adatto per scenari di integrazione continua e produzione. Questo metodo fornisce una registrazione chiara e concisa di tutte le modifiche in formato codice, rendendole più facili da gestire, analizzare e controllare nel tempo. Ciò garantisce che qualsiasi build di immagini futura produca gli stessi risultati, il che è fondamentale per il supporto continuo e il lavoro di squadra.
Al contrario, docker commitè vantaggioso per implementare correzioni rapide, eseguire test o apportare piccole modifiche al volo senza dover rielaborare un intero Dockerfile. Questo metodo è particolarmente utile durante la sperimentazione, il debug o la convalida immediata delle modifiche. Tuttavia, a causa della mancanza di documentazione inerente a questo metodo, è più adatto per modifiche temporanee piuttosto che per l’uso in produzione a lungo termine.
In sintesi, utilizzatelo docker commitprincipalmente per la sperimentazione e le correzioni temporanee, affidandovi a Dockerfile per immagini di qualità di produzione. Ampliare la conoscenza di altri comandi Docker essenziali migliorerà anche la vostra esperienza nella gestione di container, immagini e flussi di lavoro integrati.
Lascia un commento