Cuando creamos un contenedor de Docker, al tratarse de ejecuciones no persistentes, tenemos el problema de donde almacenamos los datos. Imaginemos que queremos montar una base de datos, pero cada vez que paramos el contenedor perdemos todos los datos almacenados, pues bien, una de las formas que tenemos de solucionar ese problema es a través de los volúmenes de datos.
¿Qué es un volumen de datos (Data Volume)?
Un volumen de datos es una carpeta física en nuestro equipos donde se almacenan datos del contenedor. Estos volúmenes se especifican en el fichero Dockerfile.
Podemos ver por ejemplo en el fichero Dockerfile de la imagen de mariadb. Aquí podemos ver como crea un volumen en
/var/lib/mysql
a través de la sentencia
VOLUME /var/lib/mysql
. Esto significa que el contenido de la carpeta de /var/lib/mysql se encontrará dentro del sistema anfitrión como un volumen,
Ver volúmenes de un contenedor
Para ver los volúmenes que está usando un contenedor deberemos usar el comando de inspección de contenedores
docker container inspect nombre_contenedor
y buscar la entrada "Mounts" de la respuesta del comando.
Lo que podemos ver aquí, simplificando bastante es lo siguiente: La carpeta del contenedor /var/lib/mysql se encuentra dentro de nuestro equipo real en la ruta /home/test/Dev/third-party-cms/data/db/mysql.
Listar volúmenes
Para listar volúmenes tenemos el comando
docker volume ls
.
Fijaos en la cantidad de volúmenes que tengo, en breve os contaré por qué hay tantos volúmenes, y no es por cantidad de contenedores, que apenas tengo 3 ahora mismo.
Ver detalles de un volumen
Para ver los detalles de un volumen usamos el comando inspect de volume de la siguiente manera:
docker volume inspect nombre_volumen
.
En la salida podremos ver todos sus datos, incluyendo la carpeta del anfitrión donde se encuentran el volumen.
Eliminar volúmenes
Aquí viene el por qué tengo tantos volúmenes, y es porque cuando eliminamos un contenedor los volúmenes asociados a este no se eliminan, ya que podría reusarse posteriormente si lo especificamos, pero que nos va dejando cosas en el disco que quizá no necesitemos
Para eliminar un volumen tenemos el comando
docker volume rm nombre_volumen
A parte tenemos otra opción que es prune con la que eliminaremos los volúmenes de contenedores que ya no existen. El comando se ejecuta de la siguiente manera:
docker volume prune
.
Cuando lo ejecutamos nos pide confirmación y nos avisa de que se eliminarán todos los volúmenes que no estén en al menos un contenedor. Viendo la documentación no me queda claro si los contenedores tienen que estar en ejecución o no.
Nombrar volúmenes
Una cosa útil que se puede hacer con los volúmenes es ponerles un nombre, para eso, a la hora de ejecutar un contenedor de una imagen que tiene un volumen le podemos especificar un nombre. Esto nos puede venir muy bien para usar siempre el mismo volumen, incluso con diferentes contenedores.
Para nombrar un volumen lo haremos con el parámetro -v del comando de ejecución de contenedores:
docker container run -d --name database -v mariadb-db:/var/lib/mysql mariadb
. En el ejemplo mariadb-db es el nombre que le ponemos al volumen, y separada por dos puntos la ruta del volumen que estamos nombrando
nombre_volumen:ruta_volumen
. Ahora cuando listemos los volúmenes existentes podremos encontrarlo con nuestro nombre y podremos usarlo de la misma forma a la hora de levantar nuevos contenedores.