Por qué un contenedor pierde sus datos al reiniciarse
Escribe una fila en una base de datos que corre en un contenedor de Docker, para el contenedor y arráncalo otra vez: la fila ya no está.
Cada contenedor recibe su sistema de archivos recién sacado de su imagen cada vez que arranca. Todo lo que el propio contenedor escribe (archivos de base de datos, subidas, logs) va a parar a una capa de escritura que se descarta cuando el contenedor se elimina. Un volumen Docker es la forma de mantener esos datos fuera del contenedor, donde sobreviven.
¿Qué es un Volumen Docker?
Un volumen Docker es un mecanismo para guardar los datos fuera del contenedor, de manera que persistan incluso cuando el contenedor se para, reinicia o elimina.
Piensa en los volúmenes como un disco duro externo que conectas a tu contenedor. Los datos se escriben en este “disco externo” y permanecen seguros independientemente de lo que le pase al contenedor.
¿Por Qué Usar Volúmenes?
- Persistencia: los datos sobreviven al ciclo de vida del contenedor
- Compartición: varios contenedores pueden acceder a los mismos datos
- Backup: es más fácil hacer copias de seguridad de los datos
- Rendimiento: los volúmenes están optimizados para las operaciones I/O
- Portabilidad: puedes mover los datos entre diferentes hosts
Volúmenes, bind mounts y tmpfs: cuál usar
Hay tres formas de persistir datos, en el orden en que deberías recurrir a ellas: volúmenes, bind mounts, tmpfs.
1. Volúmenes (Volumes) - La Elección Recomendada
Los volúmenes son gestionados completamente por Docker y guardados en un directorio especial en el host (/var/lib/docker/volumes/ en Linux).
| |
Ventajas:
- Gestionados por Docker (fáciles de crear, eliminar, inspeccionar)
- Funcionan en Linux, Windows y Mac
- Pueden compartirse entre varios contenedores
- Soportan drivers para almacenamiento remoto (cloud, NFS, etc.)
2. Bind Mounts - Conexión Directa
Los bind mounts conectan una carpeta específica de tu ordenador directamente al contenedor.
| |
Cuándo usarlos:
- Durante el desarrollo, para ver los cambios en el código en tiempo real
- Cuando necesitas acceder a archivos específicos del sistema host
- Para compartir configuraciones entre host y contenedor
Atención: los bind mounts dependen de la estructura del sistema de archivos del host, por lo que son menos portables.
3. tmpfs Mounts - Datos Temporales en Memoria
Los tmpfs mounts guardan los datos en la RAM del host, no en disco.
| |
Cuándo usarlos:
- Para datos sensibles que no deben escribirse en disco
- Para cachés temporales de alto rendimiento
- Los datos se pierden cuando el contenedor se para (y eso es exactamente lo que quieres)
Comandos de volúmenes Docker: create, list, inspect, remove
Crear un Volumen
| |
Listar los Volúmenes
| |
Inspeccionar un Volumen
| |
Este comando muestra dónde está físicamente guardado el volumen y otra información útil.
Eliminar un Volumen
| |
Atención: eliminar un volumen significa perder todos los datos contenidos. No hay papelera ni recuperación.
Ejemplos de volúmenes Docker: base de datos, desarrollo con recarga, compartir
Ejemplo 1: Base de Datos MySQL con Datos Persistentes
Sin volumen, cada vez que reinicias el contenedor MySQL pierdes todos los datos. Así es cómo resolverlo:
| |
Ahora puedes parar, reiniciar o incluso eliminar y recrear el contenedor: los datos de la base de datos permanecerán intactos en el volumen mysql-data.
Ejemplo 2: Desarrollo Web con Bind Mount
Durante el desarrollo, quieres que las modificaciones al código sean inmediatamente visibles en el contenedor:
| |
Cada modificación a los archivos en la carpeta src estará inmediatamente disponible en el contenedor.
Ejemplo 3: Compartir Datos entre Contenedores
Dos contenedores que deben acceder a los mismos archivos:
| |
Volúmenes en Docker Compose
En Docker Compose declaras los volúmenes una vez y cada servicio que los necesita los referencia por su nombre:
| |
Con un simple docker-compose up, Docker crea automáticamente los volúmenes necesarios.
Backup y Restauración de Volúmenes
Hacer Backup de un Volumen
| |
Este comando:
- Monta el volumen en solo lectura (
ro) - Crea un archivo comprimido en el directorio actual
Restaurar un Backup
| |
Errores habituales con los volúmenes Docker
1. Olvidar Usar Volúmenes para las Bases de Datos
Si usas una base de datos en Docker sin volumen, perderás todos los datos. Siempre.
2. Usar Bind Mounts en Producción
Los bind mounts son geniales para el desarrollo, pero en producción usa volúmenes Docker para mayor portabilidad y seguridad.
3. No Hacer Backup de los Volúmenes
Los volúmenes no se incluyen automáticamente en los backups del sistema. Planifica backups regulares.
4. Acumular Volúmenes Huérfanos
Cuando eliminas contenedores, los volúmenes permanecen. Usa periódicamente:
| |
Para eliminar los volúmenes que ya no están conectados a ningún contenedor.
Qué opción de almacenamiento para cada caso
| Escenario | Solución |
|---|---|
| Base de datos en producción | Volumen Docker |
| Desarrollo local | Bind mount |
| Datos sensibles temporales | tmpfs |
| Compartición entre contenedores | Volumen Docker |
| Archivos de configuración | Bind mount o Volumen |
| Logs de aplicación | Volumen Docker |
La regla que cubre casi todos los casos
Usa un volumen con nombre para todo lo que un contenedor escriba y quieras conservar, empezando por las bases de datos. Usa un bind mount cuando quieras que el contenedor vea una carpeta de tu máquina según la editas, que es sobre todo el desarrollo local. Deja tmpfs para los datos que nunca deben tocar el disco.
Cuando una base de datos tiene un volumen, puedes borrar y recrear su contenedor tantas veces como quieras y los datos siguen ahí. Ese es todo el objetivo.