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
Output:
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.






Home | Chi siamo | Chat | Contattaci | Whois

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *