Tutti gli articoli

docker

Immagine Docker vs container: qual è la differenza?

Una guida in parole semplici a immagini e container Docker, con la differenza pratica che conta quando pubblichi app su un server.

  • docker
  • principianti
  • deploy
Una scheda Docker image a livelli punta con una freccia verde a una scheda container in esecuzione con una spia di stato su una linea di server.

Quando si apre Docker per la prima volta, la presenza contemporanea di immagini e container può generare confusione, dando l'impressione che la medesima applicazione sia elencata due volte senza una ragione apparente[cite: 1].

In breve: un'immagine Docker è la ricetta impacchettata di un'applicazione, mentre un container Docker è l'istanza operativa generata da tale ricetta. Nel confronto tra le due entità, l'immagine rappresenta il modello riutilizzabile e statico; il container costituisce l'elemento concreto che utilizza CPU, memoria, storage, porte e connettività di rete sul server.


Che cos'è un'immagine Docker?

Un'immagine Docker può essere assimilata a un kit per la preparazione di un pasto.

Contiene tutti gli ingredienti e le istruzioni necessari al funzionamento dell'applicazione: il codice sorgente, il runtime di dipendenza, le librerie di sistema e le configurazioni predefinite. L'immagine in sé è inattiva: rimane archiviata e pronta all'uso.

Ad esempio, un'immagine per un'applicazione Node.js include l'ambiente Node.js, i file di progetto e le dipendenze di base. Un'immagine PostgreSQL, invece, racchiude il motore del database e la sua struttura fondamentale.

L'immagine rappresenta una matrice immutabile. Può essere salvata, trasferita, scaricata dai registry o riutilizzata più volte. Nessun processo viene eseguito finché Docker non crea ed avvia un container a partire da essa.

Questo rende le immagini uno strumento fondamentale per il deployment. Anziché ricompilare o configurare l'applicazione manualmente su ogni ambiente, si distribuisce la medesima struttura impacchettata. Per una panoramica generale sull'architettura, è possibile consultare la guida a Docker su un server.


Che cos'è un container Docker?

Un container Docker rappresenta l'esecuzione concreta dell'immagine.

Proseguendo con l'analogia, se l'immagine è il kit di ingredienti, il container è il piatto in fase di preparazione. Esso impiega risorse reali quali cicli di CPU, RAM, operazioni di I/O su disco, socket di rete e porte logiche.

È possibile avviare molteplici container basati sulla medesima immagine. Pur condividendo il medesimo modello di partenza, ogni container in esecuzione mantiene uno stato isolato: uno può erogare il traffico web di produzione, un secondo fungere da ambiente di test e un terzo arrestarsi a causa di un errore di configurazione.

Questo isolamento è rilevante in fase di diagnosi dei guasti. Un container può interrompersi, riavviarsi, esaurire lo spazio disco assegnato, fallire gli health check o non raggiungere il database. L'immagine di origine rimane tuttavia integra; l'anomalia risiede nell'istanza in esecuzione.

L'analisi dei log si riferisce quasi sempre al comportamento del container avviato. Per approfondire la consultazione delle tracce di sistema, è disponibile la guida su come leggere i log del server quando qualcosa si rompe.


Immagine Docker vs container: cosa cambia davvero?

La differenza fondamentale risiede nello stato.

L'immagine è progettata per essere statica, immutabile e replicabile. Il container è un'entità dinamica e mutabile che gestisce I/O, accetta connessioni di rete, può generare errori o interagire con altri servizi.

CaratteristicaImmagine DockerContainer Docker
DefinizioneModello impacchettato dell'applicazioneIstanza in esecuzione generata da un'immagine
Stato operativoInattivaAttiva (quando avviata)
Uso di CPU/RAMNessunoConsumo effettivo di risorse di sistema
MolteplicitàMatrice riutilizzabileMolteplici container da una singola immagine
Punti di errore a runtimeIntegrità del modelloPorte, variabili d'ambiente, file system, rete, permessi

Questa distinzione è cruciale durante le procedure di aggiornamento.

