Docker es un software de código abierto para crear y gestionar co­n­te­ne­do­res. Con un Docker volume (también volumen), es posible in­te­r­ca­m­biar datos entre co­n­te­ne­do­res o guardar los datos de un Docker container de manera pe­r­ma­ne­n­te.

Re­qui­si­tos

  • Tener Docker instalado (puedes usar el tutorial de Docker de la Digital Guide para ello) y en fu­n­cio­na­mie­n­to.
  • Tener co­no­ci­mie­n­tos básicos del fu­n­cio­na­mie­n­to y los comandos de Docker.

El sistema de archivos de Docker

Para entender los Docker volumes, es im­po­r­ta­n­te tener primero una visión general de cómo funciona el sistema de archivos de Docker.

Una Docker Image consta de varias capas de solo lectura. Cuando se inicia una imagen desde un co­n­te­ne­dor, Docker añade una nueva capa editable en la parte superior del sistema. El sistema de archivos de Docker se llama Union File System (UnionFS).

Cada vez que se modifica un archivo, Docker crea una copia de este mismo in­clu­ye­n­do las capas de solo lectura hasta la capa más alta, la que sí se puede editar. De esta manera queda una copia del archivo original (de solo lectura) sin cambios.

Si se elimina un co­n­te­ne­dor, se pierde la capa más alta, la que tiene permisos de escritura. Esto significa que todos los cambios rea­li­za­dos después de iniciar el co­n­te­ne­dor se pierden.

Backup cloud por Acronis
Protege tu in­frae­s­tru­c­tu­ra y reduce el tiempo de inac­ti­vi­dad
  • Copias de seguridad au­to­má­ti­cas y fácil re­cu­pe­ra­ción
  • Gestión y pla­ni­fi­ca­ción intuitiva
  • Pro­te­c­ción contra las amenazas basadas en IA
  • Incluye crédito inicial de 250 € el primer mes

Remedios con Docker volumes

Un volumen de co­n­te­ne­dor permite conservar los datos, aunque se elimine el Docker container. Los volúmenes también permiten un in­te­r­ca­m­bio práctico de datos entre el host y el container.

Crear un volumen de Docker es una buena solución para poder:

  • Tra­n­s­fe­rir datos a un co­n­te­ne­dor de Docker
  • Guardar los datos de un co­n­te­ne­dor de Docker
  • In­te­r­ca­m­biar datos entre co­n­te­ne­do­res de Docker

Los Docker volumes existen fuera del Union File System con su acceso de solo lectura y la capa de escritura. El volumen es una carpeta co­m­pa­r­ti­da entre el co­n­te­ne­dor y el ordenador host. Los volúmenes también pueden ser co­m­pa­r­ti­dos entre co­n­te­ne­do­res.

Consejo

En el servidor Cloud de IONOS puedes se­le­c­cio­nar Docker como apli­ca­ción de nube prei­n­s­ta­la­da. De este modo podrás acceder a tus apli­ca­cio­nes desde cualquier lugar.

La base de los Docker volumes

Un container volume “vive” fuera del propio co­n­te­ne­dor en el ordenador host. Fuera del container, el volumen se comporta como una carpeta en la que se pueden almacenar datos y desde la que se pueden recuperar datos. Se trata del mount point de un di­re­c­to­rio en el host.

Hay varias formas de crear y gestionar Docker volumes. Cada método tiene sus propias ventajas e in­co­n­ve­nie­n­tes.

Uso del comando “volume create” de Docker

A partir de la versión 1.9.0, que salió el 3 de noviembre de 2015, los Docker volumes se pueden crear y gestionar fá­ci­l­me­n­te con el comando docker volume integrado.

Paso 1. Crear y nombrar el volumen

El comando docker volume create crea un volumen ide­n­ti­fi­ca­do con un nombre. El nombre te permite encontrar fá­ci­l­me­n­te los Docker volumes y poder asi­g­nar­los a los co­n­te­ne­do­res es­pe­cí­fi­cos.

Para crear un volume, utiliza el siguiente comando:

sudo docker volume create - - name [volume name]

Paso 2. Usar el volume en un co­n­te­ne­dor de Docker

Para crear un container que utilice un volume creado con docker volume create, añade el siguiente parámetro al comando docker run:

-v [volume name]:[container directory]

Para, por ejemplo, ejecutar un co­n­te­ne­dor desde una imagen de CentOS llamada my-volume-test y asignar el data-volume al di­re­c­to­rio o el data al container, el comando es el siguiente:

sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash

Paso 3. Listar los volumes

Para listar los Docker volumes que hay en el sistema, utiliza el siguiente comando:

sudo docker volume ls

Este comando emite una lista de todos los Docker volumes creados en el host.

