Difficulty: Beginner
Estimated Time: 10 minutes

Docker volumes

Step 1 of 2

Visión general

Por defecto todos los ficheros creados dentro de un contenedor son almacenados en una capa de contenedor escribible. Esto tiene unas implicaciones.

  • Los cambios no persisten

  • Es difícil de mover entre máquinas diferentes

  • Para escribir es necesario un driver, esta capa extra de abstracción reduce la eficiencia. Los volúmenes usan el kernel directamente.

Docker tiene 2 opciones para persistir datos, volumes y bind mounts. Hay un tercero pero sólo si corres Docker en Linux, tmpfs mounts

  • Volumes son almacenados en una parte del sistema de ficheros del host que es gestionado por Docker (/var/lib/docker/volumes/ en Linux). Son la mejor forma de pesistir datos.
  • Bind mounts pueden estar almacenados en cualquier parte del host (No recomendados, usar volúmenes siempre que sea posible)

  • tmpfs mounts grabados sólo en memoria del sistema del host

Vamos a crear un volumen: docker volume create myvol

docker volume ls

docker volume rm myvol

Creemos otro docker volume create volumen-prueba

docker volume create myvol

Cuando lanzamos un contenedor podemos montar las diversas opciones de persistencia con la opción --mount. Es una lista de opciones separadas por coma. Se indica un directorio dentro del contenedor donde se montará toda la estructura de directorios del volumen.

Vamos a lanzar un servidor web nginx con una página sencilla

mkdir data && touch data/index.html data/index.html

docker container run -d --rm --name miwebserver --mount type=bind,src=$PWD/data,dst=/usr/share/nginx/html nginx

--mount necesita los siguientes parámetros (separados por comas):

- `type` es el tipo de persistencia, `volume`, `bind` o `tmpfs`
- `src` nombre del volumen a montar o en caso de bind es el path dentro del host. Ha de ser una ruta absoluta (por eso $PWD)

- `dst` directorio dentro del contenedor donde será montado, en este caso es el directorio que indica la imagen nginx en Docker Hub

Las otras opciones:

-d en segundo plano --rm borrar en cuanto termine

Hagamos una petición HTTP al servidor nginx. ¿Recuerdas cómo hallar la dirección IP de un contenedor? (docker ??? inspect ????)

curl <IP>

Modifica el fichero y vuelve a hacer la petición