Saltar a contenido

Volumenes

Los volúmenes o volumes son directorios del sistema anfitrión a los cuales los contenedores pueden acceder para leer o escribir archivos de datos. Estos datos pueden ser registros del funcionamiento del contenedor, bases de datos creadas en la ejecución, rutinas de lenguajes interpretados por el contenedor que se requiere poder actualizar desde fuera, etc. El uso de volúmenes permite mantener los datos afuera del contenedor, previniendo su borrado cuando se eliminan los contenedores.

Tipos de volúmenes

Hay varios tipos de volumenes en base a su creación:

  • Anónimos: en éstos solo se indica la ruta de origen a montar. No son referenciables desde otros contenedores. El gestor de contenedores elige la ubicación automáticamente.
  • Nombrados: son similares a los volúmenes anónimos pero pueden ser referenciados por múltiples contenedores gracias a su nombre, permitiendo su compartimento y reutilización.
  • De anfitrión o host: en estos volúmenes se indica qué carpeta montar y adónde montarla.

Gestionar volumenes

Crear

Volumen - crear
docker volume create nombre_volumen
Volumen - crear
podman volume create nombre_volumen

Listar

La lista de los volúmenes de usuario se obtiene con el comando list:

Listado de volumenes
docker volume list
Listado de volumenes
podman volume list

Inspeccionar

La información del volumen elegido se obtiene con el comando inspect:

Volumen - inspeccionar
docker volume inspect nombre_volumen 
Volumen - inspeccionar
podman volume inspect nombre_volumen 

El punto de montaje es la ruta donde el volumen almacenará los datos. Éste se consulta con la opción --format {{.Mountpoint}} :

Volumen - punto de montaje
docker volume inspect nombre_volumen --format {{.Mountpoint}}
Volumen - punto de montaje
podman volume inspect nombre_volumen --format {{.Mountpoint}}

En el ejemplo, el punto de montaje queda: /home/USUARIO/.local/share/containers/storage/volumes/nombre_volumen/_data

Volumenes en Linux

En sistemas Linux, la ruta habitual de almacenamiento de los volúmenes es:

/home/USUARIO/.local/share/containers/storage/volumes/

Más información sobre el comando inspect.

Borrar voluemn

Los volumenes se pueden eliminar uno a uno con ayuda del comando rm:

Borrar volumen
docker volume rm nombre_volumen
Borrar volumen
podman volume rm nombre_volumen

Volumenes del sistema en Linux

Los volúmenes del sistema son invisibles para el usuario a menos que se recurra a la orden sudo para ejecutar los comandos:

volumenes del sistema
sudo podman volume create nombre_volumen    # crear
sudo podman volume inspect nombre_volumen   # inspeccionar
sudo podman volume list                     # listar
sudo podman volume rm  nombre_volumen       # borrar

Los volumenes del sistema en Linux se guardan en la ruta: /var/lib/containers/storage/volumes/

Borrar (no utilizados)

Con el comando prune se puede eliminar aquellos contenedores que no están siendo usados por ningun contenedor:

Borrar volumenes no usados
docker volume prune
Borrar volumenes no usados
podman volume prune

Este comando lista los volumenes susceptibles de ser borrados y pide confirmación antes de eliminarlos.

Crear contenedores con volumenes

La forma de configurar el agregado de volumenes es mediante la opción -v. Con ella se especifican:

  • el nombre del volumen o la ruta del directorio del anfitrión;
  • la ruta interna del contenedor sobre la que se debe montar el volumen.

Se permite la asignación de múltiples volumenes al mismo contenedor usando repetidas veces la opcíón -v.

Volumenes con nombre

El nuevo contenedor puede acceder a un volumen preexistente en base a su nombre:

montaje de volumen - solo lectura
docker create -v nombre_volumen:ruta_montaje_interna  nombre_imagen
montaje de volumen - solo lectura
podman create -v nombre_volumen:ruta_montaje_interna  nombre_imagen

Ruta de host

Otra manera de implementar el volumen es indicando directamente la ruta del sistema anfitrión al que el contenedor tendrá acceso:

montaje de volumen - solo lectura
docker create -v ruta_host:ruta_montaje_interna  nombre_imagen
montaje de volumen - solo lectura
podman create -v ruta_host:ruta_montaje_interna  nombre_imagen

Sólo lectura

Los volumenes se pueden agregar a los contenedores con la opción ro (read only)

montaje de volumen - solo lectura
podman create -v nombre_volumen:ruta_montaje_interna:ro  nombre_imagen

Ejemplo aplicado: base de datos

En este ejemplo se crea una base de datos SQL con la imagen oficial de MariaDB. Se agregan las siguientes configuraciones:

  • la conexion se mantiene en el puerto 3306 (predefinido);
  • acceso con usuario root (administrador) y contraseña 1234;
  • una base de datos vacía llamada mi-db;
  • un volumen pesistente para la base de datos interna.

Primero se exportan los valores de las variables de entorno:

variables de entorno
# variables de entorno
export MARIADB_ROOT_PASSWORD=1234
export MARIADB_DATABASE=mi-db

Luego se crea un volumen nombrado mariadb-persistente:

volumen
# creacion volmen
docker volume create mariadb-persistente
volumen
# creacion volmen
podman volume create mariadb-persistente 

Y por último se crea el contenedor, con el nombre mariadb-test:

contenedor con volumen
docker create --name mariadb-test -p3306:3306 \
-e MARIADB_DATABASE \
-e MARIADB_ROOT_PASSWORD \
-v mariadb-persistente:/var/lib/mysql \
--replace  mariadb:latest  
contenedor con volumen
podman create --name mariadb-test -p3306:3306 \
-e MARIADB_DATABASE \
-e MARIADB_ROOT_PASSWORD \
-v mariadb-persistente:/var/lib/mysql \
--replace  mariadb:latest  

Para poder verificar que el contenedor está bien configurado sólo hay que cargar los datos en un conector o programa front compatible con bases MariaDB y verificar que la conexión es exitosa. Y para corroborar la persistencia de datos hay que:

  • crear cambios (tablas, otras bases de datos, etc);
  • borrar el contenedor
  • crear el contenedor de nuevo.

Los datos agregados o modificados deben seguir allí.

TIP: rutas para bases de datos

Los gestores de bases de datos tienen ciertas rutas predefinidas para guardar la información. En los sistemas Linux estas rutas son:

Base de datos ruta de montaje
MySQL / MariaDB /var/lib/mysql
PostgreSQL /var/lib/postgresql/data
MongodB /data/db

Dado que las imágenes de Docker y Podman son basadas en distribuciones Linux, estas mismas rutas son las usadas adentro del contenedor.

Rutinas en volumenes

Una posibilidad que permiten los volumenes es pasar las rutinas a ejecutar por adentro de ellos. Esto evita tener que reconstruir los containers cada vez que se hagan cambios en las rutinas.

Referencias

RedHat.com - Compartiendo archivos entre dos contenedores

Docker Docs - Volumes