Paso 4. In­s­pe­c­cio­nar el volume

Para in­s­pe­c­cio­nar un volume concreto, utiliza el siguiente comando:

sudo docker volume inspect [volume name]

Este comando te pro­po­r­cio­na in­fo­r­ma­ción sobre el volume que hayas indicado, in­clu­ye­n­do el mount point y el di­re­c­to­rio en el sistema host a través del cual se puede acceder al Docker volume.

Para, por ejemplo, obtener más in­fo­r­ma­ción sobre el volume llamado “data” que hemos creado an­te­rio­r­me­n­te, el comando a utilizar es el siguiente:

sudo docker volume inspect data-volume

Paso 5. Eliminar el volume

Para eliminar un volume creado de esta manera, utiliza el siguiente comando:

sudo docker volume rm [volume name]

No se puede eliminar un volume si está siendo utilizado por un co­n­te­ne­dor existente. Antes de poder eliminar el volume, debes detener y eliminar el co­n­te­ne­dor de Docker con los si­guie­n­tes comandos:

sudo docker stop [container name or ID]
sudo docker rm [container name or ID]

Para, por ejemplo, eliminar el volume llamado “Data”, primero debes detener y eliminar el container que lo utiliza con my-volume-test:

sudo docker stop my-volume-test
sudo docker rm my-volume-test

El data-volume puede ser borrado con el siguiente comando:

sudo docker volume rm data-volume

Crear un Docker volume e indicar el di­re­c­to­rio del host deseado

Si quieres hacer que un di­re­c­to­rio concreto del ordenador host se monte como Docker volume en el co­n­te­ne­dor, añade el siguiente parámetro a tu comando docker run:

-v [host directory]:[container directory]

Para, por ejemplo, crear un nuevo co­n­te­ne­dor y asignar la carpeta /webfiles del host a la carpeta /var/www/html del co­n­te­ne­dor, el comando es:

sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash

Prueba esto creando un di­re­c­to­rio que luego puedas usar como Docker volume. Para ello ejecuta el siguiente comando:

sudo mkdir /hostvolume

Añade un pequeño archivo de prueba a este di­re­c­to­rio con el siguiente comando:

sudo echo "Hello World" >> /hostvolume/host-hello.txt

A co­n­ti­nua­ción, crea un co­n­te­ne­dor llamado my-directory-test y asigna la carpeta /ho­s­t­vo­lu­me del host a la carpeta /co­n­tai­ne­r­vo­lu­me del co­n­te­ne­dor con el siguiente comando:

sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash

Una vez te en­cue­n­tres en la línea de comandos del nuevo co­n­te­ne­dor, puedes mostrar una lista de los archivos del volumen co­m­pa­r­ti­do con el siguiente comando:

ls /containervolume

Verás el archivo host-hello.txt que hemos creado en el ordenador host.

Esto también funciona en sentido contrario. Los archivos que pongas en este di­re­c­to­rio se mostrarán también en el host. Puedes probarlo desde el co­n­te­ne­dor añadiendo otro archivo al volumen co­m­pa­r­ti­do con el siguiente comando:

echo "Hello from the container." >> /containervolume/container-hello.txt

Sal del container con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host. Allí, muestra una lista de los archivos en el volumen co­m­pa­r­ti­do con este comando:

sudo ls /hostvolume

Puedes ver los dos archivos de prueba que hemos creado desde el host y el co­n­te­ne­dor.

Crear un Docker volume con un archivo Docker

Utiliza el siguiente comando en un archivo Docker para crear un espacio de al­ma­ce­na­mie­n­to co­m­pa­r­ti­do en el co­n­te­ne­dor:

VOLUME [volume path]

Para, por ejemplo, crear un volume /myvolume en el co­n­te­ne­dor lanzado desde un archivo Docker, el comando es:

VOLUME /myvolume

Para poder probarlo, primero crea un archivo llamado Do­c­ke­r­fi­le con el siguiente comando:

sudo nano Dockerfile

Introduce el siguiente contenido en el archivo:

# The source image to start with
FROM centos
# Create a volume
VOLUME /dockerfilevolume

Guarda y cierra el archivo.

Luego, crea una imagen llamada do­c­ke­r­fi­le-vo­lu­me­te­st a partir del archivo Docker que acabas de redactar. Crea la imagen con el siguiente comando:

sudo docker build -t dockerfile-volumetest

A co­n­ti­nua­ción, crea un co­n­te­ne­dor llamado my-do­c­ke­r­fi­le-test desde la imagen que acabas de crear, para ello usa el siguiente comando:

sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash

Una vez estés en la línea de comandos del nuevo co­n­te­ne­dor, utiliza este comando para crear un pequeño archivo de prueba en el volumen co­m­pa­r­ti­do:

echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt

