MINI TUTORIAL DOCKER – DÍA 4
Volúmenes y persistencia: cómo guardar datos dentro y fuera del contenedor
(porque si borras el contenedor… los datos se van con él)
1. Objetivo del día
Hoy aprenderás:
- qué ocurre con los datos dentro de un contenedor
- por qué se pierden si borras el contenedor
- qué es un volumen
- tipos de volúmenes:
- anonymous volumes
- named volumes
- bind mounts
- cómo montar volúmenes correctamente (
-v) - cómo usar volúmenes con Nginx (ejemplo real)
Este es uno de los conceptos más importantes en Docker.
2. Concepto clave: el sistema de archivos de un contenedor NO es permanente
Cuando ejecutas:
docker run -it alpine sh
y dentro creas un archivo:
touch /hola.txt
ls /
Ese archivo existe solo dentro del contenedor.
Si borras el contenedor:
docker rm CONTAINER
👉 Todo se pierde.
Esto es bueno para aplicaciones efímeras,
pero es un problema para:
- bases de datos
- logs
- contenido web
- configuraciones
- backups
Por eso necesitamos volúmenes.
3. ¿Qué es un volumen en Docker?
Un volumen es una zona de datos que Docker mantiene fuera del contenedor,
para que los datos no desaparezcan aunque borres o recrees el contenedor.
Docker soporta dos mecanismos principales:
3.1 Anonymous volumes
Los crea Docker automáticamente cuando una imagen necesita persistencia.
Ejemplo:
docker run -v /var/lib/mysql mysql
Esto crea un volumen anónimo, sin nombre, difícil de identificar.
No recomendado para principiantes.
3.2 Named volumes (RECOMENDADO)
Los creas tú, les das un nombre, y Docker los gestiona.
Ejemplo:
docker volume create datos_nginx
Listar volúmenes:
docker volume ls
Usarlo en un contenedor:
docker run -d -p 8080:80 \
--name nginx-vol \
-v datos_nginx:/usr/share/nginx/html \
nginx
Todo lo que escribas en /usr/share/nginx/html se guarda en datos_nginx.
3.3 Bind mounts (carpetas del host → contenedor)
(Lo más útil para desarrollo y para pruebas)
Son rutas reales de tu máquina host montadas dentro del contenedor.
Ejemplo:
docker run -d -p 8080:80 \
--name nginx-local \
-v $(pwd)/miweb:/usr/share/nginx/html \
nginx
Esto significa:
- tu carpeta local
miweb/ - corresponde directamente con
/usr/share/nginx/htmldentro de nginx
Todo lo que edites localmente → se refleja al instante en el contenedor.
Muy útil para pruebas de desarrollo, demos, HTML, etc.
4. Ejemplo práctico: servir tu propia web con Nginx + bind mount
4.1 Crea carpeta con un HTML
mkdir miweb
echo "<h1>Hola Docker</h1>" > miweb/index.html
4.2 Ejecuta Nginx montando esa carpeta
docker run -d --name nginx-web \
-p 8080:80 \
-v $(pwd)/miweb:/usr/share/nginx/html \
nginx
4.3 Abrir navegador
👉 http://localhost:8080
Deberías ver:
Hola Docker
4.4 Modifica el archivo
echo "<h1>Hola Docker con volúmenes</h1>" > miweb/index.html
Recarga el navegador.
👉 NO has tenido que reiniciar el contenedor.
Esto demuestra por qué los volúmenes son tan potentes.
5. Ver dónde Docker guarda los volúmenes
docker volume inspect datos_nginx
Docker los almacena en:
/var/lib/docker/volumes/...
⚠️ Nunca edites los archivos dentro de esa carpeta manualmente (solo para inspeccionar).
6. Borrar un volumen (si ya no lo necesitas)
docker volume rm datos_nginx
Docker no borra volúmenes automáticamente al borrar un contenedor,
para evitar pérdida accidental de datos.
7. Práctica guiada del Día 4 (30–40 min)
✔ 1) Crea un volumen
docker volume create datos_nginx
docker volume ls
✔ 2) Lanza Nginx usando ese volumen
docker run -d --name nginx-vol \
-p 8080:80 \
-v datos_nginx:/usr/share/nginx/html \
nginx
✔ 3) Identifica dónde vive el volumen
docker volume inspect datos_nginx
✔ 4) Usa bind mounts
mkdir miweb
echo "<h1>Hola bind mount</h1>" > miweb/index.html
docker run -d --name nginx-local \
-p 8081:80 \
-v $(pwd)/miweb:/usr/share/nginx/html \
nginx
Ir a:
http://localhost:8081
Modificar el HTML → refrescar → ver cambios inmediatos.
✔ 5) Limpiar
docker stop nginx-vol nginx-local
docker rm nginx-vol nginx-local
docker volume rm datos_nginx
8. Checklist del Día 4
- Entiendo por qué los datos dentro del contenedor se pierden
- Sé qué es un named volume
- Sé qué es un bind mount
- He levantado Nginx con volumen persistente
- He servido contenido desde una carpeta local
- Sé inspeccionar y borrar volúmenes
Si esto se cumple → Día 4 completado ✔
5️⃣ Día 5 – Redes Docker y comunicación entre contenedores
(bridge, redes personalizadas, comunicación entre contenedores).
