Si los contenedores están aislados, ¿cómo pueden comunicarse con la máquina host, tal vez para almacenar datos? Porque cuando creamos un contenedor a partir de una imagen, los datos generados se pierden cuando se elimina el contenedor.
Así que necesitamos una forma de tener almacenamiento permanente.
Podemos hacerlo usando Bind Mounts y Volúmenes .
No hay mucha diferencia entre los dos, excepto que Bind Mounts puede apuntar a cualquier carpeta en la computadora host y Docker no los administra directamente.
Comencemos con ellos. Un ejemplo clásico son los registros. Suponga que su aplicación crea un archivo de registro, dentro del contenedor, en /usr/src/app/logs
. Puede asignar eso a una carpeta en la máquina host, usando -v
(igual que --volume
) marca cuando ejecuta el contenedor con docker run
, así:-v ~/logs:/usr/src/app/logs
Esto asignará esa carpeta a la subcarpeta de registros en el directorio de inicio del usuario.
Nodo:el -m
o --mount
flag funciona de manera muy similar
Esta es la bandera utilizada con el examplenode
imagen que creamos anteriormente:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
Ahora podemos ejecutar nuestra aplicación Node y cualquier registro se almacenará en la computadora host, en lugar de dentro del contenedor Docker.
Tenga en cuenta que el examplenode
la aplicación no genera ningún registro en /usr/src/app/logs
, es solo un ejemplo y primero deberá configurar ese registro.
Los detalles sobre el volumen se enumerarán cuando ejecute docker inspect
en el nombre del contenedor, en "Monturas":
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
¿Puedes ver "Type": "bind"
? Eso significa que hemos creado un montaje de enlace .
Ahora, hablemos de Volúmenes .
La diferencia entre Bind Mounts y Volumes es que al crear volúmenes, Docker almacenará los datos en una carpeta que administra, lo que significa que se encargará de los permisos y la propiedad de los archivos, y le brindará las herramientas para administrar esos volúmenes. Si bien los montajes de vinculación se basan en las rutas del sistema de archivos, Docker no puede proporcionar las herramientas que los rodean.
Por ejemplo, Docker le permite eliminar todos los volúmenes no utilizados ejecutando docker volume prune
o docker system prune --volumes
.
Para crear un volumen, primero debemos ejecutar docker volume create
:
docker volume create logs
Ahora puede usar docker volume ls
y docker volume inspect
para obtener más datos sobre los volúmenes del sistema:
Ahora ejecuta docker run
con la opción -v logs:/usr/src/app/logs
(indique el nombre del volumen en lugar de una carpeta)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
Ahora ejecutando docker inspect
en la imagen se mostrará el volumen montado:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
¿Ver? Ahora los registros se almacenarán en /var/lib/docker/volumes/logs/_data
carpeta.
Los volúmenes serán esenciales cuando llegue el momento de implementar un contenedor en un servicio en la nube, por ejemplo.
Puede eliminar un volumen ejecutando docker volume rm <name>
.