Dove sono archiviate le immagini e i contenitori Docker nell'host?

0
45

Docker utilizza due tipi di formati per rappresentare le immagini dei processi in esecuzione, e contenitori, ed entrambi memorizzano i dati sull'unità del computer. Parleremo dei comandi forniti da Docker per la gestione dei dati e di come utilizzarli per accedere a file immagine e contenitore.

La differenza tra Immagini e contenitori

Le immagini sono ciò che crei quando esegui la build docker; sono archiviati in un registro contenitori come l'hub Docker e contengono tutti i file e il codice per eseguire un'app. Puoi pensarli come file ISO per un sistema operativo di una macchina virtuale.

I contenitori sono creati da immagini e sono come la vera macchina virtuale che esegue l'applicazione. Potresti avere più contenitori in esecuzione in parallelo sulla stessa immagine. Ogni contenitore avrà il proprio file system, creato facoltativamente con “volume mount” che legano i dati dall'host al contenitore.

Lavorare con Docker Image Storage

Le immagini memorizzano l'intero contenuto dell'immagine sull'unità. Ogni volta che estrai un'immagine da Internet, questa viene scaricata e archiviata, di solito per sempre. Le immagini possono essere molto grandi, quindi questo può aumentare nel tempo, specialmente per i laptop con spazio di archiviazione limitato.

Se desideri accedere direttamente ai dati dell'immagine, di solito vengono archiviati nelle seguenti posizioni:

  • Linux: /var/lib/docker/
  • Windows: C:ProgramDataDockerDesktop
  • macOS: ~/Library/Containers/com.docker.docker/Data/vms/0/

Pubblicità

Tuttavia, toccare questi dati è probabilmente una cattiva idea. L'archiviazione di Docker è complicata e in realtà varia notevolmente a seconda del driver di archiviazione utilizzato. Linux ora è impostato su overlay2 nella maggior parte delle distribuzioni, che non è nemmeno accessibile per la maggior parte degli utenti finali. Fare confusione con questo può portare alla perdita di dati.

Invece, Docker fornisce comandi gestiti per gestire le immagini. Puoi visualizzare tutte le versioni delle immagini scaricate con un semplice comando:

docker image ls

Fortunatamente, non è così male come sembra, poiché le immagini Docker memorizzano le versioni in modo incrementale. Ciò significa che, ogni volta che scarichi una nuova versione, sostituisce solo le parti che sono state modificate. Se utilizzi spesso la stessa immagine più e più volte, probabilmente non accumulerai troppi costi di archiviazione.

Tuttavia, se utilizzi molte immagini diverse, potresti avere molte immagini salvate che non vengono nemmeno più utilizzate. Per ripulirli, Docker fornisce un comando integrato per eseguire la raccolta dei rifiuti. Questo eliminerà tutte le immagini che non hanno riferimenti, cioè non taggate o non referenziate da alcun contenitore.

docker image prune

Per eliminare tutte le vecchie immagini non utilizzate dai contenitori esistenti, eseguilo con il flag -a:< /p> docker image prune -a

Questo copre il caso d'uso principale, ma ci sono alcuni comandi più utili:

  • inspect: mostra informazioni su una versione del contenitore.
  • save & load: salva e carica le immagini in un archivio tar.
  • rm: rimuove direttamente un'immagine.
  • pull/push: aggiorna da un registro remoto.
  • history : fornisce un registro delle modifiche.

Lavorare con Docker Container Storage

Puoi visualizzare tutte le informazioni su un container con docker inspect, che mostra i driver e i dati del filesystem, nonché tutti i montaggi e i volumi esistenti.

docker inspect containerID

Pubblicità

I contenitori archiviano i dati in due modi. Il primo è il filesystem di base, che viene copiato dall'immagine ed è unico per ogni contenitore. Docker utilizza una “directory inferiore” e “dir superiore,” che sono livelli separati che vengono uniti in un unico filesystem ibrido. La directory inferiore memorizza i dati dell'immagine di base e la directory superiore memorizza tutto ciò che è stato modificato in fase di esecuzione, ad esempio i file di registro. In entrambi i casi, l'archiviazione di questi dipende dal driver del filesystem che Docker è configurato per l'utilizzo.

Poi ci sono i mount, che legano le directory dall'host al contenitore, solitamente gestiti automaticamente con una funzione Docker chiamata volumi. Questi vengono archiviati normalmente e sono accessibili agli utenti finali. Se stai eseguendo qualsiasi lavoro che richieda la modifica dei dati sui contenitori in esecuzione, probabilmente dovresti modificare un volume o eseguire il binding.

Accesso ai volumi

È possibile accedere direttamente ai montaggi di associazione e rappresentano un'ottima scelta se si desidera archiviare la configurazione utilizzata per molti contenitori o archiviare dati accessibili che persistono tra i riavvii del contenitore.

Se si desidera modificare dati archiviati in volumi, puoi farlo anche tu. Sono archiviati in un formato standard accessibile da Linux:

/var/lib/docker/volumes/volumeID/_data

Puoi ottenere l'ID del volume e le informazioni con l'ispezione del volume docker.

Pubblicità

Proprio come le immagini, anche i volumi possono diventare stantii. Puoi rimuoverli facilmente, ma eseguirne il backup e il trasferimento è un processo più complicato.

docker volume prune docker volume rm volumeID

Modifica del filesystem di un contenitore Docker

Se lo desideri per modificare il filesystem del contenitore, proprio come le immagini, questa è una cattiva idea. Nella maggior parte dei casi, dovresti creare una nuova versione del contenitore con le modifiche aggiornate e distribuire un aggiornamento.

Tuttavia, se vuoi apportare alcune modifiche rapide senza fermare il contenitore, il modo migliore è semplicemente aprire una shell bash all'interno del contenitore e modificarla tramite Docker. Farlo è molto semplice—eseguire docker exec sul contenitore e passare “bash” come comando:

docker exec -it container bash

Da qui, sei libero di usare i normali comandi Linux. Se vuoi farlo in remoto, puoi installare un server SSH nel tuo contenitore e associare la porta 22 a un'altra porta sull'host.

RELAZIONATO: Come SSH in un container Docker