Cómo almacenar datos de contenedores Docker en volúmenes Docker

Una opción para automatizar un contenedor con datos es almacenar los datos dentro de la imagen del contenedor. Sin embargo, esto requiere que haya una copia de los datos en cada contenedor que se ejecute, lo que puede suponer un desperdicio de recursos si se escalan los contenedores. Una opción mejor es almacenar una copia de los datos en un volumen Docker y luego compartir ese volumen entre los contenedores.

Puedes pensar en un volumen Docker como una carpeta que existe fuera del sistema de archivos del contenedor, pero que sigue siendo accesible para los contenedores que se ejecutan en el mismo host. Cuando creas un nuevo contenedor, puedes montar un volumen existente o crear uno nuevo. Si creas un nuevo volumen, Docker creará automáticamente una nueva capa de almacenamiento en el sistema de archivos del host subyacente y la inicializará con los datos que especifiques.

Una vez que hayas creado un volumen, puedes utilizarlo para almacenar cualquier tipo de datos, incluidos archivos estáticos, datos de aplicaciones o registros. También puedes utilizar los volúmenes para compartir datos entre contenedores.

Por ejemplo, si tienes una aplicación web que se ejecuta en un contenedor, puedes utilizar un volumen para almacenar el código fuente de la aplicación, de forma que los demás contenedores de tu despliegue puedan acceder a él. Esto te permite mantener el código fuente de tu aplicación separado del entorno de ejecución, facilitando la actualización y redistribución de tu aplicación.

Además de compartir datos entre contenedores, también puedes utilizar volúmenes para persistir los datos cuando detengas e inicies tus contenedores. Esta es una gran manera de mantener tus datos a salvo incluso si tus contenedores se eliminan o se detienen accidentalmente.

En esta guía, aprenderás cómo los volúmenes Docker interactúan con los contenedores. Lo harás creando nuevos contenedores y utilizando volúmenes para almacenar y compartir datos entre ellos. Luego, descubrirás cómo limpiar el espacio que dejan los volúmenes anónimos que generan automáticamente los contenedores. Por último, aprenderás a hacer copias de seguridad de los datos de tus volúmenes Docker.

¡Vamos a empezar!

Requisitos previos

  • Para seguir esta guía, debes estar familiarizado con los fundamentos del trabajo con contenedores Docker.
  • Esta guía asume que estás utilizando un host Linux. Esta guía utiliza CentOS, pero los mismos pasos deberían funcionar en cualquier otra distribución de Linux.
  • Debes tener Docker instalado y funcionando en tu host. Si aún no lo tienes instalado, sigue las instrucciones de nuestra guía de instalación.
  • Una cuenta de usuario con privilegios de root
  • Tienes Docker instalado en el host de Linux.

Descubrir los volúmenes anónimos de Docker

Cuando creas un nuevo contenedor Docker, por defecto se crea un nuevo volumen anónimo en el sistema de archivos del host. Este volumen se utiliza para almacenar los datos que necesita el contenedor.

1. Ejecuta el siguiente comando para comprobar si Docker se está ejecutando y está activo.

sudo systemctl status docker

estado del docker

2. Ejecuta el siguiente comando para añadir tu cuenta de usuario al grupo docker, de forma que puedas ejecutar los comandos docker sin utilizar sudo. Una vez que hayas añadido tu cuenta de usuario al grupo docker, cierra la sesión y vuelve a entrar para que los cambios surtan efecto.

sudo usermod -aG docker $(whoami)

3. Ejecuta el siguiente comando para extraer algunas imágenes del registro Docker a tu host. Utilizarás estas imágenes para practicar la creación y el trabajo con volúmenes Docker.

docker pull postgres:12.1
docker pull bash 
docker pull httpd:2.4

4. Ejecuta el siguiente comando para listar las imágenes que están actualmente en tu host para verificar que las imágenes han sido extraídas.

docker images

imágenes docker

5. Ejecuta el siguiente comando para ver si hay algún volumen activo en tu host. Deberías ver una salida similar a la siguiente.

docker volume ls

Deberías ver una salida vacía.

lista de volúmenes docker

6. Ejecuta el siguiente comando para crear un nuevo contenedor y verificar que se ha creado un nuevo volumen anónimo en el host. Utiliza la bandera -d para ejecutar el contenedor en modo separado, de modo que puedas seguir trabajando en la terminal. Utiliza la bandera –name para dar un nombre al contenedor y poder identificarlo fácilmente. Aquí utilizas la imagen postgres:12.1, ya que Postgres necesita volúmenes de fondo para almacenar sus datos. Deberías ejecutar dos contenedores, uno para cada una de tus bases de datos Postgres, para poder ver más información.

docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1

 crear un nuevo contenedor

7. Ejecuta el siguiente comando docker para listar los contenedores que se están ejecutando actualmente en tu host.

docker ps

Ahora tienes dos contenedores en marcha: db1 y db2, como se muestra a continuación.

listado de contenedores

8. Ahora, lista los volúmenes que se han creado en el host.

docker volume ls

