Ten en cuenta que en la informática cualquier problema casi siempre tiene más de una soluciones, por lo tanto nosotros aquí te enseñaremos lo más óptimo y eficiente.
Solución:
Cuando los montajes de enlace son archivos que provienen de su máquina host, los volúmenes son algo más como el nas de la ventana acoplable.
- Los montajes de enlace son archivos montados desde su máquina host (la que ejecuta su daemon docker) en su contenedor.
- Los volúmenes son como espacios de almacenamiento totalmente administrados por Docker.
Encontrarás, en la literatura, dos tipos de volúmenes:- volúmenes con nombre (proporcione el nombre)
- volúmenes anónimos (nombres UUID habituales de la ventana acoplable, como si pudiera encontrarlos en contenedores o imágenes sin etiquetar)
Esos volúmenes vienen con su propio conjunto de comandos de la ventana acoplable; también puedes consultar esta lista a través de
docker volume --help
Puede ver sus volúmenes existentes a través de
docker volume ls
Puede crear un volumen con nombre a través de
docker volume create my_named_volume
Pero también puede crear un volumen a través de un docker-compose
expediente
version: "3.3"
services:
mysql:
image: mysql
volumes:
- type: volume
source: db-data
target: /var/lib/mysql/data
volumes:
db-data:
Donde esta es la parte que dice por favor, acoplador, mónteme el volumen llamado datos-db en la parte superior del directorio del contenedor / var / lib / mysql / data
- type: volume
source: db-data
target: /var/lib/mysql/data
Y esta es la parte que le dice a Docker por favor creame un volumen llamado datos-db
volumes:
db-data:
Documentación de Docker sobre los tres tipos de montaje:
- https://docs.docker.com/storage/bind-mounts/
- https://docs.docker.com/storage/volumes/
- https://docs.docker.com/storage/tmpfs/
Si te entendí correctamente, estás preguntando en otras palabras: ¿Cuál es la diferencia entre volúmenes y montajes vinculantes?
Diferencias en la gestión y el aislamiento en el host
Enlazar monturas existen en el sistema de archivos del host y son administrados por el encargado del mantenimiento del host.
Las aplicaciones / procesos fuera de Docker también pueden modificarlo.
Volúmenes también se pueden implementar en el host, pero Docker los administrará por nosotros y no se puede acceder a ellos fuera de Docker.
Los volúmenes son una solución mucho más amplia
Aunque ambas soluciones nos ayudan a separar el ciclo de vida de los datos de los contenedores, al usar Volúmenes gana mucho más poder y flexibilidad sobre su sistema.
Con Volúmenes podemos diseñar nuestros datos de manera efectiva y desacoplarlos del host y otras partes del sistema almacenándolos en ubicaciones remotas dedicadas (en la nube, por ejemplo) e integrarlos con servicios externos como copias de seguridad, monitoreo, cifrado y administración de hardware.
Más ventajas de Volumes sobre los montajes de enlace:
- Sin preocupaciones de anfitrión.
- Se puede administrar mediante la CLI de Docker.
- Los volúmenes pueden ahorrarle algunos permisos relacionados con problemas de uid / gid que ocurren en casos como cuando el uid de un usuario del contenedor no coincide con el host
gid
. - Un contenedor puede rellenar previamente el contenido de un nuevo volumen.
Ejemplos de
Tomemos 2 escenarios.
Caso 1: servidor web.
Queremos proporcionar a nuestro servidor web un archivo de configuración que puede cambiar con frecuencia.
Por ejemplo: exponer puertos según el entorno actual.
Podemos reconstruir la imagen cada vez con la configuración correspondiente o crear 2 imágenes diferentes para cada entorno. Ambas soluciones no son muy eficientes.
Con Enlazar monturas Docker monta el directorio de origen proporcionado en una ubicación dentro del contenedor.
(El directorio / archivo original en la capa de solo lectura dentro del sistema de archivos de unión simplemente se anulará).
Por ejemplo, vinculando un puerto dinámico a nginx:
version: "3.7"
services:
web:
image: nginx:alpine
volumes:
- type: bind #<-----Notice the type
source: ./mysite.template
target: /etc/nginx/conf.d/mysite.template
ports:
- "9090:8080"
environment:
- PORT=8080
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template >
/etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
Tenga en cuenta que este ejemplo también podría resolverse utilizando Volumes.
Caso 2: Bases de datos.
Los contenedores Docker no almacenan datos persistentes: cualquier dato que se escribirá en la capa de escritura en el sistema de archivos de unión del contenedor se perderá una vez que el contenedor deje de ejecutarse.
Pero, ¿qué pasa si tenemos una base de datos ejecutándose en un contenedor y el contenedor se detiene, eso significa que todos los datos se perderán? Volúmenes
al rescate.
Esos son árboles del sistema de archivos con nombre que Docker administra por nosotros.
services:
db:
image: postgres:latest
volumes:
- "dbdata:/var/lib/postgresql/data"
volumes:
- type: volume #<-----Notice the type
source: dbdata
target: /var/lib/postgresql/data
volumes:
dbdata:
Por ejemplo, datos SQL de Postgres persistentes:
Tenga en cuenta que en este caso, para volúmenes con nombre, la fuente es el nombre del volumen (para volúmenes anónimos, este campo se omite).
Recuerda que tienes autorización de explicar si te fue de ayuda.