Cómo funciona el almacenamiento en Docker: volúmenes vs montajes de enlace
Introducción
En este tutorial, aprenderás cómo funciona el almacenamiento en Docker y cómo persistir datos usando Volúmenes de Docker y Bind Mounts. También entenderás las diferencias clave entre estos enfoques y cuándo usar cada uno en producción. Esto te ayudará a evitar la pérdida de datos y diseñar sistemas en contenedores confiables.
Requisitos previos
- Público objetivo: Administradores de sistemas principiantes
- Tiempo estimado: ~30 minutos
- Sistema operativo: Cualquier SO con soporte para Docker como Ubuntu 22.04+, Debian 12+, CentOS Stream, o macOS con Docker Desktop
- Software: Docker 24.0.0 o posterior
- Permisos: Usuario con acceso a Docker o privilegios de sudo
- Hardware: Al menos 2 GB de RAM y 10 GB de espacio libre en disco
- Red: Acceso a Internet para descargar imágenes de contenedores
- Conocimientos asumidos: Uso básico de la línea de comandos y comprensión de contenedores
Paso 1: Entender cómo funciona el almacenamiento en Docker
Los contenedores de Docker utilizan un sistema de archivos en capas. Cada contenedor tiene una capa escribible sobre capas de imagen de solo lectura.
Qué sucede cuando un contenedor escribe datos
- Docker almacena las capas de imagen como de solo lectura
- Cuando inicias un contenedor, Docker añade una capa escribible
- Cualquier cambio en archivos ocurre solo en esta capa escribible
Resultado
Cuando eliminas un contenedor, todos los datos en la capa escribible se pierden. Esto significa que el almacenamiento de contenedores es efímero por defecto.
Este comportamiento es útil para aplicaciones sin estado pero no para bases de datos o servicios persistentes.
Paso 2: Crear y usar Volúmenes de Docker
Los Volúmenes de Docker son ubicaciones de almacenamiento gestionadas creadas y mantenidas por Docker.
Crear un volumen
Ejecuta el siguiente comando:
docker volume create my_volume
Deberías ver el nombre del volumen devuelto.
Usar un volumen en un contenedor
Ejecuta el siguiente comando:
docker run -d -v my_volume:/app/data --name volume_test busybox
Docker monta el volumen dentro del contenedor en /app/data.
Resultado
Los datos escritos en /app/data persisten incluso si el contenedor es eliminado.
Características clave de los volúmenes
- Gestionados por Docker
- Almacenados en directorios internos de Docker como
/var/lib/docker/volumes/ - Fáciles de respaldar y migrar
- Aislados de la estructura del sistema de archivos del host
Usa volúmenes para bases de datos y cargas de trabajo en producción.
Paso 3: Crear y usar Bind Mounts
Los Bind Mounts enlazan un directorio específico en el host a un directorio dentro del contenedor.
Usar un bind mount
Ejecuta el siguiente comando:
docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox
Resultado
El contenedor accede directamente al directorio del host. Cualquier cambio en el directorio del host es inmediatamente visible dentro del contenedor.
Características clave de los bind mounts
- Dependen de las rutas del sistema de archivos del host
- Permiten la edición directa de archivos desde el host
- No hay aislamiento gestionado por Docker
- Más flexibles pero menos portátiles
Los bind mounts reflejan cambios inmediatamente entre el host y el contenedor.
Paso 4: Comparar Volúmenes y Bind Mounts
Entender las diferencias te ayuda a elegir la opción correcta.
Volúmenes de Docker
- Gestionados por Docker
- Portátiles entre entornos
- Más seguros para uso en producción
- Más fáciles de respaldar
- Abstraídos del sistema de archivos del host
Bind Mounts
- Gestionados por el host
- Vinculados a rutas específicas del sistema de archivos
- Útiles para desarrollo
- Proporcionan acceso directo a archivos
- Menos seguros si se configuran incorrectamente
Paso 5: Elegir entre Volúmenes y Bind Mounts en Producción
Usa las siguientes pautas.
Cuándo usar Volúmenes de Docker
- Ejecutar bases de datos como MySQL o PostgreSQL
- Almacenar datos de aplicaciones que deben persistir
- Desplegar servicios en producción
- Necesitar portabilidad entre servidores
Cuándo usar Bind Mounts
- Entornos de desarrollo local
- Editar código o archivos de configuración directamente
- Depurar el comportamiento de contenedores
- Configuraciones temporales o de prueba
Importante: Los bind mounts pueden exponer archivos sensibles del host a los contenedores si se configuran incorrectamente. Siempre verifica rutas y permisos.
Verificación y Pruebas
Crea un contenedor de prueba con un volumen:
docker run -it -v my_volume:/data --name playground busybox
Dentro del contenedor, crea un archivo:
echo test > /data/file.txt
Sal del contenedor y elimínalo:
docker rm -f playground
Inicia un nuevo contenedor con el mismo volumen:
docker run -it -v my_volume:/data --name playground busybox
Verifica el archivo:
cat /data/file.txt
Resultado esperado: El archivo aún existe, confirmando la persistencia de datos.
Revertir Cambios
Para limpiar recursos, ejecuta los siguientes comandos:
docker rm -f playground volume_test bind_test
docker volume rm my_volume
docker system prune -f
Importante: Eliminar volúmenes borra todos los datos almacenados permanentemente.
Solución de Problemas
- Problema: Los datos desaparecen después de reiniciar el contenedor
Causa: No se usó volumen o bind mount
Solución: Adjunta almacenamiento persistente usando volúmenes o bind mounts - Problema: Errores de permiso denegado
Causa: Desajuste de permisos del directorio del host
Solución: Ajusta permisos usandochmodochown - Problema: El volumen no se monta correctamente
Causa: Ruta o sintaxis incorrecta
Solución: Verifica el formato de montaje y las rutas
Conclusión y Próximos Pasos
Aprendiste cómo funciona el almacenamiento en Docker y cómo persistir datos usando volúmenes y bind mounts. También entiendes cuándo usar cada enfoque en producción. A continuación, explora Docker Compose para gestionar aplicaciones de múltiples contenedores y definir almacenamiento de una manera más estructurada.