GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo almacenar datos de contenedores de Docker en volúmenes de 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 ejecute, lo que puede provocar el desperdicio de recursos si los contenedores se amplían. Una mejor opción es almacenar una copia de los datos en un volumen de Docker y luego compartir ese volumen entre contenedores.

Puede pensar en un volumen de Docker como una carpeta que existe fuera del sistema de archivos del contenedor, pero aún es accesible para los contenedores que se ejecutan en el mismo host. Cuando crea un nuevo contenedor, puede montar un volumen existente o crear uno nuevo. Si crea 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 especifique.

Una vez que haya creado un volumen, puede usarlo para almacenar cualquier tipo de datos, incluidos archivos estáticos, datos de aplicaciones o registros. También puede usar volúmenes para compartir datos entre contenedores.

Por ejemplo, si tiene una aplicación web que se ejecuta en un contenedor, puede usar un volumen para almacenar el código fuente de la aplicación para que los otros contenedores en su implementación puedan acceder a él. Esto le permite mantener el código fuente de su aplicación separado del entorno de tiempo de ejecución, lo que facilita la actualización y la reimplementación de su aplicación.

Además de compartir datos entre contenedores, también puede usar volúmenes para conservar los datos cuando detiene e inicia sus contenedores. Esta es una excelente manera de mantener sus datos seguros incluso si sus contenedores se eliminan o detienen accidentalmente.

En esta guía, aprenderá cómo interactúan los volúmenes de Docker con los contenedores. Para ello, creará nuevos contenedores y utilizará volúmenes para almacenar y compartir datos entre ellos. Luego, descubrirá cómo liberar el espacio que dejan los volúmenes anónimos que los contenedores generan automáticamente. Por último, aprenderá a realizar una copia de seguridad de los datos de los volúmenes de Docker.

¡Empecemos!

Requisitos

  • Para seguir esta guía, debe estar familiarizado con los conceptos básicos para trabajar con contenedores Docker.
  • Esta guía asume que está utilizando un host Linux. Esta guía usa CentOS, pero los mismos pasos deberían funcionar en cualquier otra distribución de Linux.
  • Debe tener Docker instalado y ejecutándose 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 de Linux.

Descubrimiento de volúmenes anónimos de Docker

Cuando crea un nuevo contenedor de Docker, de forma predeterminada se crea un nuevo volumen anónimo en el sistema de archivos del host. Este volumen se utiliza para almacenar los datos que requiere el contenedor.

1. Ejecute el siguiente comando para verificar si Docker se está ejecutando y está activo.

sudo systemctl status docker

2. Ejecute el siguiente comando para agregar su cuenta de usuario al grupo docker para que pueda ejecutar comandos docker sin usar sudo. Una vez que haya agregado su cuenta de usuario al grupo docker, cierre la sesión y vuelva a iniciarla para que los cambios surtan efecto.

sudo usermod -aG docker $(whoami)

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

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

4. Ejecute el siguiente comando para enumerar las imágenes que se encuentran actualmente en su host para verificar que las imágenes se hayan extraído.

docker images

5. Ejecute el siguiente comando para ver si hay volúmenes activos en su host. Debería ver un resultado similar al siguiente.

docker volume ls

Debería ver una salida vacía.

6. Ejecute el siguiente comando para crear un nuevo contenedor y verifique que se haya creado un nuevo volumen anónimo en el host. Utiliza el indicador -d para ejecutar el contenedor en el modo separado para que pueda continuar trabajando en la terminal. Usas la bandera --name para darle un nombre al contenedor para que puedas identificarlo fácilmente. Utiliza la imagen postgres:12.1 aquí ya que Postgres necesita volúmenes de fondo para almacenar sus datos. Debe ejecutar dos contenedores, uno para cada una de sus bases de datos de Postgres por si acaso y más información para ver.

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

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

docker ps

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

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

docker volume ls

Verá un resultado similar al siguiente. Una vez que Postgres se inicia, necesita un lugar para almacenar sus datos. Postgres no quiere perder sus datos, por lo que Postgres crea automáticamente volúmenes anónimos. Los volúmenes se nombran con una cadena aleatoria de caracteres hexadecimales adjuntos (e9f338... y  ee3423... ).

Miremos más de cerca los volúmenes usando el comando docker inspect.

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

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

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

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 db1 contenedor, excepto por el nombre del volumen que será diferente. Este resultado confirma que Docker crea un nuevo volumen anónimo para cada contenedor que se crea.

11. Ejecute un contenedor más. Pero esta vez, vamos a usar el indicador --rm y veremos qué sucede con los volúmenes. Llamamos a este contenedor dbTmp. ¡Vamos a averiguarlo!

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

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

docker ps

12. Vuelva a enumerar los volúmenes.

docker volume ls

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

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

ventana acoplable detener db2 dbTmp

13. Vuelva a enumerar los contenedores y los volúmenes.

ventana acoplable ps

docker volume ls

Como se muestra a continuación, el único contenedor que queda en ejecución es el contenedor db1. Sin embargo, el volumen del contenedor dbTemp ya no está, pero el volumen del contenedor db2 (ee3423... ) todavía está ahí.

