Volúmenes
En Eliminar contenedores aprendiste que docker rm borra el contenedor y todo lo que vivía solo dentro de él. Esta lección convierte esa frase en una pérdida concreta. Crearás un archivo visible, lo perderás al recrear el contenedor y luego repetirás la misma historia con un final distinto.
Una nota que desaparece al recrear el contenedor
Sección titulada «Una nota que desaparece al recrear el contenedor»Necesitas el contenedor web en ejecución, creado en Ejecutar contenedores. Si no existe, créalo:
docker run -d --name web -p 8080:80 nginx:1.29Escribe un archivo dentro del contenedor en marcha:
docker exec web sh -c 'echo hola > /usr/share/nginx/html/nota.txt'exec ejecuta una orden dentro del contenedor en marcha. Ya lo usaste en forma interactiva en Ver y consultar contenedores. Aquí lo usas en forma directa: sh -c ejecuta el texto entre comillas como orden de la shell.
Comprueba que el archivo existe:
docker exec web cat /usr/share/nginx/html/nota.txtholaAbre http://localhost:8080/nota.txt en el navegador. Ves la palabra hola. El archivo vive dentro del contenedor y el servidor lo sirve como cualquier página.
Ahora recrea el contenedor, como harías al actualizar o al empezar de cero:
docker stop webdocker rm webdocker run -d --name web -p 8080:80 nginx:1.29Busca la nota en el contenedor nuevo:
docker exec web ls /usr/share/nginx/html/50x.htmlindex.htmlnota.txt ya no está en la lista. El navegador confirma lo mismo en http://localhost:8080/nota.txt: el servidor responde que esa página no existe. El contenedor nuevo sirve la página de bienvenida intacta, pero tu archivo se fue con el contenedor anterior.
La capa escribible muere con el contenedor
Sección titulada «La capa escribible muere con el contenedor»Cada contenedor tiene su propia capa escribible. Todo lo que escribe fuera de un volumen queda ahí: la nota, los logs, cualquier archivo subido sin montaje.
Esa capa muere con docker rm. Por eso el contenedor nuevo no recuerda nada del anterior, aunque uses el mismo nombre y la misma imagen.
La imagen nginx:1.29 nunca cambió en este proceso. Sigue disponible como plantilla intacta y por eso el contenedor recreado arranca igual. La pérdida no tocó la imagen. Tocó solo la capa del contenedor eliminado.
Un volumen es el lugar donde los datos sí sobreviven. Es almacenamiento gestionado por Docker que vive fuera del contenedor y se monta en una ruta interna. Cuando el contenedor muere, el volumen queda.
Las fotos de perfil sobreviven en un volumen nombrado
Sección titulada «Las fotos de perfil sobreviven en un volumen nombrado»Imagina una aplicación donde cada usuario sube su foto de perfil. Si esa foto cae en la capa escribible, cada recreación del contenedor borra las fotos de todos. Repite la historia anterior con un volumen y observa la diferencia.
Crea un volumen con nombre:
docker volume create fotosRecrea web montando ese volumen en la carpeta de fotos:
docker stop webdocker rm webdocker run -d --name web -p 8080:80 -v fotos:/usr/share/nginx/html/fotos nginx:1.29-v fotos:/usr/share/nginx/html/fotos conecta el volumen nombrado con la ruta donde la aplicación guarda las fotos. Lo que se escriba en esa ruta vive en el volumen, no en la capa escribible.
Simula una subida escribiendo una foto en esa carpeta:
docker exec web sh -c 'echo foto-de-maria > /usr/share/nginx/html/fotos/maria.jpg'En una aplicación real ese archivo lo escribiría la subida del formulario. Aquí lo escribes a mano para observar el mismo efecto.
Comprueba que la foto existe:
docker exec web cat /usr/share/nginx/html/fotos/maria.jpgfoto-de-mariaAbre http://localhost:8080/fotos/maria.jpg y el servidor la sirve. Hasta aquí la historia se parece a la de la nota.
Recrea el contenedor con el mismo volumen:
docker stop webdocker rm webdocker run -d --name web -p 8080:80 -v fotos:/usr/share/nginx/html/fotos nginx:1.29Vuelve a leer la foto:
docker exec web cat /usr/share/nginx/html/fotos/maria.jpgfoto-de-mariaLa foto sigue ahí. docker rm eliminó el contenedor pero nunca toca los volúmenes. El volumen fotos persiste con independencia de cualquier contenedor hasta que borres el volumen mismo.
Prefiere siempre los volúmenes nombrados: los volúmenes anónimos existen (montar una ruta sin nombre crea uno) pero son difíciles de rastrear.
Las filas de una base de datos también viven en un volumen
Sección titulada «Las filas de una base de datos también viven en un volumen»Una base de datos cuenta la misma historia con filas en lugar de fotos. MySQL guarda sus datos bajo la ruta /var/lib/mysql dentro del contenedor. Si esa ruta vive en la capa escribible, recrear el contenedor para actualizar la versión borra las tablas.
El patrón es el mismo que usaste con las fotos:
docker volume create datosLa forma -v datos:/var/lib/mysql monta el volumen datos justo donde el motor guarda sus filas. Las filas viven en el volumen y el contenedor queda como pieza reemplazable. El ejemplo completo con imagen, variables y salud del servicio pertenece a la lección de Compose. Aquí importa el patrón: dato que debe sobrevivir va en un volumen desde el primer día.
Listar, inspeccionar y borrar volúmenes
Sección titulada «Listar, inspeccionar y borrar volúmenes»Lista los volúmenes de tu equipo:
docker volume lsDRIVER VOLUME NAMElocal datoslocal fotosVes los nombres que creaste y el controlador local. Los valores exactos de tu equipo pueden variar en orden, pero los nombres son los mismos que elegiste.
Revisa el detalle de uno:
docker volume inspect fotos[ { "Name": "fotos", "Driver": "local", "Mountpoint": "/var/lib/docker/volumes/fotos/_data" }]inspect muestra el nombre, el controlador y el punto de montaje real en el anfitrión. La ruta exacta depende de tu sistema. No edites ese directorio a mano: gestiónalo con comandos de Docker.
Lee la advertencia antes del próximo comando. Borrar el volumen destruye los datos que protegiste en esta lección y no hay contenedor que recrear para recuperarlos.
docker volume rm fotosUna carpeta de tu equipo en lugar de un volumen
Sección titulada «Una carpeta de tu equipo en lugar de un volumen»Un bind mount monta una carpeta de tu equipo en una ruta del contenedor, en lugar de usar un volumen gestionado por Docker. Sirve cuando quieres editar código en vivo desde tu editor y ver el cambio al instante dentro del contenedor. Las lecciones de proyecto con Node.js y Laravel son el lugar donde este montaje tiene sentido, así que esta página no lo practica: quédate con la distinción y usa volúmenes nombrados para datos que deben sobrevivir.
Lo que esta lección demostró
Sección titulada «Lo que esta lección demostró»La nota se perdió porque vivía en la capa escribible. La foto sobrevivió porque vivía en un volumen. La regla ya no es una frase para memorizar. Es lo que acabas de probar dos veces: el contenedor muere con su capa y el volumen sobrevive a los contenedores.
- La imagen
nginx:1.29no cambia en ningún paso. Es la plantilla intacta. - El contenedor
weby su capa escribible desaparecen condocker rm. - El volumen
fotossobrevive al contenedor y se vuelve a montar en el siguiente.
Siguiente paso
Sección titulada «Siguiente paso»Continúa con Redes para conectar contenedores entre sí por su nombre sin exponer de más.