Introduzione
Docker è un popolare strumento di containerizzazione utilizzato per fornire alle applicazioni software un filesystem che contiene tutto ciò di cui hanno bisogno per eseguirsi. L’utilizzo dei contenitori Docker garantisce che il software si comporti allo stesso modo, indipendentemente da dove viene distribuito, perché il suo ambiente di esecuzione è rigorosamente coerente.
In questo tutorial, forniremo una breve panoramica della relazione tra le immagini Docker e i contenitori Docker. Successivamente, esamineremo più nel dettaglio come eseguire, avviare, fermare ed eliminare i contenitori.
Panoramica
Possiamo pensare a un’immagine Docker come a un modello inerte utilizzato per creare i contenitori Docker. Le immagini di solito partono da un filesystem di base e aggiungono modifiche al filesystem e i relativi parametri di esecuzione in strati ordinati e in sola lettura. A differenza di una distribuzione Linux tipica, un’immagine Docker contiene normalmente solo il minimo indispensabile per l’esecuzione dell’applicazione. Le immagini non hanno stato e non cambiano. Piuttosto, costituiscono il punto di partenza per i contenitori Docker.
Le immagini prendono vita con il comando docker run
, che crea un contenitore aggiungendo uno strato di lettura-scrittura in cima all’immagine. Questa combinazione di strati in sola lettura sovrapposti con uno strato di lettura-scrittura è nota come un sistema di file di unione. Quando viene apportata una modifica a un file esistente in un contenitore in esecuzione, il file viene copiato dallo spazio in sola lettura allo strato di lettura-scrittura, dove vengono applicate le modifiche. La versione nello strato di lettura-scrittura nasconde il file originale ma non lo rimuove. Le modifiche nello strato di lettura-scrittura esistono solo all’interno di un’istanza di contenitore individuale. Quando viene eliminato un contenitore, tutte le modifiche vengono perse a meno che non vengano prese misure per preservarle.
Come lavorare con i contenitori Docker
Lavorare con i contenitori
Ogni volta che si utilizza il comando docker run
, viene creato un nuovo contenitore dall’immagine specificata. Questo può essere una fonte di confusione, quindi diamo un’occhiata con alcuni esempi:
Passaggio 1: Creare Due Contenitori
Il seguente comando docker run
creerà un nuovo contenitore utilizzando l’immagine base ubuntu
. -t
ci fornirà un terminale, e -i
ci permetterà di interagire con esso. Faremo affidamento sul comando predefinito nel file Docker dell’immagine di base di Ubuntu, bash
, per entrare in una shell.
Il prompt della riga di comando cambia per indicare che siamo all’interno del contenitore come utente root, seguito dall’ID del contenitore di 12 caratteri.
Faremo una modifica inserendo del testo nella directory /tmp
del contenitore, quindi utilizzeremo cat
per verificare che sia stato salvato con successo.
OutputExample1
Ora, usciamo dal contenitore.
I container Docker smettono di funzionare non appena il comando che hanno emesso è completato, quindi il nostro container si è fermato quando siamo usciti dalla shell di bash. Se eseguiamo docker ps
, il comando per visualizzare i container in esecuzione, non vedremo il nostro.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Se aggiungiamo il flag -a
, che mostra tutti i container, fermi o in esecuzione, allora il nostro container comparirà nell’elenco:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
Quando il container è stato creato, è stato assegnato il suo ID di container e un nome generato casualmente. In questo caso, 11cc47339ee1 è l’ID del container e small_sinoussi
è il nome generato casualmente. ps -a
mostra questi valori, così come l’immagine da cui è stato costruito il container (ubuntu
), quando il container è stato creato (sei minuti fa
), e il comando che è stato eseguito al suo interno (/bin/bash
). L’output fornisce anche lo stato del container (Exited
) e quanto tempo fa il container è entrato in tale stato (6 secondi fa
). Se il container fosse ancora in esecuzione, vedremmo lo stato “Up”, seguito da quanto tempo è stato in esecuzione.
Se eseguiamo nuovamente lo stesso comando, viene creato un nuovo container completamente nuovo:
Possiamo capire che si tratta di un nuovo container perché l’ID nel prompt dei comandi è diverso, e quando cerchiamo il nostro file Example1, non lo troveremo:
Outputcat: /tmp/Example1: No such file or directory
Questo può far sembrare che i dati siano scomparsi, ma non è il caso. Usciremo ora dal secondo container per vedere che esso, e il nostro primo container con il file che abbiamo creato, sono entrambi presenti nel sistema.
Quando elenchiamo nuovamente i container, entrambi appaiono:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg
11cc47339ee1 ubuntu "/bin/bash" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
Passo 2: Riavvio del Primo Contenitore
Per riavviare un contenitore esistente, utilizzeremo il comando start
con il flag -a
per collegarci ad esso e il flag -i
per renderlo interattivo, seguito dall’ID o dal nome del contenitore. Assicurati di sostituire l’ID del tuo contenitore nel comando qui sotto:
Ci ritroviamo di nuovo al prompt bash del contenitore e quando eseguiamo cat
del file che abbiamo creato in precedenza, è ancora lì.
OutputExample1
Adesso possiamo uscire dal contenitore:
Questa output mostra che le modifiche apportate all’interno del contenitore persistono attraverso l’arresto e il riavvio dello stesso. È solo quando il contenitore viene rimosso che i contenuti vengono eliminati. Questo esempio illustra anche che le modifiche erano limitate al singolo contenitore. Quando abbiamo avviato un secondo contenitore, rifletteva lo stato originale dell’immagine.
Passo 3: Eliminazione di Entrambi i Contenitori
Abbiamo creato due contenitori e concluderemo il nostro breve tutorial eliminandoli. Il comando docker rm
, che funziona solo su contenitori fermi, ti permette di specificare il nome o l’ID di uno o più contenitori, quindi possiamo eliminarli entrambi con quanto segue:
Output11cc47339ee1
kickass_borg
Entrambi i contenitori e qualsiasi modifica che abbiamo apportato al loro interno sono ora scomparsi.
Conclusione
Abbiamo esaminato dettagliatamente il comando docker run
per vedere come crea automaticamente un nuovo contenitore ogni volta che viene eseguito. Abbiamo anche visto come individuare un contenitore interrotto, avviarlo e connetterci ad esso. Se desideri approfondire la gestione dei contenitori, potresti essere interessato alla guida, Naming Docker Containers: 3 Suggerimenti per Principianti.
Source:
https://www.digitalocean.com/community/tutorials/working-with-docker-containers