Se espera este comportamiento. El indicador --rm elimina el contenedor después de que se haya detenido, junto con cualquier volumen asociado. El volumen del contenedor dbTmp desapareció porque detuvimos el contenedor dbTemp. Dado que no especificamos el indicador --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 debe tener cuidado con el indicador --rm. Si detiene un contenedor que tiene un volumen asociado, el volumen se eliminará.

Creación de un volumen Docker

Un volumen de Docker es un contenedor de almacenamiento con nombre que se crea con el comando de creación de volumen de Docker. Luego utilizará 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

2. Haga una lista de los volúmenes, puede ver el nuevo volumen que acaba de crear.

docker volume ls

3. Descargue el código de este sitio web de 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 enumerar 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 ahora está almacenado en el volumen del sitio web.

6. Ahora puede iniciar un nuevo contenedor y adjuntarle el volumen del sitio web. Utiliza el indicador -v (volumen) para montar el volumen. Utilice el indicador -p (asignación 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

7. El sitio web ahora se servirá desde el contenedor web1. Ejecute el comando docker ps para verificar el estado del contenedor web1. Puede ver que el sitio web se está sirviendo desde el contenedor web1. También puede ver el puerto en el que se está sirviendo el sitio web (80) como se muestra a continuación.

8. Puede abrir la dirección IP de la máquina host en su navegador web para ver el sitio web que acaba de copiar.

9. Ahora ejecute un contenedor más llamado webTmp esta vez con el indicador --rm para ver qué sucede con el volumen del sitio web cuando detiene el contenedor webTmp.

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

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

docker ps 

11. Ahora detenga el contenedor webTmp y enumere los volúmenes.

docker stop webTmp

volumen acoplable ls

Como recordarás al principio de este artículo, cuando detienes un contenedor, también se eliminan los volúmenes asociados. Pero esta vez, como se muestra a continuación, puede ver que el volumen del sitio web todavía está allí. Entonces, ¿qué pasó?

La conclusión clave de este ejemplo es que cuando detiene un contenedor, los datos de los volúmenes asociados con ese contenedor no se eliminan mientras los volúmenes estén siendo utilizados por otro contenedor. En este caso, el contenedor web1 sigue utilizando el volumen del sitio web. Este es un punto muy importante para recordar cuando se trabaja con volúmenes de Docker.

Cómo deshacerse de los volúmenes no utilizados

Si bien los volúmenes son una excelente manera de almacenar datos y mantenerlos organizados, también pueden ocupar mucho espacio en el disco si no se utilizan. Si no está utilizando un volumen, es mejor eliminarlo de su sistema para liberar espacio en disco. Afortunadamente, Docker ofrece todas las herramientas que necesita para eliminar los volúmenes no utilizados de su sistema.

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

docker stop db2
docker rm db2
docker volume prune

2. Haga una lista de los volúmenes y podrá ver que el volumen db2 ya no está.

docker volume ls

3. Ejecute lo siguiente para encontrar la ubicación de los datos de volumen de su sitio web para que pueda realizar 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 host donde se monta el volumen acoplable. En este ejemplo, el punto de montaje es /var/lib/docker/volumes/website/_data , como se muestra a continuación.

4. Puede usar el comando tar para hacer una copia de seguridad del contenido del volumen de su sitio web. Ha existido durante mucho tiempo y es compatible con la mayoría de las plataformas. El comando tar se puede usar para hacer una copia de seguridad de un directorio, incluidos todos sus subdirectorios y archivos.

Nota :DEBE ejecutar este comando como usuario raíz o, de lo contrario, no tendrá permiso para escribir en el volumen acoplable montado, como se muestra a continuación.

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

5. Ejecute el siguiente comando para verificar que el archivo de copia de seguridad tar se creó correctamente.

ls -l /tmp/website_*.tgz

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

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. Ahora ejecutemos un contenedor más usando el volumen del sitio web. Esta vez usará el indicador -it para interactuar con el contenedor para 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 .

8. Vaya al directorio de volúmenes y elimine todos los datos del sitio web.

9. Enumere el contenido del directorio para ver que los datos del sitio web hayan desaparecido.

ls -l

10. Ejecute el siguiente comando para restaurar los datos del sitio web. Reemplace 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 se hayan restaurado.

ls -l

Conclusión

En esta guía, aprendió cómo crear, hacer una copia de seguridad de un volumen acoplable y restaurar los datos. También aprendió dónde encontrar el punto de montaje para su volumen acoplable.

Docker ha ganado mucha popularidad recientemente porque facilita la implementación 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 desea profundizar más en Docker, le sugerimos que consulte su documentación, donde encontrará toda la información que necesita para comenzar a utilizar Docker.


Docker
  1. Cómo construir el contenedor Docker Anaconda Python Data Science

  2. Cómo usar SSH en un contenedor Docker

  3. Cómo ejecutar un comando en un contenedor Docker en ejecución

  4. Cómo asignar una IP estática a un contenedor Docker

  5. Cómo compartir datos entre contenedores Docker

¿Qué es Docker? ¿Como funciona?

Cómo ejecutar PHPMyAdmin en un contenedor Docker

Cómo ejecutar Grafana en un contenedor Docker

Cómo crear volúmenes Docker en Windows de forma fácil

Cómo configurar un contenedor Apache Docker

Cómo ejecutar contenedores Docker