Il download o la build di una nuova versione di un'immagine non aggiorna automaticamente l'applicazione in produzione. Il container in esecuzione continuerà a utilizzare il vecchio layer finché non verrà arrestato e ricreato. Aggiornare l'immagine equivale a sostituire il progetto su carta, non la struttura già edificata.

Comprendere tale separazione è fondamentale anche per l'ottimizzazione dello spazio su disco. Le immagini obsolete tendono ad accumularsi nello storage, così come i container fermati mantengono i propri layer scrivibili. Sebbene correlati, costituiscono elementi distinti nell'allocazione delle risorse.


Perché si tendono a confondere immagini e container?

La confusione deriva dal livello di astrazione offerto da Docker.

Nelle architetture tradizionali, l'installazione del software avveniva direttamente sul sistema operativo host, fondendo codice, dipendenze, configurazioni e processo in esecuzione in un unico contesto. Docker scompone questa struttura in livelli separati: l'immagine statica, l'istanza containerizzata, il volume di storage e la rete virtuale.

Questa architettura multilivello garantisce isolamento, ma può indurre in errore durante le prime fasi di utilizzo:

  • Eliminare un container non comporta la cancellazione della relativa immagine.
  • Eseguire la build di un'immagine non modifica i container attivi.
  • Riavviare un container privo di volumi dedicati comporta la perdita dei dati scritti nel layer temporaneo.

Lo storage persistente (volumi o bind mount) è progettato per garantire la permanenza dei dati indipendentemente dal ciclo di vita del container. Database, upload degli utenti e file generati richiedono una gestione separata; in caso contrario, la ricreazione dell'istanza comporta il ripristino allo stato iniziale dell'immagine.

Il medesimo principio di isolamento si applica quando si gestiscono più servizi sul medesimo server. Senza una corretta perimetrazione di porte, volumi e variabili, si rischiano conflitti tra le applicazioni. Questo tema è trattato nell'approfondimento su come ospitare più siti web su un solo server.


FAQ

Un'immagine Docker può essere eseguita direttamente?

No. Un'immagine deve essere istanziata sotto forma di container per poter eseguire i relativi processi.

È possibile avviare più container dalla stessa immagine?

Sì. Una singola immagine può fungere da matrice per la creazione di N container isolati tra loro.

L'eliminazione di un container rimuove anche l'immagine di origine?

No. L'immagine rimane presente nel repository locale del server e può essere riutilizzata per istanziare nuovi container.

L'aggiornamento di un'immagine modifica automaticamente i container in esecuzione?

No. I container attivi mantengono la versione dell'immagine con cui sono stati avviati; devono essere ricreati esplicitamente per applicare le modifiche.

Dove vengono archiviati i dati scritti dall'applicazione?

Dipende dalla configurazione. I dati che necessitano di persistenza devono essere allocati su volumi Docker o bind mount, evitando la scrittura nel layer temporaneo ed effimero del container.


La gestione strutturata

Un Server Manager semplifica la gestione dell'infrastruttura mantenendo distinte le immagini, le istanze in esecuzione e le risorse di storage collegate. Ciò riduce il rischio di scambiare il download di un'immagine con il deployment effettivo, o di rimuovere accidentalmente volumi dati in fase di manutenzione.

Questo approccio garantisce chiarezza operativa anche nel lungo periodo. Risulta più agevole tracciare l'associazione tra container, domini, porte esposte e percorsi di storage. Si evitano così le problematiche tipiche di un utilizzo non strutturato di Docker: sovrapposizione di porte, perdita di dati inaspettata e configurazioni non documentate.

Si mantengono i vantaggi nativi della containerizzazione — quali la riproducibilità e la portabilità delle applicazioni — evitando la complessità derivante dalla mancanza di visibilità sull'ambiente.


Sintesi operativa

  • Immagine Docker: è il modello immutabile (la ricetta).
  • Container Docker: è l'istanza di processo in esecuzione (il pasto pronto).

Distinguere questi due concetti semplifica le attività di manutenzione e risoluzione dei problemi. Le immagini definiscono cosa deve essere eseguito; i container rappresentano l'esecuzione stessa, unitamente alla gestione di rete, memoria, log e persistenza dei dati.