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 *