Uno de los conceptos más importantes al trabajar con Docker es entender cómo se gestionan los datos dentro de los contenedores. Por defecto, los contenedores son efímeros, lo que significa que los cambios realizados en su sistema de archivos se pierden cuando se eliminan. Esto es un problema si necesitas que los datos sobrevivan a reinicios, actualizaciones o eliminaciones. En este post, explicaremos cómo funciona la persistencia en Docker y las distintas estrategias disponibles.
¿Qué ocurre con los datos en Docker?
Los datos generados o almacenados dentro de un contenedor se guardan en su sistema de archivos interno. Sin embargo:
- Si el contenedor se detiene: Los datos permanecen mientras el contenedor no sea eliminado.
- Si el contenedor se elimina: Todos los datos dentro del contenedor se pierden, a menos que se haya configurado persistencia mediante volúmenes o bind mounts.
Estrategias para lograr persistencia en Docker
Existen dos formas principales de mantener datos persistentes en Docker:
volúmenes y bind mounts.
1. Volúmenes de Docker
Un volumen es un almacenamiento independiente que Docker administra directamente. Se crea fuera del ciclo de vida de los contenedores lo que significa que los datos permanecen aunque elimines el contenedor.
Ventajas de los volúmenes:
- Gestionados directamente por Docker.
- Fáciles de crear y compartir entre contenedores.
- Separan claramente los datos del sistema de archivos del contenedor.
Cómo usar volúmenes:
1.Crear un volumen:
docker volume create mydata
2. Montar el volumen en un contenedor:
docker run -d --name linux2 -v mydata:/data almalinux
Puede que aparezca un error si el contenedor ya existe, debemos eliminarlo antes
docker: Error response from daemon: Conflict. The container name "/linux2" is already in use by container "60cefee1faf8b6591f9f880f1d5bef9b60614983220f5efb3ce8d7cde2e694db". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
WARNING: AQUÍ BORRAREMOS TODO EL CONTENEDOR Y SU CONTENIDO
docker rm linux2
docker run -d --name linux2 -v mydata:/data almalinux
Si estamos usando el laboratorio propuesto en el post anterior de “Laboratorios Linux con docker”:
docker run -d --name linux2 -v mydata:/data --net labnet --ip 192.168.100.102 -h linux2 -it almalinux
docker run -it --rm -v mydata:/data almalinux ls /data
2. Bind Mounts
Un bind mount permite mapear una carpeta del sistema anfitrión directamente al contenedor. Esto es útil si necesitas acceder a archivos específicos en tu máquina host.
Ventajas de los bind mounts:
- Permite editar archivos directamente en el sistema anfitrión.
- Flexibilidad para usar rutas específicas en el host.
Cómo usar bind mounts:
- Montar una carpeta del host:
docker run -d --name linux3 -v /path/to/host/folder:/data almalinux
- Acceso bidireccional: Los cambios en /data dentro del contenedor se reflejan directamente en /path/to/host/folder y viceversa.
Ejemplo:
Creamos un directorio en el equipo host (Windows)
md c:\Linux3-Data
docker run -d --name linux3 -v /Linux3-Data:/data almalinux
Si estamos usando el laboratorio propuesto en el post anterior de “Laboratorios Linux con docker”:
docker run -d --name linux3 -v C:\\Linux3-Data:/data --net labnet --ip 192.168.100.103 -h linux3 -it almalinux
Creamos un archivo de texto dentro del directorio montado por bin mounts.
Set-Content "Sysadmit.com" C:\Linux3-Data\1.txt
get-content C:\Linux3-Data\1.txt
sysadmit.com
Verificamos desde dentro del contenedor:
docker exec -it linux3 cat /data/1.txt
sysadmit.com
Los archivos y carpetas son accesibles tanto desde el host como des del contenedor.
¿Cuándo elegir volúmenes o bind mounts?
- Usa volúmenes cuando:
- Quieres que Docker gestione los datos.
- Planeas compartir los datos entre múltiples contenedores.
- Usa bind mounts cuando:
- Necesitas acceder a archivos específicos desde tu host.
- Quieres editar directamente los datos almacenados.
¿Qué ocurre al reiniciar un contenedor?
Si usas volúmenes o bind mounts, los datos persisten incluso después de detener o eliminar el contenedor.
Sin volúmenes ni bind mounts, todos los datos en el sistema de archivos del contenedor se pierden al eliminarlo.
En resumen
- Sin configuraciones adicionales, los datos en un contenedor se pierden al eliminarlo.
- Para datos gestionados por Docker y más de un contenedor: Usa volúmenes
- Para interactuar directamente con archivos en el host y para sólo un contenedor: Usa bind mounts
El autor de este post es Pol Padrisa.
No hay comentarios:
Publicar un comentario