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.
[…] especificar la versión del formato de archivo Compose, al menos un servicio y, opcionalmente, volúmenes y […]
Me parece excelente el material, muchas gracias por tomarte el tiempo de hacerlo.
Saludos
Muy buen material!
Tengo una consulta, entonces cuando se crea un volumen para hacer este matcheo de archivos, los mismos estarían ocupando el doble de espacio?
Yo tengo una aplicación dockerizada en donde los usuarios suben archivos pdf (pesados) y tengo creado un volumen, efectivamente los archivos están dentro de la carpeta del contenedor y dentro del SO en donde corre el contenedor, pero mi pregunta es si es solo lógicamente o fisicamente estánn ocupando el doble de espacio?
Desde ya muchas gracias, Saludos
Cuando mides el “peso” del volumen dentro del contenedor (me imagino que haciendo ssh al container) el mecanismo es el mismo que con un directorio, excepto que te va a dar el espacio total ocupado por el volumen, esto no significa que esten 2 veces. Analogamente es como si vieras cuanto espacio hay ocupado en un USB drive.