Lavorare con i container Docker
Introduzione
Docker è un popolare strumento di containerizzazione, usato per fornire applicazioni ed un filesystem che contiene tutto ciò di cui queste hanno bisogno per funzionare. Utilizzare i container Docker garantisce che, a prescindere da dove l’applicazione viene eseguita, essa si comporterà nello stesso modo, visto che il suo ambiente di run-time è del tutto consistente.
In questa guida forniremo una breve panoramica della relazione tra le immagini Docker e i container Docker. Poi vedremo nel dettaglio come eseguire, avviare, arrestare e rimuovere i container.
Quadro generale
Possiamo pensare a una immagine Docker come a un modello statico usato per creare i container Docker. Le immagini di solito partono con un filesystem root e aggiungono modifiche al filesystem e i relativi parametri di esecuzione in layer read-only ordinati. A differenza di una tipica distribuzione Linux, un’immagine Docker contiene di norma solo lo stretto necessario per eseguire l’applicazione. Le immagini non hanno uno stato e non cambiano. Costituiscono però il punto di partenza per i container Docker.
Le immagini vengono richiamate con il comando docker run
che crea un container aggiungendo un layer read-write in cima all’immagine. Questa combinazione di layer read-only seguita da un layer read-write è conosciuta come union file system. Quando viene fatto un cambiamento a un file esistente in un container avviato, il file viene copiato dallo spazio read-only all’interno del layer read-write nel quale si applicano le modifiche. La versione nel layer read-write nasconde il file originale, ma non lo rimuove. I cambiamenti nel layer read-write esistono solo all’interno di una singola istanza del container. Quando un container viene eliminato tutte le modifiche vengono perse a meno che non si adottino misure per salvaguardarle.
Lavorare con i container
Ogni qualvolta si usa il comando docker run
viene creato un nuovo container dall’immagine che avete indicato. Questo può creare confusione; vediamo quindi qualche esempio:
Primo passo: creare due container
Il seguente comando docker run
creerà un nuovo container usando l’immagine base ubuntu
. Il parametro -t
ci mette a disposizione un terminale mentre -i
ci permette di interagire con esso. Per poter usare la shell ci affideremo a bash
, il comando di default del file Docker nell’immagine base ubuntu.
$ docker run -ti ubuntu
Il prompt cambia, indicando che siamo all’interno del container come utenti root, ed è seguito dall’ID del container di 12 caratteri.
root@11cc47339ee1:/#
Faremo un cambiamento inserendo del testo nella directory /tmp
del container, poi useremo il comando cat
per verificare che sia stato correttamente salvato.
root@11cc47339ee1:/# echo "Example1" > /tmp/Example1.txt
root@11cc47339ee1:/# cat /tmp/Example1.txt
Output:
Example1
Ora usciamo dal container.
root@11cc47339ee1:/# exit
I container Docker si arrestano non appena il comando eseguito è stato completato, quindi i nostri container si sono arrestati nel momento in cui siamo usciti dalla shell bash. Se eseguiamo docker ps
, il comando per visualizzare i container avviati, i nostri non saranno mostrati.
$ docker ps
Output:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Se aggiungiamo il parametro -a
che mostra tutti i container, arrestati o in esecuzione, i nostri container saranno presenti nella lista:
$ docker ps -a
Output:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
Quando il container viene creato, gli viene assegnato un container ID e un nome generato casualmente. In questo caso, 11cc47339ee1 è il container ID e small_sinoussi
è il nome generato casualmente. ps -a
mostra questi valori e visualizza inoltre l’immagine dalla quale il container è stato generato (ubuntu
), quando è stato creato il container (6 minutes ago) e il comando che è stato eseguito al suo interno (/bin/bash
). L’output mostra inoltre lo stato del container (Exited
) e quando il container è entrato in quello stato (8 seconds ago
). Se il container fosse ancora in esecuzione lo stato sarebbe “Up” seguito dal tempo passato da quando è stato avviato.
Se usiamo nuovamente lo stesso comando viene creato un container completamente nuovo:
$ docker run -ti ubuntu
Possiamo dire che si tratta di un nuovo container perché l’ID è differente e, se cerchiamo il nostro file Example1, non lo troviamo:
root@6e4341887b69:/# cat /tmp/Example1
Output:
cat: /tmp/Example1: No such file or directory
Questo può far sembrare che i dati siano spariti ma non lo sono. Il nostro primo container, con il file che abbiamo creato, è ancora presente nel sistema.
Se guardiamo ancora ai container, nella lista appariranno entrambi:
$ docker ps -a
Output:
CONTAINER 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
Ora usciamo dal secondo container in modo che, riavviando quello iniziale, potremo trovare le nostre modifiche:
root@6e4341887b69:/# exit
Secondo passo: Riavviare il primo container
Per riavviare un container esistente useremo il comando start
associato ai parametri -a
e -i
per renderlo interattivo, seguito dal container ID o dal nome. Assicuratevi di sostituire l’ID del vostro container nel comando qui sotto:
$ docker start -ai 11cc47339ee1
Ci troveremo ancora al prompt della bash; dunque possiamo usare cat
sul file che abbiamo precedentemente creato per vedere che sia ancora presente.
root@11cc47339ee1:/# cat /tmp/Example1.txt
Example1
Ora possiamo uscire dal container:
root@11cc47339ee1:/# exit
Questo output mostra che le modifiche fatte all’interno del container persistono dopo averlo arrestato e avviato. Il contenuto viene rimosso solamente quando il container viene eliminato. Questo esempio dimostra inoltre che i cambiamenti erano limitati al singolo container. Quando abbiamo creato un secondo container rifletteva lo stato originale dell’immagine.
Terzo passo: Eliminare entrambi i container
Dopo aver creato i due container concludiamo questa breve guida vedendo come eliminarli. Il comando docker rm
, che funziona solamente con i container arrestati, vi permette di indicare il nome o l’ID di uno o più container; possiamo quindi eliminarli entrambi eseguendo:
$ docker rm 11cc47339ee1 kickass_borg
Output:
11cc47339ee1
kickass_borg
Ora entrambi i container e tutte le modifiche fatte al loro interno sono stati eliminati.
Conclusioni
Abbiamo dato uno sguardo dettagliato al comando docker run
per vedere come esso crea automaticamente un nuovo container ogni volta che viene eseguito. Abbiamo inoltre visto come trovare un container non avviato, come avviarlo e connettersi ad esso. Se volete imparare di più riguardo la gestione dei container potreste essere interessati a questa guida: Rinominare i container Docker: 3 consigli per principianti.
Autore: Melissa Anderson
Traduzione di Zantx dell’articolo https://www.digitalocean.com/community/tutorials/working-with-docker-containers Copyright © 2016 DigitalOcean™ Inc.