Sal del co­n­te­ne­dor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.

A co­n­ti­nua­ción, busca el mount point. Para ello, utiliza el siguiente comando:

sudo docker inspect my-dockerfile-test

Busca en el resultado del comando una sección titulada “Mounts” que se parezca a:

Fuente/Source es el di­re­c­to­rio en el ordenador host.

Destino/De­s­ti­na­tion es la carpeta del container.

Comprueba el di­re­c­to­rio de origen en tu ordenador host. Para nuestro ejemplo, el comando es el siguiente:

sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test

Aquí en­co­n­tra­rás el archivo do­c­ke­r­fi­le-container-hello.txt que has creado en el container.

Resumen de las ventajas y de­s­ve­n­ta­jas de los distintos métodos

Método Ventajas De­s­ve­n­ta­jas
Comando “volume create” Manejo rápido y sencillo El volume del host se crea au­to­má­ti­ca­me­n­te, pero es difícil de encontrar
Crear un Docker volume con di­re­c­to­rio en el host El container se puede asignar a una carpeta es­pe­cí­fi­ca del host No es posible dar nombre al volume ni au­to­ma­ti­zar­lo mediante Do­c­ke­r­fi­le
Crear un volumen con un archivo Docker Au­to­ma­ti­za­ción del proceso No se asigna una carpeta host ni se puede dar nombre a el volume

Compartir Docker volumes entre co­n­te­ne­do­res

Hay muchas si­tua­cio­nes en las que tiene sentido compartir un Docker volume entre co­n­tai­ne­rs, y hay varias maneras de co­m­pa­r­ti­r­lo.

Compartir un volume del host

Cuando creas un volume en el ordenador host, este puede ser utilizado por varios co­n­te­ne­do­res di­fe­re­n­tes al mismo tiempo. Esto te permite in­te­r­ca­m­biar datos entre los co­n­te­ne­do­res y el host.

Para este ejemplo, crea un di­re­c­to­rio en el host y utiliza este di­re­c­to­rio como un volume co­m­pa­r­ti­do entre dos co­n­te­ne­do­res.

Comienza uti­li­za­n­do el siguiente comando para crear un di­re­c­to­rio que puedas utilizar como Docker volume:

sudo mkdir /webdata

Crea un pequeño archivo de prueba en este di­re­c­to­rio con el siguiente comando:

sudo echo "Hello from the host." >> /webdata/host-hello.txt

A co­n­ti­nua­ción, crea un container llamado sql-database desde la imagen oficial de Po­s­t­gre­S­QL y asigna /webdata del host con el comando /data del co­n­te­ne­dor:

sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash

Una vez estés en la línea de comandos del nuevo co­n­te­ne­dor, comprueba con el siguiente comando que el volume co­m­pa­r­ti­do está co­n­fi­gu­ra­do co­rre­c­ta­me­n­te:

ls /data

Verás el archivo host-hello.txt que hemos creado en el host. Añade un archivo al volume co­m­pa­r­ti­do con el siguiente comando:

echo "Hello from the sql-database container." >> /data/sql-hello.txt

Sal del container con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.

Ahora crea un container llamado “Webapp” desde la imagen oficial de PHP+Apache y asigna /webdata del host a /var/www/html del container.

sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash

Una vez estés en la línea de comandos del nuevo co­n­te­ne­dor, utiliza el siguiente comando para comprobar si el volume co­m­pa­r­ti­do se ha co­n­fi­gu­ra­do co­rre­c­ta­me­n­te:

ls /var/www/html

Verás tanto el archivo host-hello.txt que creaste en el host como el archivo sql-hello.txt que creaste en el co­n­te­ne­dor de la base de datos SQL.

Ahora añade un archivo del último co­n­te­ne­dor que has creado:

echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt

Sal del co­n­te­ne­dor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host. En el host, puedes ver los tres archivos con el siguiente comando:

sudo ls /webdata

Dado que los dos co­n­te­ne­do­res comparten ahora un di­re­c­to­rio que “vive” en el host, los datos pueden tra­n­s­fe­ri­r­se in­s­ta­n­tá­nea­me­n­te entre las tres ubi­ca­cio­nes con si­m­ple­me­n­te ser movidos a este di­re­c­to­rio.

Co­n­fi­gu­rar un co­n­te­ne­dor como volumen de datos co­m­pa­r­ti­dos

También puedes co­n­fi­gu­rar un co­n­te­ne­dor in­de­pe­n­die­n­te como volumen de datos co­m­pa­r­ti­do.

Para ello, primero debes crear el co­n­te­ne­dor de datos. A co­n­ti­nua­ción, a la hora de crear el co­n­te­ne­dor que utilizará este co­n­te­ne­dor de datos, añade el siguiente parámetro al comando docker run:

