Volumi

Contenitori di Dati

I Contenitori di Dati sono formalmente chiamati Volumi.

  • Sono interamente contenuti nel repository locale
  • Non sono mappaggi al file system host

Due tipi:

  • Volume Persistente - continua ad esistere anche dopo la rimozione dei contenitori processo che lo usano

  • Volume Effimero - cessa di esistere con la rimozione dei contenitori che lo usano

Volume Persistente

VolCond

Web Counter App

Costruiamo un'immagine che scrive alla webdir di nginx:

mkdir ~/docker/webcounter
cd ~/docker/webcounter

Editiamo il file webcounter.sh:

#! /bin/bash
x=0
while true
do
  x=$[x + 1]
  echo "<br/><h1>$x</h1>" > /usr/share/nginx/html/index.html
  sleep 1 
done

Costruiamo il file Dockerfile di specifica di una nuova immagine. Maggiori spiegazioni seguiranno.

FROM ubuntu
COPY webcounter.sh /usr/local/bin/webcounter.sh
RUN chmod +x /usr/local/bin/webcounter.sh
CMD ["/usr/local/bin/webcounter.sh"]

Con il Dockerfile costruiamo la nuova immagine my_webapp1:

docker build -t my_webapp1 .

Condivisione tramite volume

Creiamo il volume persistente:

docker volume create myvol

Non è visibile con docker ps -a ma con docker volume ls

Creiamo il contenitore di processi nginx che mappa il volume persistente alla sua directory di pagine statiche:

docker run -d --name web_server -v myvol:/usr/share/nginx/html -p 8080:80 nginx

Creiamo il contenitore di processi con l’applicativo, che prende il volume persistente da quello già mappato dal server:

docker run -d --name web_app --volumes-from web_server my_webapp1

Verifichiamo col browser a localhost:8080

Verifica della persistenza

Fermiamo e rimuoviamo i contenitori di processi:

docker stop web_server web_app
docker rm web_server web_app

Il contenitore dati esiste ancora:

docker volume ls

Rilanciamo un web_server rimappando il contenitore dati:

docker run -d --name web_server -v myvol:/usr/share/nginx/html -p 8080:80 nginx

Verifichiamo con il browser a localhost:8080

Nota

Questo non funziona:

Salvare il contenuto del contenitore dati - tentativo

Generare un’immagine

docker container commit web_server web_server_backup

Ora la si può salvare ad un file tar

docker image save -o web_server_backup.tar web_server_backup

Il commit di un contenitore dati non include i volumi dati montati

Volume Effimero

Volume effimero: scompare quando i container che lo usano sono terminati

Container che crea un volume:

docker run -ti --rm --name one -v /shared_data ubuntu bash

Container che usa un volume:

docker run -ti --rm --name two --volumes-from one ubuntu bash

Su two:

touch /shared_data/example

Su one:

ls /shared_data

E' visibile example

Terminare one. Su two è ancora visibile example.

Il volume mantenuto dal server docker

Se rilanciamo one con la stessa condivisione dati, two non lo vede più

Istanze diverse di volume condiviso