En Docker, el manejo del almacenamiento es crucial para persistir datos más allá del ciclo de vida de un contenedor. Dado que los contenedores son efímeros y todos los cambios de archivos dentro de un contenedor se pierden cuando el contenedor se elimina, Docker ofrece varias opciones para persistir estos datos de manera segura. La Doc los llama de forma abarcativa como mounts.
Docker soporta tres tipos de mounts:

Los volúmenes son el mecanismo preferido para conservar los datos generados y utilizados por los contenedores Docker *[1].
/var/lib/docker/volumes/
Limitaciones:
Docker nos provee mecanismos desde la Docker CLI para gestionar volúmenes. Vamos a crear un volumen llamado "my_volume".
docker volume create my_volume
docker volume ls
Si usamos el comando docker run, podemos elegir entre los flags --mount y --volume.
docker run --mount type=volume,src=<volume-name>,dst=<mount-path>
docker run --volume <volume-name>:<mount-path>
Diferencias entre --mount y --volume
docker run -d \
-v ng-vol:/usr/share/nginx/html:ro \
nginx:latest
docker run -d \
--mount source=ng-vol,destination=/usr/share/nginx/html,readonly \
nginx:latest
El flag ro es un alias de readonly. Con esas opciones indicamos que el contenedor no podrá modificar el contenido del volumen.
docker run --rm -it -v my_volume:/home alpine sh
Ahora hagamos un cambio en el volumen y salimos del contenedor
touch /home/mensaje.txt # Creamos un archivo vacío mensaje.txt
exit # Salimos del contenedor. Se borrará --rm
Ejecutamos un contenedor completamente diferente con el mismo volumen montado.
docker run --rm -it -v my_volume:/home ubuntu bash
ls -l /home
Los volumes se montan sobre un path o directorio (punto de montaje) de Linux. Ese lugar en el filesystem del contenedor puede tener datos pre-existentes o no.
Podemos montar directorios del host en el contenedor.
docker run --rm -v ./carpeta:/app -it alpine sh
Si estamos en Windows el comando es diferente:.
docker run --rm -v "${PWD}/carpeta:/app" -it alpine sh
En ambos casos, el directorio carpeta se monta en el contenedor en la ruta /app. Y los cambios que hagamos en la carpeta del host se verán reflejados en el contenedor.
No debe haber ningún contenedor utilizando el volumen. Antes de eliminar el volumen, probablemente tengamos que eliminar los contenedores que lo tengan montado aunque no estén corriendo.
docker volume rm VOLUME_NAME
docker volume prune
docker volume inspect VOLUME_NAME
Info brindada:
"CreatedAt": "2024-08-23T09:49:48-03:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my_volume/_data",
"Name": "my_volume",
"Options": null,
"Scope": "local"
Podemos copiar contenido de nuestro host hacia un contenedor con el comando
docker cp [OPTIONS] [PATH] CONTAINER:/[DESTINATION]
docker cp config.json contenedor_prueba:/mnt
O a la inversa, copiar desde el contenedor hacia el host invirtiendo los paths
docker cp contenedor_prueba:/mnt/config.json .
Esto no es exclusivo de los volúmenes. Se pueden copiar a cualquier path del contenedor por mas que no tenga un volumen montado.