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

bash
# 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_datos

Ejemplo de salida de docker volume inspect:

json
[
    {
        "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

bash
# 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:latest

Ejemplo práctico: Base de datos PostgreSQL

bash
# 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:13

Eliminar Volúmenes

bash
# 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

bash
# Montar directorio local en contenedor
docker run -d \
  --name nginx-local \
  -v $(pwd)/html:/usr/share/nginx/html \
  -p 8080:80 \
  nginx:latest

Ejemplo en Windows PowerShell

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:latest

Ejemplo con permisos de solo lectura

bash
# 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

bash
# 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:latest

2. Desarrollo con Bind Mount para Hot Reload

bash
# 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-alpine

3. Base de Datos MySQL con Configuración Personalizada

bash
# 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

bash
# 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 -v

Comandos de Limpieza

bash
# 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

dockerfile
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

bash
# 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

bash
# 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

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Instalar Docker en Ubuntu Server usando docker.io

Tutorial de Carpetas y Directorios en Ubuntu Linux