docker-volúmenes vs enlaces de montaje. ¿cuáles son los casos de uso?

Después de leer y jugar con docker por un tiempo, estoy considerando usarlo en mi entorno de producción. Sin embargo, todavía estoy tratando de entender la diferencia entre los enlaces de montaje y los volúmenes.

De acuerdo con la documentación de Dockers en los enlaces de montaje (https://docs.docker.com/storage/bind-mounts/):

Los montajes de enlace han existido desde los primeros días de Docker. Los montajes de enlace tienen una funcionalidad limitada en comparación con los volúmenes. Cuando se utiliza un montaje de enlace, un archivo o directorio de la máquina host se monta en un contenedor. Se hace referencia al archivo o directorio por su ruta de acceso completa o relativa en la máquina host. Por el contrario, cuando se usa un volumen, se crea un nuevo directorio dentro del directorio de almacenamiento de Docker en la máquina host y Docker administra el contenido de ese directorio.

De esto (y de jugar) me parece que los enlaces de montaje y los volúmenes son lo mismo, la única diferencia es la ubicación de los datos. (los volúmenes almacenados en el área de almacenamiento "privada" de docker, mientras que los enlaces de montaje se pueden almacenar en cualquier lugar). Sí, los volúmenes de montaje deben existir antes de iniciar el contenedor de docker, mientras que el motor de docker puede crear volúmenes cuando se inicia el contenedor, pero esta diferencia es irreverente en cuanto al rendimiento o al mantenimiento.

No pude entender los supuestos beneficios de los volúmenes indicados en la documentación (https://docs.docker.com/storage/volumes/) ya que todos parecen aplicarse a los enlaces de montaje de la misma manera.

¿Alguien puede explicar las principales diferencias entre volúmenes y enlaces de montaje (en cuanto a rendimiento y mantenimiento) y, lo que es más importante, sus casos de uso?

gracias por la ayuda.

De forma predeterminada, un volumen con nombre local es exactamente como lo describe, un montaje de enlace a un directorio especial de Docker. Las diferencias que veo:

  • En primer lugar, la principal es la diferencia de comportamiento entre los volúmenes con nombre y los volúmenes host (también conocidos como montajes de enlace). Docker inicializará un volumen con nombre a partir del contenido de la imagen. Esto incluye los propietarios y permisos de los archivos. Esto significa que puede evitar preocuparse por los problemas de permisos que se encuentran comúnmente con los volúmenes de host.

  • En segundo lugar, la portabilidad. Los volúmenes con nombre se pueden usar desde diferentes hosts de docker sin preocuparse por las rutas del sistema de archivos local o el usuario que ejecuta los comandos. Ya sea en una computadora portátil macOS o en un servidor Linux en producción, puede nombrar un volumen y suponer que funcionará como parte de la instalación predeterminada de Docker.

  • En tercer lugar, cómo se gestionan. Los volúmenes de host se administran comúnmente fuera de docker, que es donde a menudo entran en juego los problemas de permisos (ya que el UID/GID en el host comúnmente no coincide con el UID/GID dentro del contenedor). Con los volúmenes con nombre, los administraría desde otro contenedor de Docker donde puede controlar qué herramientas están instaladas, usuarios creados,etc.

También hay otra gran diferencia con los volúmenes con nombre. Eso es porque dije "predeterminada" arriba, y un volumen con nombre se puede configurar de varias maneras. El controlador de volumen se puede cambiar a otro que sea compatible con la nube. O puede pasar opciones al controlador de volumen local para cambiar del montaje de enlace local a un directorio específico a cualquier cosa que pueda hacer con la llamada al sistema de montaje. Eso incluye realizar un montaje de enlace a un directorio diferente, un montaje NFS e incluso podría crear su propio sistema de archivos superpuesto como un volumen para permitir que los contenedores accedan y modifiquen algunos datos dentro del contenedor sin cambiar los archivos subyacentes en una capa base.

Al usar volúmenes con nombre, también puede separar la administración del almacenamiento de la administración de los contenedores. Simplemente apunte al nombre y una herramienta externa podría crear ese volumen para apuntar a la ubicación adecuada en ese entorno.

Algunos ejemplos de volúmenes con nombre que he usado con el controlador de volumen local incluyen:

# named bind mount$ docker volume create --driver local \      --opt type=none \      --opt device=/home/user/test \      --opt o=bind \      test_vol# nfs$ docker volume create --driver local \      --opt type=nfs \      --opt o=nfsvers=4,addr=nfs.example.com,rw \      --opt device=:/path/to/dir \      foo# overlay$ docker volume create --driver local --opt type=overlay \    --opt o=lowerdir=${PWD}/ro-data,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \    --opt device=overlay overlay1