Verás una salida similar a la siguiente. Una vez que Postgres se inicia, necesita un lugar para almacenar sus datos. Postgresno quiere perder sus datos, así que crea automáticamente volúmenes anónimos. Los volúmenes se nombran con una cadena aleatoria de caracteres hexadecimales añadidos(e9f338… y ee3423… ).

lista el volumen

Veamos con más detalle los volúmenes utilizando el comando docker inspect.

9. Ejecuta el siguiente comando para obtener más información sobre el contenedor db1 en un formato legible para los humanos.

docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

Como puedes ver a continuación, la línea e9f338 Name coincide con la salida del comando docker volume ls anterior. Esta línea te indica que este volumen está asociado y montado al contenedor db1.

obtener más información sobre el contenedor db1

10. Haz lo mismo para inspeccionar el contenedor db2.

docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

Verás que la salida es exactamente la misma que la del contenedor db1, excepto por el nombre del volumen, que será diferente. Esta salida confirma que Docker crea un nuevo volumen anónimo para cada contenedor que se crea.

obtener más información sobre el contenedor db2

11. Ejecuta un contenedor más. Pero esta vez, vamos a utilizar la bandera –rm y veremos qué ocurre con los volúmenes. Llamamos a este contenedor dbTmp. ¡Vamos a comprobarlo!

docker run -d --rm --name dbTmp postgres:12.1

ejecuta un contenedor más temporalmente

Ahora tenemos tres contenedores: db1, db2 y dbTmp en funcionamiento

docker ps

listado de contenedores

12. Vuelve a listar los volúmenes.

docker volume ls

Verás que se ha creado un tercer volumen para el contenedor dbTmp .

lista el volumen

13. Ahora, detén el db2 junto con el contenedor dbTmp con el siguiente comando

docker stop db2 dbTmp

detener el contenedor

13. Vuelve a listar los contenedores y los volúmenes.

docker ps

docker volume ls

Como se muestra a continuación, el único contenedor que queda en funcionamiento es el contenedor db1. Sin embargo, el volumen del contenedor dbTemp ha desaparecido, pero el volumen del contenedor db2(ee3423… ) sigue ahí.

Este comportamiento es el esperado. La bandera –rm borra el contenedor después de que se haya detenido, junto con los volúmenes asociados. El volumen del contenedor dbTmp ha desaparecido porque hemos detenido el contenedor dbTemp . Como no hemos especificado la bandera –rm al crear el contenedor db2, el contenedordb2 y su volumen asociado permanecen en el host aunque detengamos el contenedor. La conclusión de este ejemplo es que debes tener cuidado con la bandera –rm. Si detienes un contenedor que tiene un volumen asociado, el volumen se eliminará.

Crear un volumen Docker

Un volumen Docker es un contenedor de almacenamiento con nombre que se crea con el comando docker volume create. A continuación, utilizarás el volumen para almacenar datos o para compartir datos entre contenedores.

1. Ejecuta el siguiente comando para crear un nuevo volumen llamado sitio web.

docker volume create website

crear un nuevo volumen llamado sitio web

2. En la lista de volúmenes, podrás ver el nuevo volumen que acabas de crear.

docker volume ls

lista el volumen

3. Descarga el código de este sitio web desde GitHub a tu directorio de trabajo actual.

4. Ejecuta el siguiente comando para copiar el código del sitio web que acabas de descargar en el volumen del sitio web .

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/

5. Ejecuta el siguiente comando para listar los archivos en el volumen del sitio web.

sudo ls -l /var/lib/docker/volumes/website/_data/ 

Puedes ver que el código del sitio web está ahora almacenado en el volumen del sitio web.

 lista los archivos en el volumen del sitio web.

6. Ahora puedes iniciar un nuevo contenedor y adjuntarle el volumen del sitio web. Utiliza la bandera -v (volumen) para montar el volumen. Utiliza la bandera -p (mapeo de puertos) para asignar un puerto en el host a un puerto en el contenedor. En este ejemplo, estamos asignando el puerto 80 en el host al puerto 80 en el contenedor. Web1 es el nombre del contenedor.

docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4

inicia un nuevo contenedor y adjunta a él el volumen del sitio web

7. El sitio web se servirá ahora desde el contenedor web1. Ejecuta el comando docker ps para comprobar el estado del contenedor web1. Puedes ver que el sitio web está siendo servido desde el contenedor web1. También puedes ver el puerto en el que se está sirviendo el sitio web (80) como se muestra a continuación.

comprobar el estado del contenedor web1

8. Puedes abrir la dirección IP de la máquina anfitriona en tu navegador web para ver el sitio web que acabas de copiar.

 ver el sitio web que acabas de copiar.

9. Ahora ejecuta otro contenedor llamado webTmp, esta vez con la bandera –rm, para ver qué ocurre con el volumen del sitio web cuando detengas el contenedor webTmp .

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4

ejecuta un contenedor más llamado webTmp

10. Ejecuta un comando docker ps show para verificar que el contenedor webTmp está en funcionamiento.

docker ps 

comprobar el contenedor webTmp

11. Ahora detén el contenedor webTmp y haz una lista de los volúmenes.

