Almacenamiento y Persistencia en Docker
Almacenamiento y Persistencia en Docker
📚 Introducción al Almacenamiento en Docker
Cuando trabajamos con contenedores Docker, es fundamental entender que los contenedores son efímeros. Esto significa que cuando un contenedor es eliminado, toda la información almacenada dentro de él desaparece. Para solucionar este problema, Docker ofrece diferentes mecanismos de persistencia de datos.
🗂️ Tipos de Almacenamiento en Docker
1. Volúmenes Docker (Recomendado)
2. Bind Mounts (Montajes de directorio)
3. tmpfs mounts (Solo en Linux, en memoria)
🔧 VOLÚMENES DOCKER
Creación y Gestión de Volúmenes
Crear un volumen
# Crear un volumen llamado 'mis_datos'
docker volume create mis_datos
# Listar todos los volúmenes disponibles
docker volume ls
# Inspeccionar un volumen específico
docker volume inspect mis_datosEjemplo de salida de docker volume inspect:
[
{
"CreatedAt": "2024-01-15T10:28:10Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/mis_datos/_data",
"Name": "mis_datos",
"Options": {},
"Scope": "local"
}
]Usar un volumen en un contenedor
# Montar el volumen en un contenedor
docker run -d \
--name mi-contenedor \
-v mis_datos:/ruta/en/contenedor \
nginx:latest
# Forma alternativa usando --mount (más explícita)
docker run -d \
--name mi-contenedor \
--mount source=mis_datos,target=/ruta/en/contenedor \
nginx:latestEjemplo práctico: Base de datos PostgreSQL
# Crear volumen para datos de PostgreSQL
docker volume create postgres_data
# Ejecutar contenedor con volumen persistente
docker run -d \
--name postgres-db \
-e POSTGRES_PASSWORD=mi_password \
-v postgres_data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:13Eliminar Volúmenes
# Eliminar un volumen específico
docker volume rm mis_datos
# Eliminar todos los volúmenes no utilizados
docker volume prune
# Eliminar contenedor y su volumen (si no hay otros contenedores usándolo)
docker rm -v nombre_contenedor📁 BIND MOUNTS (Montajes de Directorio Local)
Usar directorios locales en contenedores
Ejemplo básico en Linux/Mac
# Montar directorio local en contenedor
docker run -d \
--name nginx-local \
-v $(pwd)/html:/usr/share/nginx/html \
-p 8080:80 \
nginx:latestEjemplo en Windows PowerShell
# Montar directorio local en contenedor
docker run -d `
--name nginx-local `
-v ${PWD}/html:/usr/share/nginx/html `
-p 8080:80 `
nginx:latest
# O con ruta absoluta
docker run -d `
--name docker-nginx `
-p 8080:80 `
-v C:\docker-nginx\html:/usr/share/nginx/html `
nginx:latestEjemplo con permisos de solo lectura
# Montar directorio como solo lectura
docker run -d \
--name nginx-readonly \
-v $(pwd)/config:/etc/nginx/conf.d:ro \
-p 80:80 \
nginx:latest🚀 EJEMPLOS PRÁCTICOS COMPLETOS
1. Aplicación Web con Volumen Persistente
# Crear volumen para la aplicación
docker volume create app_data
# Ejecutar contenedor con volumen
docker run -d \
--name mi-aplicacion \
-v app_data:/app/data \
-p 3000:3000 \
mi-imagen:latest
# Verificar que los datos persisten
docker stop mi-aplicacion
docker rm mi-aplicacion
# Crear nuevo contenedor con mismo volumen
docker run -d \
--name mi-aplicacion-nueva \
-v app_data:/app/data \
-p 3000:3000 \
mi-imagen:latest2. Desarrollo con Bind Mount para Hot Reload
# Para desarrollo - cambios se reflejan inmediatamente
docker run -d \
--name dev-app \
-v $(pwd)/src:/app/src \
-v $(pwd)/public:/app/public \
-p 3000:3000 \
node:16-alpine3. Base de Datos MySQL con Configuración Personalizada
# Crear volúmenes para datos y configuración
docker volume create mysql_data
docker volume create mysql_config
# Ejecutar MySQL con volúmenes
docker run -d \
--name mysql-db \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysql_data:/var/lib/mysql \
-v mysql_config:/etc/mysql/conf.d \
-p 3306:3306 \
mysql:8.0🛠️ COMANDOS ÚTILES PARA GESTIÓN
Comandos de Inspección
# Ver información detallada de un contenedor
docker inspect nombre_contenedor
# Ver todos los volúmenes
docker volume ls
# Ver volúmenes específicos de un contenedor
docker inspect -f '{{ .Mounts }}' nombre_contenedor
# Ver uso de disco de volúmenes
docker system df -vComandos de Limpieza
# Eliminar todos los contenedores detenidos
docker container prune
# Eliminar todas las imágenes no utilizadas
docker image prune -a
# Eliminar todos los volúmenes no utilizados
docker volume prune
# Limpieza completa del sistema
docker system prune -a --volumes📋 MEJORES PRÁCTICAS
✅ Hacer
Usar volúmenes nombrados para datos importantes
Usar Bind Mounts para desarrollo
Hacer backup regular de volúmenes
Documentar los puntos de montaje en Dockerfile
❌ No Hacer
No almacenar datos críticos sin volúmenes
No usar paths absolutos sin variables de entorno
No montar directorios del sistema en contenedores
No olvidar hacer prune regularmente
Ejemplo de Dockerfile con puntos de montaje documentados
FROM node:16-alpine
WORKDIR /app
# Documentar volúmenes esperados
VOLUME ["/app/data", "/app/logs"]
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]🔄 MIGRACIÓN Y BACKUP
Backup de un volumen
# Crear backup de un volumen
docker run --rm \
-v nombre_volumen:/datos \
-v $(pwd):/backup \
alpine tar czf /backup/backup.tar.gz -C /datos .Restaurar volumen desde backup
# Restaurar datos en un volumen
docker run --rm \
-v nombre_volumen_nuevo:/datos \
-v $(pwd):/backup \
alpine tar xzf /backup/backup.tar.gz -C /datos🎯 CONCLUSIÓN
El almacenamiento persistente es esencial para aplicaciones en producción. Volúmenes Docker son la opción recomendada para datos que deben persistir, mientras que Bind Mounts son ideales para desarrollo. Siempre planifica tu estrategia de almacenamiento considerando:
Persistencia de datos
Backup y recuperación
Performance
Seguridad
Comentarios
Publicar un comentario