Gestión de Datos Persistentes en Docker: Volúmenes y Contenedores de Volúmenes

En entornos de producción, es crucial asegurar la persistencia de datos y facilitar el intercambio de información entre contenedores Docker. La gestión de estos datos se aborda principalmente mediante dos mecanismos:

  • Volúmenes (Data Volumes): Mapean datos directamente desde el contenedor a un entorno del host.
  • Contenedores de Volúmenes (Data Volume Containers): Utilizan un contenedor específico para gestionar los volúmenes y compartirlos.

Copia de Archivos entre Host y Contenedor

Aunque es el método más básico y menos recomendado para la gestión de datos compartidos o persistentes debido a la falta de interacción y sincrnoización, es posible copiar archivos entre el host y un contenedor Docker. Este método trata los datos como entidades separadas.

Para copiar un archivo o directorio desde el host a un contenedor, se utiliza el comando docker cp.

Supongamos que tenemos un archivo ~/ht/docker/miarchivo.txt en el host que deseamos copiar al directorio /app/data dentro de un contenedor llamado mi_contenedor:

docker cp /ht/docker/miarchivo.txt mi_contenedor:/app/data

Este enfoque no es ideal para la gestión de datos que requieren persistencia o que deben ser compartidos activamente entre contenedores.

Volúmenes de Datos (Data Volumes)

Los volúmenes son directorios que los contenedores pueden acceder, pero que residen fuera del sistema de archivos raíz del contenedor. Permiten que los datos "vivan" independientemente del ciclo de vida del contenedor y facilitan el intercambio de datos entre ellos, eludiendo el sistema de capas de las imágenes de Docker. Por defecto, los volúmenes se almacenan en /var/lib/docker/volumes/ en el host.

Operaciones con Volúmenes

  1. Crear un Volumen: ``` docker volume create mi-volumen

    
     Este comando crea un volumen llamado `mi-volumen`, que se almacenará en `/var/lib/docker/volumes/`. Para listar los volúmenes en el host, se puede usar: ```
    ls -1 /var/lib/docker/volumes/
    
  2. Listar Volúmenes: ``` docker volume ls

  3. Inspeccionar un Volumen: ``` docker volume inspect mi-volumen

    
     Esto muestra información detallada del volumen en formato JSON.
    
  4. Eliminar un Volumen: ``` docker volume rm mi-volumen

    
     Los volúmenes no se eliminan automáticamente cuando se eliminan los contenedores asociados. Es importante gestionar y eliminar los volúmenes que ya no se utilizan para evitar el consumo innecesario de espacio en disco.
    
  5. Montar un Volumen al Iniciar un Contenedor: Se recomienda usar la opción --mount al lanzar un contenedor para asociar un volumen. Ejemplo 1: Montar el volumen mi-volumen en el directorio /app dentro de un contenedor:

    docker run -d \
           -it \
           --name contenedor-app \
           --mount source=mi-volumen,target=/app \
           imagen-base:latest
    

    Esto mapea el directorio /var/lib/docker/volumes/mi-volumen/_data en el host con el directorio /app dentro de contenedor-app. Ejemplo 2: Usando type=bind para mapear un directorio específico del host:

    docker run -d \
           -it \
           --name contenedor-datos \
           --mount type=bind,source=/ruta/en/el/host/datos,target=/datos/en/contenedor \
           imagen-base:latest
    

    Opciones Avanzadas de --mount

    La opción --mount permite especificar el tipo de montaje:

    • type=volume: Montaje de volumen estándar (por defecto). Docker gestiona la ubicación en el host. ``` --mount type=volume,source=mi-volumen,target=/webapp
    • type=bind: Montaje de enlace. Mapea un archivo o directorio existente del host al contenedor. ``` --mount type=bind,source=/ruta/host/archivo,target=/ruta/contenedor/archivo
    • type=tmpfs: Montaje temporal. Los datos residen únicamente en la memoria RAM del host y se pierden al detener el contenedor. ``` docker run -d
      -it
      --name contenedor-temp
      --mount type=tmpfs,destination=/app_temporal
      nginx:latest
      
      

Contenedores de Volúmenes

Para compartir datos que se actualizan frecuentemente entre múltiples contenedores, los contenedores de volúmenes son una solución sencilla. Un contenedor de volumen se crea específicamente para contener y proporcionar volúmenes a otros contenedores.

Operaciones con Contenedores de Volúmenes

  1. **Crear un Contenedor de Volumen:**Se crea un contenedor que monta un volumen en una ruta específica. Este contenedor servirá como fuente de datos.

    docker run -di --name vol-fuente -v /datos-compartidos centos:7
    

    Aquí, /datos-compartidos dentro del contenedor vol-fuente es el volumen que se compartirá.

  2. **Montar el Volumen de Otro Contenedor:**Otros contenedores pueden acceder a los volúmenes de un contenedor de volumen usando la opción --volumes-from.

    Crear contenedor1 y contenedor2 que compartan los volúmenes de vol-fuente:

    docker run -di --name contenedor1 --volumes-from vol-fuente centos:7
    docker run -di --name contenedor2 --volumes-from vol-fuente centos:7
    

    Ahora, si se crea un archivo dentro de la ruta montada (/datos-compartidos) en contenedor1, estará disponible en contenedor2 y viceversa. ```

    Dentro de contenedor1

    docker exec -it contenedor1 bash cd /datos-compartidos echo "Hola desde contenedor1" > archivo_compartido.txt

    Dentro de contenedor2

    docker exec -it contenedor2 bash cd /datos-compartidos cat archivo_compartido.txt

Etiquetas: Docker volumenes persistecia de datos gestión de datos bind mounts

Publicado el 6-5 00:12