Por diseño, los contenedores son efímeros. Cuando un contenedor es eliminado, todos los datos creados dentro de su capa escribible se pierden para siempre. Esto es ideal para procesos sin estado, pero es un gran problema para aplicaciones que necesitan guardar datos, como bases de datos, sistemas de gestión de contenido o cualquier aplicación que genere logs o archivos.
Para solucionar esto, Docker ofrece dos mecanismos principales para montar datos desde la máquina anfitriona (host) en un contenedor: volúmenes y bind mounts.
Los volúmenes son la forma preferida y recomendada para persistir datos en Docker. Un volumen es un directorio especial gestionado por Docker que se almacena en una ubicación específica del sistema de archivos del host (ej. /var/lib/docker/volumes/
en Linux). Lo importante es que Docker gestiona completamente el ciclo de vida del volumen.
docker volume ...
).Un bind mount simplemente mapea un archivo o directorio existente en la máquina host a un directorio dentro del contenedor. El desarrollador tiene control total sobre la ubicación en el host.
Conclusión: Usa volúmenes para datos de producción (bases de datos, uploads). Usa bind mounts para desarrollo (montar tu código fuente).
La gestión de volúmenes se realiza con el subcomando `docker volume`.
Aunque los volúmenes se pueden crear automáticamente al usar `docker run`, es una buena práctica crearlos explícitamente.
docker volume create mis-datos-db
Puedes listar los volúmenes existentes con `docker volume ls` e inspeccionarlos con `docker volume inspect mis-datos-db`.
Para montar un volumen en un contenedor, se usa el flag -v
o --mount
. La sintaxis de -v
es <nombre_volumen>:<ruta_en_contenedor>
.
Vamos a ejecutar un contenedor de Ubuntu y montar nuestro volumen en el directorio /app/data
.
docker run -it --name mi-ubuntu-con-volumen -v mis-datos-db:/app/data ubuntu
Dentro del contenedor, crea un archivo en esa ruta:
# Dentro del contenedor
echo "Este es un dato persistente" > /app/data/mi_archivo.txt
exit
Ahora, elimina el contenedor:
docker rm mi-ubuntu-con-volumen
Y lanza uno nuevo, montando el mismo volumen:
docker run -it --name otro-ubuntu -v mis-datos-db:/app/data ubuntu
Si ahora revisas el contenido del directorio, el archivo seguirá ahí:
# Dentro del nuevo contenedor
cat /app/data/mi_archivo.txt
# Salida: Este es un dato persistente
¡El dato ha sobrevivido a la eliminación del contenedor!
El caso de uso más común para los volúmenes es con bases de datos. La imagen oficial de MySQL almacena todos sus datos en el directorio /var/lib/mysql
.
Para ejecutar un contenedor de MySQL y asegurarnos de que nuestros datos no se pierdan, hacemos lo siguiente:
# 1. Creamos un volumen para los datos de MySQL
docker volume create mysql-data
# 2. Ejecutamos el contenedor de MySQL
docker run -d --name mi-mysql-db -e MYSQL_ROOT_PASSWORD=mi-clave-secreta -v mysql-data:/var/lib/mysql mysql:8.0
-e MYSQL_ROOT_PASSWORD=...
: Pasamos una variable de entorno para configurar la contraseña del usuario root de MySQL.-v mysql-data:/var/lib/mysql
: Montamos nuestro volumen `mysql-data` en la ruta donde MySQL guarda sus datos.Ahora, puedes detener, eliminar y volver a crear el contenedor `mi-mysql-db` cuantas veces quieras. Mientras sigas montando el volumen `mysql-data`, todas tus bases de datos, tablas y registros estarán a salvo.