Bind mounts
Los bind mounts en Docker permiten montar un directorio o archivo del sistema de archivos del host en un contenedor. Esto es útil cuando necesitas compartir datos entre el contenedor y el host o cuando deseas persistir datos fuera del ciclo de vida del contenedor.
Conceptos Básicos
- Bind Mount: Es una forma de montar un directorio del host en el sistema de archivos del contenedor. Cualquier cambio en los archivos dentro del contenedor se refleja en el host y viceversa.
- Punto de Montaje: Es la ubicación dentro del contenedor donde se monta el directorio o archivo del host.
¿Por Qué Usar Bind Mounts?
- Persistencia de Datos: Los datos almacenados en un bind mount sobreviven al ciclo de vida del contenedor.
- Compartición de Datos: Puedes compartir archivos entre el host y uno o más contenedores.
- Desarrollo: Facilita el desarrollo, ya que puedes editar los archivos en el host y ver los cambios reflejados instantáneamente en el contenedor.
Creación de un Bind Mount
Al crear un contenedor, puedes especificar un bind mount usando la opción -v
o --mount
. Aquí te muestro cómo se hace:
1. Usando -v
o --volume
El comando -v
sigue la sintaxis -v <directorio_host>:<directorio_contenedor>
. Esta es una forma más antigua y compacta de definir un bind mount.
- Sintaxis:
docker run -v /path/host:/path/contenedor <nombre_imagen>
- Ejemplo:
docker run -d -v /home/usuario/data:/data nginx
En este ejemplo, el directorio
/home/usuario/data
en el host está montado en/data
dentro del contenedor. Si creas, modificas o eliminas archivos en/data
dentro del contenedor, los cambios se reflejarán en/home/usuario/data
en el host.
2. Usando --mount
La opción --mount
ofrece una sintaxis más detallada y flexible, que también permite especificar el tipo de montura (en este caso, bind
).
- Sintaxis:
docker run --mount type=bind,source=/path/host,target=/path/contenedor <nombre_imagen>
- Ejemplo:
docker run -d --mount type=bind,source=/home/usuario/data,target=/data nginx
Aquí, se está haciendo lo mismo que en el ejemplo anterior, pero usando la sintaxis más explícita de
--mount
.
Opciones Avanzadas
1. Modo Solo Lectura
- Puedes montar un bind mount en modo solo lectura para evitar que los contenedores modifiquen los archivos del host.
- Ejemplo:
docker run -d --mount type=bind,source=/home/usuario/data,target=/data,readonly nginx
En este caso, el contenedor puede leer los datos en
/data
, pero no puede escribir en ellos.
2. Especificar Propiedades del Bind Mount
- Puedes especificar propiedades adicionales, como si el bind mount debe ser propagado a otros contenedores o si debe resolverse como un enlace simbólico.
- Ejemplo con Propagación:
docker run -d --mount type=bind,source=/home/usuario/data,target=/data,bind-propagation=shared nginx
Aquí,
bind-propagation=shared
permite que los cambios de montaje en/data
se propaguen a otros contenedores que monten el mismo bind mount.
Verificar Bind Mounts en Contenedores en Ejecución
Para verificar qué bind mounts están en uso por un contenedor, puedes usar el comando docker inspect
.
- Ejemplo:
docker inspect mi_contenedor
En la salida, busca la sección
Mounts
, que te mostrará los detalles del bind mount, como las rutas de origen y destino, y si está montado en modo lectura-escritura o solo lectura.
Consideraciones y Buenas Prácticas
- Rutas Absolutas: Asegúrate de que las rutas especificadas en
source
sean absolutas. Docker no aceptará rutas relativas para bind mounts. - Permisos: Los permisos de los archivos y directorios montados reflejan los del sistema de archivos del host. Asegúrate de que los permisos sean adecuados para los procesos que se ejecutan en el contenedor.
- Portabilidad: Los bind mounts dependen de la estructura del sistema de archivos del host, lo que puede afectar la portabilidad del contenedor. Si necesitas portabilidad, considera usar volúmenes Docker en lugar de bind mounts.
Ejemplo Práctico Completo
Supongamos que quieres desarrollar una aplicación web y deseas que los archivos de tu proyecto en el host estén disponibles dentro del contenedor. Podrías configurar un bind mount así:
- Directorio en el host:
/home/usuario/mi_proyecto
- Punto de montaje en el contenedor:
/usr/share/nginx/html
- Comando Docker:
docker run -d --name mi_web --mount type=bind,source=/home/usuario/mi_proyecto,target=/usr/share/nginx/html nginx
En este escenario, todos los archivos dentro de /home/usuario/mi_proyecto
estarán disponibles para el servidor web Nginx que corre dentro del contenedor. Cualquier cambio que hagas en el código en tu máquina host se reflejará inmediatamente en el servidor web dentro del contenedor, sin necesidad de reconstruir la imagen.
Resumen
Los bind mounts son una herramienta poderosa para gestionar datos y compartirlos entre contenedores y el host. Aunque pueden ser útiles en muchas situaciones, también requieren un manejo cuidadoso para evitar problemas relacionados con permisos, portabilidad y seguridad. Utiliza bind mounts cuando necesites acceso directo al sistema de archivos del host, y considera otras opciones como los volúmenes Docker cuando la portabilidad y la independencia del contenedor sean más importantes.