docker stop webTmp

docker volume ls

Como recuerdas al principio de este artículo, cuando paras un contenedor, los volúmenes asociados también se eliminan. Pero esta vez, como se muestra a continuación, puedes ver que el volumen del sitio web sigue ahí. Entonces, ¿qué ha pasado?

lista el volumen

La clave de este ejemplo es que cuando paras un contenedor, los datos de los volúmenes asociados a ese contenedor no se borran mientras los volúmenes estén siendo utilizados por otro contenedor. En este caso, el volumen del sitio web sigue siendo utilizado por el contenedor web1. Este es un punto muy importante que debes recordar cuando trabajes con volúmenes Docker.

Deshacerse de los volúmenes no utilizados

Aunque los volúmenes son una gran forma de almacenar datos y mantenerlos organizados, también pueden ocupar mucho espacio en el disco si no se utilizan. Si no estás utilizando un volumen, lo mejor es eliminarlo de tu sistema para liberar espacio en el disco. Por suerte, Docker ofrece todas las herramientas que necesitas para eliminar los volúmenes no utilizados de tu sistema.

1. Ejecuta el comando docker volume prune para eliminar los recursos colgantes (imágenes, redes, volúmenes y contenedores). Un recurso colgante es un objeto Docker que no está asociado actualmente a un contenedor . Pero antes de eliminar un volumen, asegúrate de que ningún contenedor lo está utilizando. Por ejemplo, debes eliminar el contenedor db2 antes de poder eliminar los volúmenes no utilizados asociados a él.

docker stop db2
docker rm db2
docker volume prune

eliminar los volúmenes no utilizados asociados al contenedor db2

2. Enumera los volúmenes y podrás ver que el volumen db2 ha desaparecido.

docker volume ls

Enumera los volúmenes y podrás ver que el volumen db2 ha desaparecido.

3. Ejecuta lo siguiente para encontrar la ubicación de los datos del volumen de tu sitio web y poder hacer una copia de seguridad.

docker volume inspect website

Verás el punto de montaje de tu sitio web. El punto de montaje es el directorio de tu sistema operativo anfitrión en el que está montado el volumen Docker. En este ejemplo, el punto de montaje es /var/lib/docker/volumes/website/_data, como se muestra a continuación.

encontrar la ubicación de tus datos de volumen

4. Puedes utilizar el comando tar para hacer una copia de seguridad del contenido del volumen de tu sitio web. Existe desde hace mucho tiempo y es compatible con la mayoría de las plataformas. El comando tar puede utilizarse para hacer una copia de seguridad de un directorio, incluyendo todos sus subdirectorios y archivos.

Nota: DEBES ejecutar este comando como usuario root o no tendrás permiso para escribir en el volumen docker montado, como se muestra a continuación.

Permiso denegado

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .

haz una copia de seguridad del contenido del volumen de tu sitio web

5. Ejecuta el siguiente comando para verificar que el archivo de copia de seguridad tar se ha creado correctamente.

ls -l /tmp/website_*.tgz

verifica que se ha creado el archivo de copia de seguridad tar

6. Ejecuta el siguiente comando para verificar que el archivo de copia de seguridad contiene los datos correctos. Sustituye TU_NOMBRE_DE_LA_SOPERATIVA por el nombre real de tu archivo de copia de seguridad.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

verificar que el archivo de copia de seguridad contiene los datos correctos

7. Ahora vamos a ejecutar un contenedor más utilizando el volumen del sitio web. Esta vez utilizarás la bandera -it para interactuar con el contenedor y probar la copia de seguridad.

docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .

ejecuta un contenedor más utilizando la columna del sitio web

8. Entra en el directorio del volumen y elimina todos los datos del sitio web.

Entra en el directorio del volumen y elimina todos los datos del sitio web.

9. Enumera el contenido del directorio para ver que los datos del sitio web han desaparecido.

ls -l

Revisa el contenido del directorio para comprobar que los datos del sitio web han desaparecido.

10. Ejecuta el siguiente comando para restaurar los datos del sitio web. Sustituye <NOMBRE_DE_ARCHIVO_DE_RESPALDA> por el nombre real de tu archivo de copia de seguridad.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Enumera el contenido del directorio para comprobar que los datos del sitio web se han restaurado.

ls -l

11. Enumera el contenido del directorio para comprobar que se han restaurado los datos del sitio web.

Conclusión

En esta guía has aprendido a crear, hacer una copia de seguridad de un volumen Docker y restaurar los datos. También has aprendido dónde encontrar el punto de montaje para tu volumen Docker.

Docker ha ganado mucha popularidad recientemente porque facilita el despliegue de aplicaciones. Sin embargo, un gran poder conlleva una gran responsabilidad. Es importante hacer una copia de seguridad de tus volúmenes Docker para evitar la pérdida de datos en caso de desastre.

Hay mucho que aprender sobre Docker. Si quieres profundizar en Docker, te sugerimos que consultes su documentación, donde encontrarás toda la información que necesitas para ponerte en marcha con Docker.

También te podría gustar...