Cuando pensamos en contenedores sabemos que el problema de la gestión de la configuración esta solucionado en gran medida. Sin embargo hay algunas consideraciones que aun necesitan atención, siendo una de estas el espacio en disco que nuestras aplicaciones utilizan.

Pensemos en el caso en donde una aplicación esta dockerizada y sirve para subir imágenes que son almacenadas temporalmente en el servidor, y que tiene una carga de muchos usuarios por segundo subiendo imagenes. Siendo que el contenedor de docker esta aislado del resto del mundo, tiene un espacio en disco reservado y ademas si por alguna razón hay que reiniciar el contenedor, toda la información se habra perdido. Lo mismo aplica para las bases de datos, y cuando queremos tener el código fuera del contenedor por motivos de desarrollo.

La solución a esto es decirle al contenedor donde queremos almacenar nuestros archivos en el sistema operativo anfitrión. Para ello podemos arrancar el contenedor con la bandera -v <ruta_anfitrión>:<ruta_contenedor>.

Por ejemplo, si ejecutamos en una terminal:

$ docker run -i -t -v ~/archivos_de_proyecto:/proyecto ubuntu:16.04 /bin/bash

y la carpeta ~/archivos_de_proyecto existe en nuestro sistema anfitrión, entonces un enlace es creado hacia el contenedor.

Para comprobarlo, creamos un archivo cualquiera digamos prueba.txt en nuestra carpeta local, y comprobamos si se mapea automaticamente al contenedor y viceversa.

Si quisiéramos, en lugar de especificar el volumen en el comando de inicio con la bandera -v podríamos ponerlo en nuestro DOCKEFILE

VOLUME /proyecto

Cuando lo hacemos así, la carpeta /proyecto es automaticamente mapeada al directorio en el anfitrión por defecto que contiene todos los volúmenes de docker:  /var/lib/docker/vfs/

Si el volumen esta definido en ambos lados: la bandera -v y el DOCKERFILE entonces la bandera -v toma precedencia sobre la instrucción en el DOCKERFILE.

Si queremos tener un volumen para los datos guardados en nuestra base de datos, de modo que estos persistan cuando apagamos nuestros contenedores, es necesario crear el volumen para que se almacenen en nuestro sistema operativo anfitrión.

En el caso de MySQL basta con hacer lo siguiente:

VOLUME /var/lib/mysql

Otra forma de hacer que nuestros volúmenes funcionen es usar la bandera –mount la cual tiene una sintaxis diferente a la bandera -v ya que acepta un formato “<llave>=<valor>,..,<llave>=<valor>” para configurarlos.

Por ejemplo:

 docker run -d \
  --mount source=proyecto,destination=/usr/share/nginx/html \
  nginx:latest

Esto es bastante útil ya que también nos provee la opción de configurar un volumen que sea de solo lectura:

docker run -d \
  --mount source=proyecto,destination=/usr/share/nginx/html,readonly \
  nginx:latest

Note la opción “readonly” después del directorio de destino.

Finalmente si queremos comprobar la configuración de los volúmenes configurados en un contenedor necesitamos el id del contenedor de interés y el siguiente comando:

docker inspect <id_contenedor>

Lo cual nos devuelve toda la configuración del contenedor en formato json, pero si vemos en el nodo “Mounts” podremos ver algo así:

{
    ...
    "Mounts": [
        {
            "Type": "volume",
            "Name": "proyecto",
            "Source": "/var/lib/docker/volumes/proyecto/_data",
            "Destination": "/usr/share/nginx/html",
            "Driver": "local",
            "Mode": "",
            "RW": false,
            "Propagation": ""
        }
    ],
    ... 
}

finalmente si queremos quitar un volumen de un contenedor que ya no vamos a ocupar, podemos ejecutar los siguientes comando en una terminal:

docker container stop <id_contenedor>
docker container rm <id_contenedor>
docker volume rm proyecto

Y esas son todas las operaciones básicas que se pueden realizar sobre un volumen en un contenedor docker.

Categorized in:

Tagged in:

,