Bind Mount-volumes: - ./ruta/local:/ruta/en/contenedor
La sintaxis en
docker-compose.ymles:volumes: - ./ruta/local:/ruta/en/contenedor
. significa "busca el Dockerfile en la carpeta actual".¿Qué hace - ./:/var/www/html?
./es la carpeta actual de tu host (donde está eldocker-compose.yml)./var/www/htmles la ruta dentro del contenedor.Efecto: Todo lo que esté en
./se ve dentro del contenedor en/var/www/html, y todo lo que se cree dentro del contenedor en/var/www/htmlaparecerá automáticamente en tu./. Es una sincronización bidireccional y en tiempo real.
El "bind mount" (volumes: - ./:/var/www/html) es el corazón de la sincronización entre tu PC y el contenedor.
¡Claro! Vamos a olvidarnos por un momento de Laravel, de PHP y de comandos complicados. Vamos a explicar el Bind Mount como si fuera la primera vez que ves Docker.
Piensa en esto: el Bind Mount es un "portal mágico" que conecta dos carpetas.
1. El problema que resuelve
Cuando tienes un contenedor de Docker, es como una cajita aislada dentro de tu computadora.
Si metes un archivo dentro de la cajita, no se ve afuera en tu computadora.
Si creas un archivo afuera en tu computadora, no se ve dentro de la cajita.
Antes de los Bind Mounts, para pasar archivos tenías que usar el comando docker cp (copiar y pegar) cada vez que cambiabas algo. ¡Imagínate hacer eso cada vez que guardas un archivo en tu editor de código! Sería un infierno.
2. La solución: El "Portal" (Bind Mount)
Un Bind Mount es un portal que conecta una carpeta de tu computadora (la máquina host) con una carpeta dentro del contenedor.
Cuando pones esto en el docker-compose.yml:
volumes:
- ./:/var/www/htmlEstás diciendo: "Oye Docker, quiero que agarres la carpeta donde estoy parado ahora mismo (./) y la conectes mediante un portal con la carpeta /var/www/html que está dentro del contenedor."
3. ¿Cómo funciona en la práctica? (El tráfico de dos vías)
Lo importante es que este portal es de DOBLE VÍA y funciona en TIEMPO REAL.
De tu PC al Contenedor (Host → Contenedor):
Abres tu editor de código (Visual Studio Code, Sublime, etc.) en tu computadora.
Creas un archivo llamado
hola.txtdentro de la carpeta./de tu proyecto.Mágicamente, si entras al contenedor y miras dentro de
/var/www/html, ¡ese archivohola.txtya está ahí! Apareció solo. No tuviste que copiarlo.
Del Contenedor a tu PC (Contenedor → Host):
Ahora, imagina que entras dentro del contenedor (con
docker-compose exec app bash).Dentro del contenedor, ejecutas un programa que crea 100 archivos nuevos (por ejemplo, el
composer create-projectque usamos en el tutorial).Esos 100 archivos se crean dentro de
/var/www/htmlen el contenedor.Mágicamente, si miras la carpeta
./en tu computadora (con el explorador de archivos o en VS Code), ¡los 100 archivos ya están ahí! Aparecieron solos. No tuviste que sacarlos del contenedor.
4. Es como un espejo o una unidad compartida
Imagina que tienes una carpeta en tu PC llamada "Mi Proyecto" y otra carpeta dentro del contenedor llamada "Código". El Bind Mount hace que sean la misma carpeta.
Si borras algo en "Mi Proyecto", desaparece de "Código".
Si editas algo en "Código" (por ejemplo, dentro del contenedor), se edita automáticamente en "Mi Proyecto".
Es instantáneo: No tienes que reiniciar el contenedor ni hacer nada especial. Cuando le das "Guardar" en tu editor de texto, el cambio se refleja de inmediato dentro del contenedor.
5. ¿Por qué es tan útil para programar?
Usas tus herramientas favoritas: Puedes usar el editor de texto que tienes instalado en tu PC (Visual Studio Code, PHPStorm, Notepad++) para editar el código.
No re-construyes todo: Normalmente, si cambias código dentro de un contenedor, tendrías que reconstruir la imagen. Con el Bind Mount no. El contenedor solo "ve" el archivo actualizado al instante.
Ves lo que genera el contenedor: Como vimos en el tutorial, al crear el proyecto Laravel dentro del contenedor, este genera muchos archivos (
.env,app/,vendor/). Gracias al Bind Mount, esos archivos aterrizan directamente en tu computadora para que puedas verlos, editarlos o subirlos a GitHub.
6. El "Pero" (El tema de los permisos)
Como el contenedor y tu PC están conectados, cuando el contenedor crea un archivo (ej: vendor/autoload.php), ese archivo aparece en tu PC.
El problema es que el que crea el archivo dentro del contenedor es el usuario "www-data" o "root", pero tu computadora espera que el archivo sea creado por tu usuario personal (ej: "juan" o "maria").
Por eso, a veces, aunque veas los archivos en tu PC, no puedes editarlos porque tu PC dice: "Oye, este archivo lo creó el usuario 'www-data', tú eres 'juan', no tienes permiso para cambiarlo".
La solución (el paso chown del tutorial) es básicamente decirle a tu PC: "Oye, no importa quién lo creó, estos archivos ahora me pertenecen a mí ('juan'), así que déjame editarlos".
Resumen visual para principiantes:
| Antes (Sin Bind Mount) | Ahora (Con Bind Mount) |
|---|---|
| El contenedor es una isla. | El contenedor y tu PC comparten una carpeta. |
Para meter algo, usas docker cp. | Solo arrastras el archivo a la carpeta y ¡ya está dentro! |
Para sacar algo, usas docker cp. | El contenedor genera el archivo y ¡ya está en tu PC! |
| Si cambias código, toca reiniciar. | Cambias código, guardas, y el contenedor lo ve al instante. |
En pocas palabras: El Bind Mount te permite programar en tu PC usando tus programas favoritos, pero ejecutar y generar el código DENTRO del contenedor, como si estuvieras trabajando todo en el mismo lugar
Comentarios
Publicar un comentario