HOWTO · Docker

Cómo montar un directorio del host en un contenedor de Docker

Aprende a montar un directorio del host en un contenedor de Docker con -v, --volume o --mount.

En esta página

Un montaje de enlace conecta un directorio del host con una ruta dentro de un contenedor de Docker. Úsalo cuando un contenedor necesite leer o actualizar archivos de un directorio concreto del host, por ejemplo, el código fuente durante el desarrollo. En el ejemplo siguiente se preparan un directorio y un archivo en el host; los comandos de Docker muestran cómo exponer ese directorio dentro de una shell de Alpine. Los comandos de Docker son ilustrativos y no se ejecutaron durante esta etapa de redacción.

Usar montajes de enlace para montar el directorio de host en un contenedor de Docker

Un montaje de enlace expone la ruta del host que elijas en una ruta del contenedor. A diferencia de un volumen administrado por Docker, su origen es una ubicación concreta del host. Los cambios en los archivos de ese directorio también se ven desde el punto de montaje del contenedor. La aplicación puede verlos, pero la recarga en caliente solo se produce si la aplicación supervisa o vuelve a cargar esos archivos.

Montar un directorio del host con -v o --volume

Este ejemplo de Python crea un directorio del host llamado site, escribe un archivo en él e imprime el nombre del archivo. Ejecútalo desde el directorio en el que iniciarás Docker:

from pathlib import Path

site = Path("site")
site.mkdir(exist_ok=True)
(site / "hello.txt").write_text("Hello from the host.\n")
print("\n".join(sorted(path.name for path in site.iterdir())))
hello.txt

El archivo del host queda listo para inspeccionarlo en /site dentro de un contenedor iniciado con docker run --rm -it --volume "$PWD/site:/site" alpine:3.20 sh. El valor de --volume tiene el formato ruta-del-host:ruta-del-contenedor[:opciones]: $PWD/site es el directorio del host, /site es la ruta donde aparece en el contenedor y el sufijo opcional ro hace que el montaje sea de solo lectura. Las opciones corta -v y larga --volume usan la misma sintaxis, así que -v "$PWD/site:/site:ro" es la variante de solo lectura.

Mientras la shell del contenedor esté en ejecución, crea un archivo nuevo en el host con touch "$PWD/site/host-created.txt". En el indicador del contenedor, usa ls /site y comprueba que aparece host-created.txt; como el directorio está montado, el archivo nuevo también será visible allí. Si el montaje permite escritura, los archivos que crees en /site también se escribirán en el directorio del host. Con un montaje de solo lectura, el contenedor puede leer los archivos, pero no modificarlos a través de ese montaje.

Las opciones -v y --volume crean como directorio una ruta de origen del host que no exista. Comprueba la ruta resultante en el host antes de usar el contenedor: un error tipográfico puede crear un directorio nuevo y vacío y hacer que parezca que faltan los archivos esperados.

Montar un directorio del host con --mount

La opción --mount especifica cada ajuste como un campo clave-valor, y separa los campos con comas. Para el mismo ejemplo, ejecuta docker run --rm -it --mount "type=bind,source=$PWD/site,target=/site" alpine:3.20 sh. type=bind selecciona un montaje de enlace, source indica el directorio del host y target señala su ruta dentro del contenedor. Añade readonly a los campos del montaje para impedir las escrituras a través de él. El orden de los campos no determina cuál ruta es el origen o el destino: eso lo indican las claves.

A diferencia de -v y --volume, --mount informa de un error si el origen del montaje de enlace no existe. Crea y comprueba el directorio del host antes de iniciar el contenedor. Las rutas que contienen comas requieren más cuidado con esta sintaxis de montaje; elige una ruta adecuada en el host o consulta la sintaxis de montaje de Docker para tu plataforma.

Un montaje de enlace da al contenedor acceso a la ruta del host seleccionada. Monta solo los directorios que necesite la carga de trabajo, evita exponer archivos confidenciales y usa acceso de solo lectura cuando el contenedor no necesite escribir. La disponibilidad de las rutas del host y los permisos también pueden depender de cómo esté configurado Docker en tu sistema.

Conclusión

Usa -v o --volume para la forma compacta separada por dos puntos, o --mount para especificar campos clave-valor. Ambas opciones permiten acceder a un directorio del host desde una ruta del contenedor; -v puede crear un directorio de origen que no exista, mientras que --mount requiere que ya exista. Elige un montaje de enlace cuando el contenedor necesite una ruta concreta del host. Un volumen administrado por Docker suele ser más adecuado para datos de una aplicación que Docker deba administrar independientemente de un directorio específico del host.