Vuoi sapere dove si trovano immagini, contenitori e volumi Docker?
In un tipico ambiente Linux, puoi trovare l'immagine Docker e i dati del contenitore in:
/var/lib/docker/
Se il tuo server sta esaurendo lo spazio, dovresti assolutamente dare un'occhiata a questa directory.
In primo luogo, tutte le entità relative a Docker si trovano in /var/lib/docker
. Ma esaminiamolo in modo più specifico, con l'immagine e il contenitore Alpine come esempio pratico.
Posizione delle immagini Docker
Ogni volta che usi il docker pull
comando o esegui docker-compose up -d
per preparare il lancio delle applicazioni, è qui che le immagini vengono archiviate su un server Ubuntu:
/var/lib/docker/overlay2
Qui, Overlay2 è il driver di archiviazione Docker predefinito su Ubuntu. Puoi confermarlo eseguendo docker info
comando e cercando il driver di archiviazione:
...
Storage Driver: overlay2
...
Se questo è diverso dal tuo, stai utilizzando un driver di archiviazione diverso per Docker. Allo stesso modo, la posizione della directory verrebbe denominata in base allo stesso driver di archiviazione. La disponibilità del driver di archiviazione dipende dal supporto del kernel.
Posizioni specifiche dell'immagine
Se stai cercando le posizioni di immagini specifiche, puoi utilizzare il comando ispeziona su Docker per l'immagine estratta.
Supponiamo, ad esempio, di aver estratto l'immagine alpine con docker pull alpine
. Esegui il comando seguente per ispezionarlo:
[email protected]:~$ docker inspect alpine
Una volta eseguito il comando, noterai tre campi all'interno dei Data
sottosezione in GraphDriver
:
...
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/merged",
"UpperDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
"WorkDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/work"
},
...
Tutti i percorsi di directory sopra indicati sono le posizioni fisiche dell'immagine alpine sul sistema host. Prendi nota della grande directory denominata hash nei tre campi sopra:64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
.
In totale, ci sono in realtà quattro tipi di campi:
Inferiore Dir :Questi sono i livelli di sola lettura di un filesystem di sovrapposizione. Per la finestra mobile, questi sono i livelli dell'immagine assemblati in ordine.
Directory superiore :Questo è il livello di lettura-scrittura di un filesystem di sovrapposizione. Per docker, è l'equivalente del livello specifico del contenitore che contiene le modifiche apportate da quel contenitore.
WorkDir :Questa è una directory richiesta per l'overlay, ha bisogno di una directory vuota per uso interno.
Directory unita :Questo è il risultato del filesystem di sovrapposizione. Docker esegue effettivamente il chroot in questa directory durante l'esecuzione del contenitore.
Citato da questo riferimento (utile per ulteriori letture).
Posizione dei container Docker
Come le immagini, anche i contenitori sono archiviati all'interno della stessa directory basata sul driver di archiviazione.
/var/lib/docker/overlay2
Posizioni specifiche del container
Se stai cercando le posizioni di contenitori specifici, puoi nuovamente utilizzare inspect
comando sul contenitore in esecuzione.
Supponiamo, ad esempio, di aver eseguito il container alpine con docker run -ti -d alpine
. Quando esegui docker ps
, vedrai che è in esecuzione:
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb341d6a28fa alpine "/bin/sh" 6 seconds ago Up 5 seconds confident_banzai
Qui, il contenitore è stato chiamato casualmente confident_banzai
. Quindi esaminiamolo:
[email protected]:~$ docker inspect confident_banzai
Una volta eseguito il comando precedente, noterai tutti e quattro i campi menzionati in precedenza all'interno dei Data
sottosezione in GraphDriver
. Queste directory sono dove si trovano fisicamente i dati del contenitore sul tuo sistema host:
...
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3-init/diff:/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
"MergedDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/merged",
"UpperDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/diff",
"WorkDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/work"
},
"Name": "overlay2"
},
...
Riferimento per ulteriori letture.
Le directory di cui sopra sono le posizioni fisiche dei dati del tuo contenitore all'interno del sistema host. Ricorda la grande directory con nome hash:64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
dalle Immagini Docker sezione? La directory sotto di essa si chiama diff
, come puoi vedere in LowerDir
sezione dopo :
, che ora è un punto di montaggio per il contenitore - recuperato dall'immagine di base UpperDir
!
Queste directory continueranno a essere disponibili anche dopo l'arresto del contenitore. Quindi, il percorso completo comune all'immagine (MergedDir
, UpperDir
e WorkDir
) e il contenitore (LowerDir
punto di montaggio) è:
/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/
Lo scopo dell'immagine è contiguo dopo l'assegnazione al contenitore fino al LowerDir
livello, motivo per cui i quattro campi sono allocati e basati su una directory diversa (con un nuovo hash) a causa della natura dinamica di quest'ultimo, che diventa:
/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/
Nota:il processo di montaggio della directory dall'immagine di base al container è molto simile a come si montano i volumi su Docker! Posizione dei volumi Docker
A differenza delle immagini e dei contenitori Docker, le posizioni fisiche dei volumi sono piuttosto semplici. I volumi si trovano in:
/var/lib/docker/volumes/
Posizioni di volume specifiche
In questo caso, ci sono principalmente due tipi. Uno è i normali volumi Docker e l'altro è il bind mount.
Volumi Docker
Se stai cercando le posizioni di volumi specifici, puoi utilizzare il docker volume ls
prima il comando e controllare il nome o l'ID del volume.
Ad esempio, ho eseguito il container alpine con il seguente comando con un volume:
[email protected]:~$ docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
Ora, un volume chiamato test-data
verrà creato automaticamente. Creiamo ora un file chiamato test.md
all'interno di questa posizione:
[email protected]:~$ docker exec alpine-container sh -c "touch /var/lib/app/content/test.md"
Verifica che il file sia stato effettivamente creato:
[email protected]:~$ docker exec -ti alpine-container sh
/ # ls /var/lib/app/content/
test.md
/ # exit
Quando esegui docker volume ls
, il volume denominato test-data
verrebbe elencato:
[email protected]:~$ docker volume ls
DRIVER VOLUME NAME
local d502589845f7ae7775474bc01d8295d9492a6c26db2ee2c941c27f3cac4449d1
local e71ee3960cfef0a133d323d146a1382f3e25856480a727c037b5c81b5022cb1b
local test-data
Infine, puoi confermare la posizione effettiva del file sul tuo sistema host:
[email protected]:~$ sudo ls -l /var/lib/docker/volumes/test-data/_data
total 0
-rw-r--r-- 1 root root 0 Oct 6 23:20 test.md
Pertanto, il percorso per il volume montato si trova sempre all'interno di una directory denominata _data
all'interno della rispettiva directory del volume.
Puoi anche controllare tali percorsi nel modo Docker usando docker volume inspect
comando seguito dal nome del volume o dall'ID ed esaminando il Mountpoint
parametro all'interno dell'output:
[email protected]:~$ docker volume inspect test-data
[
{
"CreatedAt": "2021-10-06T23:20:20+05:30",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/test-data/_data",
"Name": "test-data",
"Options": null,
"Scope": "local"
}
]
Lega i supporti
Le posizioni dei montaggi di binding sono piuttosto ovvie e ancora più semplici perché monti il volume direttamente da una posizione sul lato host:
[email protected]:~$ mkdir /home/avimanyu/test-data
[email protected]:~$ docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine
In questo caso, un volume montato in binding denominato test-data
diventerà disponibile sul lato contenitore come /var/lib/app/content
.
Riepilogo
In questo breve tutorial, ho adottato un approccio generico basato su Linux per mostrare le posizioni fisiche di immagini, contenitori e volumi Docker che risiedono sul tuo server Linux (Ubuntu 20.04 in questo caso) a livello di host.
Se desideri condividere feedback, commenti o suggerimenti su questo approccio, lascia i tuoi pensieri nella sezione commenti qui sotto.