Docker utilizza due tipi di formati per rappresentare i processi in esecuzione:immagini e contenitori, ed entrambi archiviano 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 di immagini e contenitori.
La differenza tra immagini e contenitori
Le immagini sono ciò che crei quando esegui docker build
; sono archiviati in un registro contenitori come Docker Hub 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 vengono creati dalle immagini e sono come la vera macchina virtuale che esegue l'applicazione. Potresti avere più contenitori in esecuzione in parallelo sulla stessa immagine. Ogni container avrà il proprio file system, opzionalmente creato con "montaggi di volume" che legano i dati dall'host al container.
Lavorare con Docker Image Storage
Le immagini memorizzano l'intero contenuto dell'immagine sull'unità. Ogni volta che estrai un'immagine da Internet, viene scaricata e archiviata, di solito per sempre. Le immagini possono essere molto grandi, quindi questo può aumentare nel tempo, soprattutto 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/
- Finestre:
C:ProgramDataDockerDesktop
- macOS:
~/Library/Containers/com.docker.docker/Data/vms/0/
Tuttavia, toccare questi dati è probabilmente una cattiva idea . Lo spazio di archiviazione di Docker è complicato e in realtà varia notevolmente a seconda del driver di archiviazione utilizzato. Linux ora è impostato su overlay2
sulla maggior parte delle distribuzioni, che non è nemmeno accessibile per la maggior parte degli utenti finali. Giocare 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, dal momento che le immagini Docker memorizzano le versioni in modo incrementale. Ciò significa che ogni volta che scarichi una nuova versione, vengono sostituite 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 contrassegnate o non referenziate da alcun contenitore.
docker image prune
Per eliminare tutte le vecchie immagini non utilizzate dai contenitori esistenti, eseguilo con -a
bandiera:
docker image prune -a
Questo copre il caso d'uso principale, ma ci sono alcuni comandi più utili:
inspect
:mostra le informazioni su una versione del contenitore.save & load
:salva e carica le immagini su untar
archivio.rm
:rimuove direttamente un'immagine.pull/push
:aggiornamenti da un registro remoto.history
:fornisce un registro delle modifiche.
Utilizzo dello storage Docker Container
Puoi visualizzare tutte le informazioni su un container con docker inspect
, che mostra i driver e i dati del filesystem, nonché tutti i mount e i volumi esistenti.
docker inspect containerID
I contenitori memorizzano i dati in due modi. Il primo è il filesystem di base, che viene copiato dall'immagine ed è unico per ogni contenitore. Docker utilizza una "dir inferiore" e una "dir superiore", che sono livelli separati che vengono uniti in un 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, come i file di registro. In entrambi i casi, la memorizzazione di questi dipende dal driver del filesystem che Docker è configurato per l'uso.
Poi, ci sono supporti , che legano le directory dall'host al container, generalmente gestite 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 montare un binding.
Accesso ai volumi
È possibile accedere direttamente ai montaggi di binding e rappresentano un'ottima scelta se si desidera archiviare la configurazione utilizzata per molti contenitori o archiviare dati accessibili che persistono durante i riavvii del contenitore.
Se vuoi modificare i dati memorizzati nei volumi, puoi farlo anche tu. Sono archiviati in un formato standard accessibile da Linux:
/var/lib/docker/volumes/volumeID/_data
Puoi ottenere l'ID volume e le informazioni con docker volume inspect
.
Proprio come le immagini, anche i volumi possono diventare obsoleti. Puoi rimuoverli facilmente, ma il backup e il trasferimento sono un processo più complicato.
docker volume prune docker volume rm volumeID
Modifica del filesystem di un contenitore Docker
Se vuoi 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 desideri apportare alcune modifiche rapide senza interrompere il contenitore, il modo migliore è semplicemente aprire una shell bash all'interno del contenitore e modificarla tramite Docker. Farlo è molto semplice:esegui docker exec
sul contenitore e passa "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 container e associare la porta 22 a un'altra porta sull'host.
RELAZIONATO: Come eseguire SSH in un contenitore Docker