Recapitulemos :
Qué son los volúmenes de Docker
- -. Los volúmenes de Docker son sistemas de archivos montados en contenedores de Docker para conservar los datos generados por el contenedor en ejecución.
- -. Los volúmenes se almacenan en el host, independientemente del ciclo de vida del contenedor. Esto permite a los usuarios realizar copias de seguridad de datos y compartir sistemas de archivos entre contenedores fácilmente
- -. Hay diferentes formas de montar un volumen de Docker mientras se lanza un contenedor. Los usuarios pueden decidir entre las banderas -v y las –mount que se agregan al docker run comando.
Primero eliminamos y creamos un volumen , en nuestro hots lo llamaremos my_datos. Lo haremos con opción -v . La opción -v contiene tres componentes, separados por dos puntos :
- -. Nombre de volumen o directorio de origen
- -. Punto de montaje dentro del contenedor
- -. (Opcional) ro si la montura es de solo lectura
Listamos los volumens :
- In: root@juan-Aspire-ES1-512:/# docker volume ls
Eliminamos todos los Volumes :
- In: root@juan-Aspire-ES1-512:/# docker volume prune
Creamos un volumen:
- In: root@juan-Aspire-ES1-512:/# docker volume create my_datos
- Out: my_datos
Creamos un volumen sin nombre :
- In: root@juan-Aspire-ES1-512:/# docker volume create
- Out: 305d346b28f4e6b42e63a4be5c0c066acc23233219d11c85eac9ad12c720b363
Nota: En este punto podemos crear el volume en el host o crearlo cuando creemos el contenedor. Hemos creado my_datos y luego configurare el contenedor para usarlo.
Listamos los volume :
- In: root@juan-Aspire-ES1-512:/# docker volume ls
- Out: local 305d346b28f4e6b42e63a4be5c0c066acc23233219d11c85eac9ad12c720b363
- Out: local my_datos
Eliminamos el volume :
- In: root@juan-Aspire-ES1-512:/# docker volume rm
- Out: 305d346b28f4e6b42e63a4be5c0c066acc23233219d11c85eac9ad12c720b363
Inspeccionar el volume :
- In: root@juan-Aspire-ES1-512:/# docker volume inspect my_datos
- Out: «CreatedAt»: «2021-10-29T19:03:21+02:00»,
- Out: «Driver»: «local»,
- Out: «Labels»: {},
- Out: «Mountpoint»: «/var/lib/docker/volumes/my_datos/_data»,
- Out: «Name»: «my_datos»,
- Out: «Options»: {},
- Out: «Scope»: «local»
Creamos el contenedor (base-spark-volume) de la images (base-spark-hadoop:latest) :
- In: root@juan-Aspire-ES1-512:/# docker run -d -it –name base-spark-volume -v my_datos:/opt/app base-spark-hadoop:latest
- Out: e7cda957577fd8aa2c16ead90eab0af8f0756d0374df7e58f65d5bc1c2a0c5f7
inspeccionamos el contenedor :
- In: root@juan-Aspire-ES1-512:/# docker inspect e7cda957577f
- Out: «Mounts»: [
- Out: {
- Out: «Type»: «volume»,
- Out: «Name»: «my_datos»,
- Out: «Source»: «/var/lib/docker/volumes/my_datos/_data«,
- Out: «Destination»: «/opt/app»,
- Out: «Driver»: «local»,
- Out: «Mode»: «z»,
- Out: «RW»: true,
- Out: «Propagation»: «»
Creamos con nano un fichero test en la carpeta _data :
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# nano test
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# ls
- Out: test
Entramos en el contenedor :
- In: root@juan-Aspire-ES1-512:/# docker exec -it e7cda957577f /bin/bash
Listamos los archivos :
- In: root@e7cda957577f:/opt/app# ls
- Out: test
Nota: Hemos creado con nano el fichero test el la carpeta del host «Source»: «/var/lib/docker/volumes/my_datos/_data». Etamos en el contenedor con exec y tenemos en «Destination»: «/opt/app» test
Definir un volúmen “solo lectura” agregando el modificador “ :ro ” :
- In: root@juan-Aspire-ES1-512:/# docker run -d -it –name base-spark-volume -v my_datos:/opt/app :ro base-spark-hadoop:latest
- Out: 7d659849cd62b15761f5e546aec9ec4b737c066cd6dc08a391d0b64c0be6fc1b
Listamos el contenedor recién creado :
- In: root@juan-Aspire-ES1-512:/# docker ps
- Out: 7d659849cd62 base-spark-hadoop:latest «/bin/sh -c /bin/bash» 7 minutes ago Up
- Out: 7 minutes 4040/tcp, 6066/tcp, 7077-7078/tcp, 8080-8081/tcp base-spark-volume
Inspeccionamos el contenedor :
- In: root@juan-Aspire-ES1-512:/# docker inspect base-spark-volume
- Out: «Mounts»:
- Out: «Type»: «volume»,
- Out: «Name»: «my_datos»,
- Out: «Source»: «/var/lib/docker/volumes/my_datos/_data»,
- Out: «Destination»: «/opt/app»,
- Out: «Driver»: «local»,
- Out: «Mode»: «ro»,
- Out: «RW»: false,
- Out: «Propagation»: «»
Vemos que en el «Mounts» la opción «RW» se encuentra en false en lugar de true
Creamos con nano otro fichero test en la carpeta _data :
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# nano test2
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# ls
- Out: test test2
Entramos en el contenedor :
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# docker exec -it 7d659849cd62 /bin/bash
Listamos los archivos :
- In: root@7d659849cd62:/opt/app# ls
- Out: test test2
Tratar de eliminar el archivo test2 :
- In: root@7d659849cd62:/opt/app# rm -r test2
- Out: rm: cannot remove ‘test2’: Read-only file system “sistema de archivos de solo lectura”
Haremos lo mismo pero en Host :
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# ls
- Out: test test2
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# rm -r test2
- In: root@juan-Aspire-ES1-512:/var/lib/docker/volumes/my_datos/_data# ls
- Out: test
Recopilando:
Hemos creado volumen directamente en el host,(al crear el contenedor, al mismo tiempo creo el Volumen) todo con el indicador -v ,podemos usar –mount es mas especifico , ami personalmente prefiero usar –mount para los Servicios el paso siguiente es integrar los volume en la creación de la images (Dockerfile) .