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 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
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
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.
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
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.
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…).
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.
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.
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
Publicidad
Ahora tenemos tres contenedores: db1, db2, y dbTmp en funcionamiento
docker ps
12. Vuelva a enumerar los volúmenes.
docker volume ls
Observará que se ha creado un tercer volumen para el dbTmp contenedor.
13. Ahora, detenga el db2 junto con el contenedor dbTmp con el siguiente comando.
docker stop db2 dbTmp
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
2. Enumera los volúmenes, puedes ver el nuevo volumen que acabas de crear.
docker volume ls
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.
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
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.
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.
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
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 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?
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
2. Liste 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 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.
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.
tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .
5. Ejecute el siguiente comando para comprobar que el archivo de copia de seguridad tar se ha creado correctamente.
ls -l /tmp/website_*.tgz
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
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 .
8. Muévete al directorio del volumen y elimina 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
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
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.