Comprendere il processo che Docker utilizza per archiviare i dati tramite immagini e contenitori ti aiuterà a progettare meglio le tue applicazioni Docker. Le immagini Docker sono come modelli mentre i contenitori Docker sono le istanze in esecuzione create da quei modelli. Docker utilizza un approccio a strati per conservare immagini e contenitori.
Immagini e strati
Un'immagine Docker viene creata da più livelli. Se prendiamo un esempio di Dockerfile, ogni istruzione viene convertita in un livello. Ecco un semplice Dockerfile:
Ogni riga nel sud di Dockerfile creerà un livello. L'istruzione from cercherà il nodo: 6.9.2 Immagine nel registro locale. Se non lo trova lì, lo scaricherà dall'hub Docker. Quindi Docker creerà il primo livello. L'istruzione di copia successiva aggiunge il server.file js all'immagine come secondo livello. L'ultimo livello esegue un nodo.Applicazione JS. Tutti questi strati sono impilati uno sopra l'altro. Ogni livello aggiuntivo viene aggiunto come differenza dal livello prima di esso.
Contenitori e strati
I contenitori sono creati dalle immagini. Quando un contenitore viene creato da un'immagine, viene messo un livello sottile di lettura/scrittura sulla parte superiore dell'immagine (nota che i livelli di immagine sono immutabili, gli strati del contenitore non lo sono). Eventuali modifiche apportate al contenitore vengono apportate su questo livello di lettura/scrittura durante la vita del contenitore. Quando viene eliminato un contenitore, viene rimosso lo strato di lettura/scrittura sottile associato. Significa che più contenitori possono condividere la stessa immagine. Ogni livello contenitore manterrà i propri dati in modo sicuro in cima all'immagine Docker.
Immagini e contenitori
Proviamo un semplice esempio. È possibile utilizzare il comando Docker Images per trovare tutte le immagini:
Dimensione creata immagine del tag repository |
E il comando Docker PS per trovare contenitori:
Comando ID contenitore Comando immagine Nomi delle porte di stato creato |
Questa è un'installazione di Docker Fresh. Quindi non c'è immagine o contenitore presente. È possibile eseguire il Docker Run -It Nodo: 6.9.2 comando per avviare un contenitore.
$ Docker run -it nodo: 6.9.2 |
Impossibile trovare l'immagine 'nodo: 6.9.2 'localmente |
6.9.2: estrazione dalla libreria/nodo |
75A822CD7888: pull completo |
57DE64C72267: pull completo |
4306Be1e8943: pull completo |
871436ab7225: pull complet |
0110c26a367a: pull completo |
1f04fe713f1b: pull completo |
AC7C0B5FB553: Pull Complete |
Digest: sha256: 2e95be60faf429d6c97d928c762cb36f1940f4456ce4bd33fbdc34de94a5e043 |
Stato: più recente immagine per il nodo: 6.9.2 |
Ora se controlliamo di nuovo le immagini Docker, troviamo:
Dimensione creata immagine del tag repository |
nodo 6.9.2 faaadb4aaf9b 11 mesi fa 655 MB |
E se controlliamo il contenitore, troviamo:
Comando ID contenitore Comando immagine Nomi delle porte di stato creato |
8c48c7e03bc7 nodo: 6.9.2 "nodo" 20 secondi fa più di 18 secondi reverent_jackson |
Se iniziamo un altro contenitore dalla stessa immagine usando il comando:
$ Docker run -it nodo: 6.9.2 |
E controlla di nuovo, vediamo:
Dimensione creata immagine del tag repository |
nodo 6.9.2 faaadb4aaf9b 11 mesi fa 655 MB |
E
Comando ID contenitore Comando immagine Nomi delle porte di stato creato |
96e6db955276 nodo: 6.9.2 "nodo" 24 secondi fa 23 secondi cocky_dijkstra |
8c48c7e03bc7 nodo: 6.9.2 "nodo" 4 minuti fa 4 minuti reverent_jackson |
I due contenitori con ID contenitore 96E6DB955276 e 8C48C7E03BC7 sono entrambi in esecuzione sull'immagine Docker con l'immagine ID FAAADB4AAF9B. Gli strati sottili di lettura/scrittura dei contenitori Docker risiedono in cima allo strato dell'immagine Docker.
Suggerimenti:
È possibile rimuovere i contenitori Docker con il comando Docker RM [ID contenitore] e rimuovere le immagini Docker con il comando Docker RMI [ID immagine].
Il nodo dell'immagine: 6.9.2 Abbiamo scaricato da Docker Hub è anche creata combinando più livelli. È possibile controllare i livelli di immagini usando la cronologia docker [ID immagine].
$ Docker History faaadb4aaf9b |
Immagine creata creata dalla dimensione |
faaadb4aaf9b 11 mesi fa /bin /sh -c #(nop) cmd ["nodo"] 0b |
11 mesi fa/bin/sh -c curl -slo "https: // nodejs.org/d 42.5 MB |
11 mesi fa /bin /sh -c #(nop) env node_version = 6.9.2 0b |
11 mesi fa /bin /sh -c #(nop) env npm_config_loglevel 0b |
11 mesi fa /bin /sh -c set -ex && per la chiave in 955 108kb |
11 mesi fa /bin /sh -c groupadd -gid 1000 nodo && u 335kb |
11 mesi fa /bin /sh -c apt-get update && apt-get insta 323mb |
Conclusione
Un modo popolare per spiegare immagini e contenitori è confrontare un'immagine con una classe e un contenitore con l'istanza di quella classe. L'approccio a strati di immagini e contenitori Docker aiuta a mantenere piccole le dimensioni di immagini e contenitori.
Riferimenti:
- https: // docs.Docker.com/motore/userguide/smoragedriver/immagini andcontainer/
- Docker Immagine vs Contenir
- https: // stackoverflow.com/domande/23735149/docker-image-vs-container