Montar el directorio del host en un contenedor Docker

Isaac Tony 30 enero 2023
  1. Usar montajes de enlace para montar el directorio de host en un contenedor de Docker
  2. Conclusión
Montar el directorio del host en un contenedor Docker

Además de otras funcionalidades, Docker proporciona herramientas para trabajar con el sistema operativo host y el sistema de archivos del contenedor. Entre estas funcionalidades se encuentra la capacidad de conservar datos en contenedores y compartir datos entre contenedores mediante el montaje de directorios en contenedores Docker.

El montaje de directorios en contenedores Docker es útil en un entorno de desarrollo y producción. Además de crear servicios que dependen de los directorios del sistema host, esto garantiza que no se destruya todo el sistema de archivos si se destruye un contenedor Docker.

Supongamos que nos gustaría construir una nueva versión del contenedor. En este caso, montar directamente un directorio en un contenedor Docker permite la recarga en caliente.

Este artículo requiere que Docker esté configurado correctamente y tenga una imagen y un contenedor de Docker. Esto funcionará independientemente de si estamos ejecutando Docker en wsl o Linux.

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

Los montajes de enlace son una de las primeras soluciones que nos permiten conservar los datos mediante el montaje de nuestros contenedores Docker en directorios en nuestro sistema host. Estos nos permitirán hacer referencia a un directorio haciendo referencia a la ruta de archivo absoluta del directorio de destino.

En este caso, Docker no tiene el control de este directorio, a diferencia del caso de los volúmenes de Docker. Los volúmenes de Docker crean un directorio dentro del sistema de almacenamiento de Docker administrado por Docker.

Además de esto, a diferencia de los volúmenes de Docker, no podemos administrar directamente los directorios montados en nuestros contenedores a través de la CLI de Docker o la API de Docker. Sin embargo, los montajes de Docker tienen un alto rendimiento en hosts como MAC o Windows, donde los volúmenes de Docker tienen un rendimiento leve.

También debemos tener en cuenta que el uso de montajes de enlace para montar un contenedor en un directorio seguramente inflará el tamaño del contenedor.

Podemos usar dos banderas para montar un directorio en un contenedor mientras lo lanzamos. Estos incluyen las banderas -v y --mount.

Montar el directorio de host en un contenedor Docker usando el indicador -v o --volume

Consta de tres campos que siempre deben estar en el orden correcto y separados por dos puntos. Éstos incluyen:

  • La ruta al directorio en la máquina host que queremos montar.
  • La ruta al directorio en el contenedor donde debemos montar este directorio.
  • Otras opciones opcionales como ro especifican el modo de solo lectura.
docker run -t -i -v <host_dir>:<container_dir

Una vez que hayamos identificado el host y el directorio del contenedor que queremos montar juntos, podemos implementar el comando anterior. Sin embargo, no debemos realizar modificaciones en archivos confidenciales.

Esto se debe a que los montajes nos dan acceso a archivos confidenciales que, si se manipulan, pueden provocar una falla fatal de nuestro sistema.

En este caso, usaremos las imágenes oficiales de Ruby para crear un contenedor y montar un directorio. Nombramos scripts con un nombre de directorio, lo mismo con el contenedor Docker.

isaac@DESKTOP-HV44HT6:~/isaac$ docker run -it --rm -v$HOME/Desktop/scripts:/scripts --name scripts ruby bash
Unable to find image 'ruby:latest' locally
latest: Pulling from library/ruby
e4d61adff207: Pull complete
4ff1945c672b: Pull complete
ff5b10aec998: Pull complete
12de8c754e45: Pull complete
ada1762e7602: Pull complete
f8f0dec0b2ef: Pull complete
7109f2ab3080: Pull complete
fe1e1dda18a5: Pull complete
Digest: sha256:a1ebc64daa170324dde5b668829de85487575eaa2bdea5216b4c983b1822f9df
Status: Downloaded newer image for ruby:latest

Si no disponemos de la imagen localmente, Docker la descargará automáticamente. Una vez que se complete el proceso de creación del contenedor, Docker abrirá el contenedor por nosotros.

root@9d057cf9e33d:/#
root@9d057cf9e33d:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  scripts  srv  sys  tmp  usr  var
root@9d057cf9e33d:/# cd scripts
root@9d057cf9e33d:/scripts# ls

Podemos ver que el directorio de scripts en el contenedor está vacío.

Ahora, vayamos al directorio de scripts en nuestra máquina host y creemos un nuevo archivo en ese directorio. Se reflejará automáticamente en los scripts del directorio del contenedor Docker.

isaac@DESKTOP-HV44HT6:~/Desktop$ cd scripts
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ touch new_file.txt
touch: cannot touch 'new_file.txt': Permission denied
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$ ls
new_file.txt
isaac@DESKTOP-HV44HT6:~/Desktop/scripts$

Una vez que hayamos creado un archivo en el directorio local, se mostrará en el directorio contenedor a continuación.

root@913609933be2:/scripts# ls
new_file.txt

Montar el directorio del host en un contenedor Docker con el indicador --mount

Este es un método más sencillo que la etiqueta -v y consta de múltiples pares clave-valor, separados por comas. Para estas etiquetas, el orden de los campos no es motivo de preocupación.

Sin embargo, es más detallado en comparación con la etiqueta -v.

Estos métodos consisten en los siguientes comandos:

  • El tipo de montaje como Bind, volumen o tmpfs.
  • La fuente, es decir, la ruta al directorio en el host que queremos montar, generalmente se denota con src.
  • El destino, es decir, la ruta al directorio del contenedor donde queremos montar el directorio.
  • También tenemos otras opciones, como la opción de solo lectura y la propagación de enlace que puede especificar este directorio como privado o compartido.

Una vez que hayamos tomado nota de todos los campos necesarios, especialmente el origen y el destino, podemos ejecutar el comando como se muestra a continuación.

En este caso, usamos la imagen oficial de Nginx para construir el contenedor y asignar el nombre del directorio local new_scripts a un directorio ubicado en etc/nginx.

$ docker run -d \
> -it \
> --mount type=bind,source=$HOME/Desktop/scripts/new_scripts,target=/etc/nginx \
> nginx \
> bash
e079e3254970e290ae68473239e101c6aa8ba4ba56482c75cd21f9bb9f49600b

Ahora que mapeamos con éxito los dos directorios, cualquier cambio realizado en el directorio del host se reflejará automáticamente en el directorio del contenedor.

isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ sudo touch new_file.txt
[sudo] password for isaac:
isaac@DESKTOP-HV44HT6:~/Desktop/scripts/new_scripts$ ls
new_file.txt

Este archivo se reflejará en el directorio Docker asignado a este directorio, lo que muestra que hemos asignado correctamente los dos directorios.

root@e079e3254970:/etc# cd nginx
root@e079e3254970:/etc/nginx# ls
new_file.txt

Conclusión

Hemos demostrado con éxito cómo montar directorios usando las etiquetas Docker -v y -mount.

Sin embargo, también debemos tener en cuenta que al usar las etiquetas -v para montar un directorio que no existe, Docker lo creará automáticamente; este no es el mismo caso cuando se usa la etiqueta --mount de Docker.

Deberíamos considerar usar volúmenes de Docker en su lugar al desarrollar una nueva aplicación.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Artículo relacionado - Docker Container