Un Bind Mount en Docker es un mecanismo de almacenamiento que permite montar un archivo o directorio del sistema de archivos anfitrión, estableciendo un puente de sincronización bidireccional y en tiempo real.
En el artículo anterior vimos los Volúmenes, que son geniales para guardar bases de datos porque Docker los gestiona en una caja fuerte oculta. Pero, por ejemplo en desarrollo, no son del todo prácticos.
Veamos el problema. Imagina que estás creando una web. Tienes tu index.html en tu Escritorio. Si usas lo que hemos aprendido hasta ahora, para ver tus cambios tendrías que:
- Editar el
index.html. - Construir una imagen nueva (
docker build). - Borrar el contenedor viejo.
- Lanzar el nuevo.
Tener que hacer todo esto solo para ver cómo cambia el color de un botón… como que no es muy práctico. Necesitamos una forma de decirle al sistema: “No uses los archivos empaquetados en la imagen; lee y ejecuta directamente lo que hay en esta carpeta de mi ordenador”.
Hoy vamos a aprender a usar los Bind Mounts para inyectar nuestro código fuente en contenedores en ejecución 👇
¿Qué es un Bind Mount?
A diferencia de un Volumen (que vive en “el mundo de Docker”), un Bind Mount es un enlace directo a cualquier carpeta de tu ordenador anfitrión.
Tú mapeas C:\MisProyectos\Web (Host) ➡️ /var/www/html (Contenedor).
- Si creas un archivo en Windows, aparece mágicamente en Linux dentro del contenedor.
- Si el contenedor borra un archivo, se borra de tu Windows (¡cuidadito con esto!).
Bind Mounts vs Volúmenes
| Característica | Volumen (Volume) | Bind Mount |
|---|---|---|
| Ubicación en Host | Oculta (/var/lib/docker/…) | Donde tú quieras (Escritorio, Documentos…) |
| Gestión | Docker CLI (docker volume …) | Tú (Explorador de archivos, Git…) |
| Seguridad | Aislado | Menor (El contenedor puede tocar tus ficheros personales) |
| Rendimiento | Nativo | Depende (En Windows/WSL puede ser más lento al cruzar sistemas de archivos) |
| Uso principal | Bases de datos, Backups | Código fuente, Configuración en desarrollo |
La sintaxis del flag -v
Usamos el mismo flag -v que con los volúmenes, pero con diferencia de que ahora el lado izquierdo ahora es una ruta absoluta.
docker run -v /ruta/absoluta/en/mi/pc:/ruta/en/contenedor ...
- Volumen:
-v mis-datos:/data(No empieza por/niC:, es un nombre). - Bind Mount:
-v C:\Users\Luis\Web:/data(Es una ruta física).
Ejemplo: “Hot Reload” con Nginx
Vamos a probarlo. Vas a ver cómo convertimos un servidor web estático en un entorno de desarrollo dinámico.
Preparar el terreno
Crea una carpeta nueva en tu ordenador llamada prueba-docker. Dentro, crea un archivo index.html con este contenido:
<h1>Hola desde mi PC</h1>
Lanzar el contenedor con Bind Mount
Abre la terminal dentro de esa carpeta y ejecuta:
docker run -d -p 8080:80 -v ${PWD}:/usr/share/nginx/html nginx
(Estamos sustituyendo la carpeta por defecto de Nginx con NUESTRA carpeta).
Verificar
Abre tu navegador en http://localhost:8080. Verás “Hola desde mi PC”.
Edición en vivo
Sin parar el contenedor, abre el index.html en tu editor de texto favorito (Notepad, VS Code…). Cambia el texto por:
<h1>Hola desde mi PC... ¡Editado en vivo!</h1>
Guarda el archivo.
Refresca el navegador
Vuelve a Chrome, pulsa F5. ¡El cambio aparece al instante! 🎉
Acabas de configurar un entorno de desarrollo. El servidor Nginx está leyendo directamente tu archivo del disco duro. No has tenido que reconstruir nada.
