Volumes
Los volúmenes son el mecanismo preferido para persistir datos generados por y utilizados por los contenedores de Docker. Mientras que los montajes de enlace dependen de la estructura de directorios y del sistema operativo de la máquina anfitriona, los volúmenes son completamente administrados por Docker. Los volúmenes tienen varias ventajas sobre los montajes de enlace:
- Los volúmenes son más fáciles de respaldar o migrar que los montajes de enlace.
- Puedes gestionar volúmenes utilizando comandos de Docker CLI o la API de Docker.
- Los volúmenes funcionan en contenedores tanto de Linux como de Windows.
- Los volúmenes pueden compartirse más seguramente entre múltiples contenedores.
- Los drivers de volúmenes te permiten almacenar volúmenes en hosts remotos o proveedores de nube, encriptar el contenido de los volúmenes o agregar otra funcionalidad.
- Los volúmenes nuevos pueden tener su contenido pre-poblado por un contenedor.
- Los volúmenes en Docker Desktop tienen un rendimiento mucho más alto que los montajes de enlace desde hosts de Mac y Windows.
Además, los volúmenes son a menudo una mejor elección que persistir datos en la capa de escritura de un contenedor, porque un volumen no incrementa el tamaño de los contenedores que lo utilizan, y el contenido del volumen existe fuera del ciclo de vida de un contenedor dado.
Nota: El uso de volúmenes de datos es similar a montar un directorio o archivo en Linux. Los archivos en el directorio especificado como el punto de montaje en la imagen serán copiados al volumen de datos (solo si el volumen de datos está vacío).
Crear un volumen de datos
$ docker volume create my-vol
Ver todos los volúmenes de datos
$ docker volume ls
DRIVER VOLUME NAME
local my-vol
Utiliza el siguiente comando en el host para ver información sobre un volumen de datos
específico
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
Iniciar un contenedor con un volumen de datos montado
Al usar el comando docker run, utiliza la bandera --mount para montar el volumen de datos dentro del contenedor. Múltiples volúmenes de datos pueden ser montados en un solo docker run.
Creamos un contenedor llamado web y cargamos un volumen de datos en el directorio /usr/share/nginx/html
del contenedor.
$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine
Ver información específica sobre el volumen
Utiliza el siguiente comando en el host para ver información sobre el contenedor web
.
$ docker inspect web
La información del volumen de datos está bajo la clave "Mounts"
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Eliminar volúmenes
$ docker volume rm my-vol
Los volúmenes están diseñados para persistir datos, independientemente del ciclo de vida del contenedor. Docker no elimina automáticamente los volúmenes de datos cuando se elimina un contenedor, ni tiene un mecanismo de recolección de basura para los volúmenes de datos que ya no son referenciados por ningún contenedor. Si deseas eliminar un volumen junto con un contenedor, utiliza el comando docker rm -v
al eliminar el contenedor.
Para eliminar todos los volúmenes no utilizados y liberar espacio:
$ docker volume prune
Buenos casos de uso para volúmenes
Los volúmenes son la forma preferida de persistir datos en contenedores y servicios de Docker. Algunos casos de uso para volúmenes incluyen:
-
Compartir datos entre varios contenedores en ejecución. Si no lo creas explícitamente, se crea un volumen la primera vez que se monta en un contenedor. Cuando ese contenedor se detiene o se elimina, el volumen todavía existe. Múltiples contenedores pueden montar el mismo volumen simultáneamente, ya sea en modo lectura-escritura o solo lectura. Los volúmenes solo se eliminan cuando se eliminan explícitamente.
-
Cuando no se garantiza que el host de Docker tenga una estructura de directorios o archivos dada. Los volúmenes te ayudan a desacoplar la configuración del host de Docker del tiempo de ejecuci ón del contenedor.
-
Cuando deseas almacenar los datos de tu contenedor en un host remoto o un proveedor de nube, en lugar de localmente.
-
Cuando necesitas hacer una copia de seguridad, restaurar o migrar datos de un host de Docker a otro, los volúmenes son una mejor opción. Puedes detener los contenedores que usan el volumen, luego hacer una copia de seguridad del directorio del volumen (como
/var/lib/docker/volumes/<nombre-del-volumen>
). -
Cuando tu aplicación requiere E/S de alto rendimiento en Docker Desktop. Los volúmenes se almacenan en la VM de Linux en lugar del host, lo que significa que las lecturas y escrituras tienen mucha menos latencia y mayor rendimiento.
-
Cuando tu aplicación requiere un comportamiento del sistema de archivos completamente nativo en Docker Desktop. Por ejemplo, un motor de base de datos requiere un control preciso sobre el vaciado de disco para garantizar la durabilidad de las transacciones. Los volúmenes se almacenan en la VM de Linux y pueden hacer estas garantías, mientras que los montajes de enlace se remiten a macOS o Windows, donde los sistemas de archivos se comportan ligeramente diferente.