--volumes-from [name or ID of data container]
Nota

Esto funciona in­de­pe­n­die­n­te­me­n­te de si el co­n­te­ne­dor de destino se está eje­cu­ta­n­do o no. Los Docker volumes nunca se borran y pe­r­ma­ne­cen incluso después de que el co­n­te­ne­dor deje de eje­cu­tar­se.

Para este ejemplo, crea un co­n­te­ne­dor de datos llamado “Data-Storage” que sirve como volumen de datos. Además, se crean otros dos co­n­te­ne­do­res que comparten el co­n­te­ne­dor de datos como espacio de al­ma­ce­na­mie­n­to.

Lo primero es iniciar el co­n­te­ne­dor de al­ma­ce­na­mie­n­to de datos desde la imagen oficial de CentOS 7:

sudo docker run -it -v /shared-data --name data-storage centos /bin/bash

A co­n­ti­nua­ción, añade un pequeño archivo de prueba a la carpeta /shared-data:

echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt

Sal del co­n­te­ne­dor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.

Ahora inicia el co­n­te­ne­dor de apli­ca­cio­nes desde la imagen oficial de Python y monta el co­n­te­ne­dor de al­ma­ce­na­mie­n­to de datos como un volume:

sudo docker run -it --name app --volumes-from data-storage python /bin/bash

Muestra una lista de los archivos en el volume co­m­pa­r­ti­do con el siguiente comando:

ls /shared-data

Como puedes ver, la carpeta /shared-data ha sido montada en el co­n­te­ne­dor de al­ma­ce­na­mie­n­to de datos y contiene el archivo data-storage-hello.txt.

Ahora añade un archivo del co­n­te­ne­dor de apli­ca­cio­nes:

echo "Hello from the app container." >> /shared-data/app-hello.txt

Sal del co­n­te­ne­dor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.

Por último, inicia el co­n­te­ne­dor web desde la imagen oficial de Apache y monta el co­n­te­ne­dor de al­ma­ce­na­mie­n­to de datos como un volume:

sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash

Muestra una lista de los archivos en el volumen co­m­pa­r­ti­do con el siguiente comando:

ls /shared-data

Así podrás ver los archivos que hemos creado en los co­n­te­ne­do­res de al­ma­ce­na­mie­n­to y de apli­ca­cio­nes.

Se­r­vi­do­res dedicados
Re­n­di­mie­n­to e in­no­va­ción
  • Pro­ce­sa­do­res de última ge­ne­ra­ción
  • Hardware dedicado de alto re­n­di­mie­n­to
  • Seguridad de primer nivel

Montar un volume con pro­te­c­ción contra la escritura

Hasta ahora, en este artículo hemos creado y montado volumes con acceso de lectura y de escritura.

Si quieres limitar el acceso de un co­n­te­ne­dor a un volume pe­r­mi­tié­n­do­le úni­ca­me­n­te acceso de lectura al volume, si­m­ple­me­n­te añade :ro de “read-only” al parámetro -v tras el di­re­c­to­rio del container:

docker run -v /directory:/path:ro

Esto puede ser útil para, por ejemplo, fines de seguridad. Además, si quieres ase­gu­rar­te de que los datos de un de­te­r­mi­na­do volume están pro­te­gi­dos contra la so­bree­s­cri­tu­ra o el borrado ac­ci­de­n­tal por parte de otro Docker container, vale la pena co­n­si­de­rar la opción de dar acceso de read-only (solo lectura).

Crea, por ejemplo, un volume en el host llamado limited-access con el siguiente comando:

sudo docker volume create --name limited-access

A co­n­ti­nua­ción, crea un co­n­te­ne­dor llamado allowed-to-write de la imagen de CentOS y asigna el volume llamado “limited-access” como un volume normal (de lectura y escritura):

sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash

Una vez estés en la línea de comandos de este co­n­te­ne­dor, crea un archivo de prueba con el siguiente comando:

echo "Hello from the container that is allowed to write." >> /data/hello.txt

Sal del co­n­te­ne­dor con [Ctrl] + [P] y [Ctrl] + [Q] y vuelve a la línea de comandos del ordenador host.

A co­n­ti­nua­ción, crea un container desde la imagen de CentOS llamado not-allowed-to-write y asígnale el volume llamado limited-access como volume de read-only (solo lectura):

sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash

Si intentas crear un archivo de prueba en el volume co­m­pa­r­ti­do con un comando como este:

echo "Hello from the container that is not allowed to write." >> /data/no-access.txt

obtendrás un error ex­pli­ca­n­do que este co­n­te­ne­dor no tiene derecho de escritura en este di­re­c­to­rio.

bash: /data/no-access.txt: Read-only file system
Ir al menú principal