Volúmenes de Docker, bind mounts y por qué importa la persistencia
Un contenedor es efímero por diseño: al eliminarlo, su sistema de archivos desaparece con él. Los volúmenes de Docker resuelven esto separando los datos del ciclo de vida del contenedor, un volumen con nombre vive de forma independiente, gestionado por el propio Docker, hasta que lo borras explícitamente con docker volume rm. En este laboratorio lo comprobamos escribiendo un fichero desde un contenedor, eliminando ese contenedor por completo y leyendo el mismo fichero desde uno nuevo, sin trucos.
Tres formas de guardar datos
Docker ofrece tres mecanismos con comportamientos muy distintos. El volumen con nombre vive bajo el control de Docker en /var/lib/docker/volumes/ y se referencia por nombre (-v labdata:/data). El volumen anónimo es el mismo mecanismo sin un nombre asignado: Docker le pone un identificador aleatorio y es fácil perderle la pista. El bind mount es distinto de raíz, monta una ruta que ya existe en el host (-v /ruta/del/host:/data) y no crea ningún objeto gestionado por Docker: el contenedor ve literalmente el mismo archivo que el host.
-v frente a –mount
La sintaxis abreviada -v origen:destino es cómoda pero ambigua: si te equivocas en el nombre del volumen, Docker crea uno nuevo en silencio en vez de avisarte. --mount type=volume,source=labdata,target=/data es más verbosa pero explícita, separa el tipo, el origen y el destino en pares clave-valor y falla con un error claro si algo no cuadra, lo que la hace preferible en scripts de producción.
Si ya usas Docker para autoalojar servicios, este mismo patrón de datos persistentes aparece en casi todo: en nuestra guía de Gitea con Docker el volumen guarda los repositorios, en la de Vaultwarden guarda la bóveda de contraseñas cifrada y en la de Nginx Proxy Manager guarda los certificados. Puedes ver el resto de guías en la categoría Herramientas. Si además usas Kubernetes, el concepto de volumen tiene un equivalente propio con reglas distintas, y esta guía de DigitalOcean profundiza en cómo compartir datos entre varios contenedores.
Preguntas frecuentes
¿Qué diferencia hay entre un volumen con nombre y uno anónimo?
Ambos son volúmenes reales gestionados por Docker y viven en el mismo sitio del host, pero el anónimo recibe un identificador aleatorio que Docker asigna al crearlo con -v /ruta sin nombre delante de los dos puntos, mientras que el con nombre lo creas tú explícitamente con docker volume create y puedes referenciarlo por ese nombre desde cualquier contenedor.
¿Dónde se guardan físicamente los datos de un volumen de Docker?
En el host que ejecuta el motor Docker, bajo /var/lib/docker/volumes/<nombre>/_data. docker volume inspect muestra esa ruta exacta en el campo Mountpoint; normalmente no necesitas tocarla a mano, pero saber que existe ayuda a entender por qué el volumen sobrevive aunque elimines el contenedor.
¿Elimina docker rm el volumen con nombre que usaba el contenedor?
No. docker rm -v borra únicamente los volúmenes anónimos asociados a ese contenedor concreto; un volumen con nombre nunca se borra como efecto colateral de eliminar un contenedor, sin importar qué opciones uses. Para borrarlo hace falta un docker volume rm explícito, como hacemos en la limpieza final del lab.