Dal mio articolo sull'automazione delle distribuzioni Docker :
Immagini Docker vs. Contenitori
In Dockerland ci sono immagini e ci sono contenitori . I due sono strettamente correlati, ma distinti. Per me cogliere questa dicotomia ha chiarito immensamente Docker.
Cos'è un'immagine?
Un'immagine è un file inerte, immutabile, che è essenzialmente un'istantanea di un contenitore. Le immagini vengono create con il comando build e produrranno un contenitore all'avvio con run . Le immagini sono memorizzate in un registro Docker come register.hub.docker.com . Poiché possono diventare piuttosto grandi, le immagini sono progettate per essere composte da livelli di altre immagini, consentendo una quantità minima di dati da inviare durante il trasferimento di immagini sulla rete.
Le immagini locali possono essere elencate eseguendo docker images
:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d 2 months ago 180 MB
ubuntu 14.04 99ec81b80c55 2 months ago 266 MB
ubuntu latest 99ec81b80c55 2 months ago 266 MB
ubuntu trusty 99ec81b80c55 2 months ago 266 MB
<none> <none> 4ab0d9120985 3 months ago 486.5 MB
Alcune cose da notare:
- ID IMMAGINE sono i primi 12 caratteri dell'identificatore vero per un'immagine. Puoi creare molti tag di una determinata immagine, ma i loro ID saranno tutti uguali (come sopra).
- VIRTUAL SIZE è virtuale perché sta sommando le dimensioni di tutti i livelli sottostanti distinti. Ciò significa che la somma di tutti i valori in quella colonna è probabilmente molto più grande dello spazio su disco utilizzato da tutte quelle immagini.
- Il valore nella colonna REPOSITORY deriva dalla
-t
bandiera del docker build
comando o dal docker tag
-ing di un'immagine esistente. Sei libero di taggare le immagini usando una nomenclatura che ha senso per te, ma sappi che la finestra mobile utilizzerà il tag come posizione del registro in un docker push
o docker pull
.
- La forma completa di un tag è
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Per quanto ubuntu
sopra, si presuppone che REGISTRYHOST sia registry.hub.docker.com
. Quindi, se hai intenzione di archiviare la tua immagine chiamata my-application
in un registro su docker.example.com
, dovresti taggare quell'immagine docker.example.com/my-application
.
- La colonna TAG è solo la parte [: TAG] del tag completo . Questa è una terminologia sfortunata.
- Il
latest
tag non è magico, è semplicemente il tag predefinito quando non si specifica un tag.
- Puoi avere immagini senza tag identificabili solo con i loro ID IMMAGINE. Questi otterranno il
<none>
TAG e il REPOSITORY. È facile dimenticarsene.
Ulteriori informazioni sulle immagini sono disponibili nella documentazione e nel glossario Docker .
Che cos'è un contenitore?
Per usare una metafora di programmazione, se un'immagine è una classe, un contenitore è un'istanza di una classe, un oggetto runtime. Si spera che i contenitori stiano usando Docker; sono incapsulamenti leggeri e portatili di un ambiente in cui eseguire applicazioni.
Visualizza i contenitori correnti locali con docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc 4 months ago Up 12 weeks 0.0.0.0:5000->5000/tcp docker-registry
Qui sto eseguendo una versione dockerizzata del registro docker, in modo da avere un posto privato dove archiviare le mie immagini. Ancora una volta, alcune cose da notare:
- Come l'ID IMMAGINE, l'ID CONTAINER è l'identificatore vero per il contenitore. Ha la stessa forma, ma identifica un diverso tipo di oggetto.
docker ps
produce solo contenitori in esecuzione . È possibile visualizzare tutti i contenitori (in esecuzione o arrestati ) con docker ps -a
.
- NAMES può essere utilizzato per identificare un container avviato tramite il
--name
flag.
Come evitare l'accumulo di immagini e contenitori
Una delle mie prime frustrazioni con Docker fu l' accumulo apparentemente costante di immagini senza tag e fermò i container . In una manciata di occasioni questo accumulo ha comportato l'azionamento al massimo di dischi rigidi che rallentavano il mio laptop o arrestavano la mia pipeline di build automatizzata. Parla di "contenitori ovunque"!
Possiamo rimuovere tutte le immagini senza tag combinandole docker rmi
con la dangling=true
query recente :
docker images -q --filter "dangling=true" | xargs docker rmi
Docker non sarà in grado di rimuovere le immagini che si trovano dietro i contenitori esistenti, quindi potrebbe essere necessario rimuovere i contenitori arrestati con docker rm
prima:
docker rm `docker ps --no-trunc -aq`
Questi sono punti critici noti con Docker e potrebbero essere risolti in versioni future. Tuttavia, con una chiara comprensione di immagini e contenitori, queste situazioni possono essere evitate con un paio di pratiche:
- Rimuovere sempre un contenitore inutile e fermo con
docker rm [CONTAINER_ID]
.
- Rimuovere sempre l'immagine dietro un contenitore inutile e fermo con
docker rmi [IMAGE_ID]
.