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
-
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/ -
Listar Volúmenes: ``` docker volume ls
-
Inspeccionar un Volumen: ``` docker volume inspect mi-volumen
Esto muestra información detallada del volumen en formato JSON. -
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. -
Montar un Volumen al Iniciar un Contenedor: Se recomienda usar la opción
--mountal lanzar un contenedor para asociar un volumen. Ejemplo 1: Montar el volumenmi-volumenen el directorio/appdentro de un contenedor:docker run -d \ -it \ --name contenedor-app \ --mount source=mi-volumen,target=/app \ imagen-base:latestEsto mapea el directorio
/var/lib/docker/volumes/mi-volumen/_dataen el host con el directorio/appdentro decontenedor-app. Ejemplo 2: Usandotype=bindpara 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:latestOpciones Avanzadas de
--mountLa opción
--mountpermite 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=/webapptype=bind: Montaje de enlace. Mapea un archivo o directorio existente del host al contenedor. ``` --mount type=bind,source=/ruta/host/archivo,target=/ruta/contenedor/archivotype=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
-
**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:7Aquí,
/datos-compartidosdentro del contenedorvol-fuentees el volumen que se compartirá. -
**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
contenedor1ycontenedor2que compartan los volúmenes devol-fuente:docker run -di --name contenedor1 --volumes-from vol-fuente centos:7 docker run -di --name contenedor2 --volumes-from vol-fuente centos:7Ahora, si se crea un archivo dentro de la ruta montada (
/datos-compartidos) encontenedor1, estará disponible encontenedor2y 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