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

status 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 conducir a un desperdicio de recursos si los contenedores se escalan. Una mejor opción 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 por 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 haya creado un volumen, puede utilizarlo para almacenar cualquier tipo de datos, incluyendo 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 para que los otros contenedores de tu despliegue puedan acceder a él. Esto le permite mantener el código fuente de su aplicación separado del entorno de ejecución, lo que facilita la actualización y redistribución de su aplicación.

Además de compartir datos entre contenedores, también puedes usar volúmenes para persistir los datos cuando paras e inicias tus contenedores. Esta es una gran manera de mantener tus datos seguros incluso si tus contenedores son borrados o detenidos 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. A continuación, descubrirás cómo limpiar el espacio que dejan los volúmenes anónimos generados automáticamente por los contenedores. Por último, aprenderás a hacer una copia de seguridad de los datos de los volúmenes Docker.

¡Empecemos!

Requisitos previos

  • Para seguir esta guía, debe estar familiarizado con los fundamentos del trabajo con contenedores Docker.
  • Esta guía asume que usted está usando un host Linux. Esta guía utiliza CentOS, pero los mismos pasos deberían funcionar en cualquier otra distribución de Linux.
  • Debe tener Docker instalado y funcionando en su host. Si aún no lo tiene instalado, siga las instrucciones de nuestra guía de instalación.
  • Una cuenta de usuario con privilegios de root
  • Tiene Docker instalado en el host Linux.

Descubriendo Volúmenes Docker Anónimos

Cuando se crea 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. Ejecute el siguiente comando para comprobar si docker se está ejecutando y está activo.

sudo systemctl status docker

status docker

2. Ejecuta el siguiente comando para añadir tu cuenta de usuario al grupo docker para que puedas ejecutar los comandos docker sin usar 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 de 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. Ejecute el siguiente comando para listar las imágenes que están actualmente en su 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ía ver una salida similar a la siguiente.

docker volume ls

Debería 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 para que puedas seguir trabajando en la terminal. Utiliza la bandera –name para dar un nombre al contenedor y poder identificarlo fácilmente. Aquí se utiliza 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 tener una buena medida y más información que ver.

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

crear un nuevo contenedor

7. Ejecute el siguiente comando docker para listar los contenedores que se están ejecutando actualmente en su host.Advertisement

docker ps

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

listado de contenedores

8. Ahora, liste los volúmenes que han sido creados en el host.

docker volume ls

Verá una salida similar a la siguiente. Una vez que Postgres se inicia, necesita un lugar para almacenar sus datos. Postgres no 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…).

listar el volumen

Veamos más de cerca los volúmenes utilizando el comando docker inspect.

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

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

Como puede ver a continuación, el e9f338 Nombre coincide con la salida del comando docker volume ls de arriba. Esta línea le indica que este volumen está asociado y montado con el db1 contenedor.

obtener más información sobre el contenedor db1

10. Haga lo mismo para inspeccionar el db2 contenedor.

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

Verá que la salida es exactamente la misma que la del db1 contenedor, 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 usar la bandera –rm y veremos qué pasa con los volúmenes. Hemos llamado a este contenedor dbTmp. ¡Averigüémoslo!

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

ejecute un contenedor más temporalmentePublicidad

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

docker ps

listado de contenedores

12. Vuelva a enumerar los volúmenes.

docker volume ls

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

listar el volumen

13. Ahora, detenga el db2 junto con el contenedor dbTmp con el siguiente comando.

docker stop db2 dbTmp

detener el contenedor

13. Vuelva a enumerar 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 cualquier volumen asociado. El volumen del contenedor dbTmp ha desaparecido porque hemos detenido el contenedor dbTemp. Como no especificamos la bandera –rm cuando creamos el contenedor db2, el contenedor db2 y su volumen asociado permanecen en el host incluso si detenemos el contenedor. La conclusión de este ejemplo es que hay que tener cuidado con la bandera –rm. Si detienes un contenedor que tiene un volumen asociado, el volumen será eliminado.

Creación de un volumen Docker

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

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

docker volume create website

crear un nuevo volumen llamado website

2. Enumera los volúmenes, puedes ver el nuevo volumen que acabas de crear.

docker volume ls

listar el volumen

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

4. Ejecute el siguiente comando para copiar el código del sitio web que acaba 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. Ejecute el siguiente comando para listar los archivos en el volumen del sitio web.

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

Puede 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 (port mapping) 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

iniciar un nuevo contenedor y adjuntar el volumen del sitio web a él

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. Puede abrir la dirección IP de la máquina anfitriona en su navegador web para ver el sitio web que acaba de copiar.

ver el sitio web que acaba de copiar.

9. Ahora ejecute otro contenedor llamado webTmp esta vez con la bandera –rm para ver qué pasa con el volumen del sitio web cuando detenga el contenedor webTmp.

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

ejecute un contenedor más llamado webTmp

10. Ejecute un comando docker ps show para verificar que el contenedor webTmp se está ejecutando.

docker ps

comprobando el contenedor webTmp

11. Ahora detenga el contenedor webTmp y liste 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 borran. 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 se detiene 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 a recordar cuando se trabaja con volúmenes Docker.

Deshacerse de los volúmenes no utilizados

Aunque los volúmenes son una gran manera de almacenar datos y mantenerlos organizados, también pueden ocupar mucho espacio en el disco si no se están utilizando. Si no estás usando 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. Ejecute el comando docker volume prune para eliminar los recursos colgantes (imágenes, redes, volúmenes y contenedores). Un recurso pendiente es un objeto Docker que no está asociado 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. Liste los volúmenes y podrá ver que el volumen db2 ya no está.

docker volume ls

Liste los volúmenes y puede ver que el volumen db2 ha desaparecido.

3. Ejecute lo siguiente para encontrar la ubicación de los datos del volumen de su sitio web para que pueda hacer una copia de seguridad.

docker volume inspect website

Verá el punto de montaje de su sitio web. El punto de montaje es el directorio en su sistema operativo anfitrión donde se monta el volumen docker. En este ejemplo, el punto de montaje es /var/lib/docker/volumes/website/_data, como se muestra a continuación.

encuentre la ubicación de sus datos de volumen

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

Nota: DEBE ejecutar este comando como usuario root o de lo contrario no tendrá 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 .

haga una copia de seguridad del contenido de su sitio web

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

ls -l /tmp/website_*.tgz

verifique que el archivo de respaldo tar fue creado

6. Ejecute el siguiente comando para verificar que el archivo de copia de seguridad contiene los datos correctos. Sustituya YOUR_BACKUP_FILE_NAME por el nombre real de su archivo de copia de seguridad.

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz

verifique 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 usará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 usando la columna de la web

8. Muévete al directorio del volumen y elimina todos los datos del sitio web.

Entre en el directorio del volumen y elimine todos los datos del sitio web.

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

ls -l

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

10. Ejecute el siguiente comando para restaurar los datos del sitio web. Reemplace <YOUR_BACKUP_FILE_NAME> con el nombre real de su archivo de respaldo.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Enumere el contenido del directorio para verificar que los datos del sitio web han sido restaurados.

ls -l

11. Enumere el contenido del directorio para verificar que los datos del sitio web han sido restaurados.

Conclusión

En esta guía, has aprendido cómo 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 los volúmenes de 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *