Backup de volúmenes en docker


En este artículo vamos a realizar el backup de volúmenes en docker usando el parámetro --volumes-from

oscar Escrito por oscar 17 October 2022 214 0

Contenido

Conocimiento previo a repasar

En este articulo vamos a realizar el backup del contenido de los volúmenes que creamos y asociemos a los contenedores, vamos a realizar la explicación paso a paso guiándonos de la documentación oficial de volúmenes, que vamos a hacer, crearemos un volumen, lo asociamos a un contenedor donde se generara archivos y luego con un contenedor temporal realizaremos el backup.

Se recomienda repasar un ejercicio que realizado en el artículos de docker volúmenes donde creamos y asignamos un volumen a un contenedor.

Entorno de trabajo

Realizaremos la prueba en Windows, pero se ha comprobado que los siguientes pasos se pudran hacer en distribuciones de linux.

  • Se trabaja en con Docker versión 20.10.17, build 100c701
  • Se requiere trabajar con la terminal de cmd para ejecutar algunas instrucciones
  • Puede realizar la prueba desde ubuntu 20.04

Los ejemplo lo realizo desde Windows pero si desea trabajar con linux lo puede hacer sin ningún problema solo es cambiar la ruta de c:/code a /home/USUARIO.

Backup de volúmenes en docker

Para este ejemplo vamos a usar la imagen de nginx, donde vamos a realizar el backup de contenido de la carpeta html donde esta almacenado el index de bienvenida de nginx, así que la primera instrucción a ejecutar es crear el contenedor y el volumen.

C:\code>docker run -d --name=nginxtest -v vol_nginx:/usr/share/nginx/html nginx:latest
af72c540486dd0526f1e7678bb0bc701fc1350aa25f81da10ef0bbd53bf0fb4c

Revisemos el volumen que se acaba de crear automáticamente al usar el parámetro -v

C:\code>docker volume inspect vol_nginx
[
    {
        "CreatedAt": "2022-10-17T21:40:21Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/vol_nginx/_data",
        "Name": "vol_nginx",
        "Options": null,
        "Scope": "local"
    }
]

El siguiente paso es asociar el contenedor nginxtest que tiene el volumen vol_nginx a un nuevo contenedor temporal que luego se destruirá al finalizar de su ejecución, esté contenedor lo usaremos para copiar los archivos en una carpeta que se va a comprimir y luego la descargue del contenedor temporal a un directorio de la maquina local, pero antes entendamos la siguiente definición:

La bandera --volumes-from permite montar en un contenedor el volumen existente que este en un contenedor ya creado, veamos el ejemplo con la practica que estamos realizando:

docker run --rm --volumes-from nginxtest ubuntu ls /usr/share/nginx/html

Respuesta de consola:

50x.html
index.html

Que esta realizando la instrucción anterior, lo explico paso a paso:

  • --rm: al terminar de ejecutarse él contenedor, se borrará y no queda ningún registro.
  • --volumes-from nginxtest: vamos a indicar que monte el volumen del contenedor nginxtest (id del contenedor) sobre la nueva imagen.
  • ubuntu: es la imagen para generar el contenedor temporal.
  • ls /usr/share/nginx/html: ejecutamos esta instrucción sobre el contenedor para que nos retorne los archivos de la ruta, en este caso podemos ver el index.html que es la bienvenida que muestra nginx.

Con lo anterior mencionado podemos hacer ahora un truco y es comprimir lo que contenga la ruta "/usr/share/nginx/html" en un archivo que se llame webNginx.tar, veamos como podemos hacer esto:

docker run --rm --volumes-from nginxtest ubuntu bash -c "mkdir ./backup && tar cvf ./backup/webNginx.tar /usr/share/nginx/html && ls ./backup"

Nota: con la bandera bash -c "" podemos ejecutar mas de una instruccion bash en el contenedor.

Respuesta de consola:

tar: Removing leading `/' from member names
/usr/share/nginx/html/
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
webNginx.tar

Observe que montamos de nuevo el volumen en un contenedor con una imagen ubuntu, pero le pasamos varias instrucciones que se ejecutaran en el contenedor con la instrucción bash -c:

  • mkdir ./backup: creamos el directorio backup.
  • tar cvf ./backup/webNginx.tar /usr/share/nginx/html: comprimimos los archivos de nginx en webNginx.tar.
  • ls ./backup: listamos todo el contenido de backup.

La respuesta que nos devuelve la consola es la compresion de los archivos y el listado de la carpeta backup.

Ahora vamos a descargar ese archivo que acabamos de comprimir en el contenedor temporal a un directorio en el host local, para hacer esto usaremos de nuevo un volumen temporal que apuntaremos a un directorio local con el directorio backup del contenedor: 

docker run --rm --volumes-from nginxtest -v c:/code:/backup ubuntu bash -c "cd /usr/share/nginx/html && tar cvf /backup/webNginx.tar ."

Respuesta de consola:

tar: Removing leading `/' from member names
/usr/share/nginx/html/
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html

Entonces, expliquemos a detalle la instrucción anterior:

  • docker run --rm: al terminar de ejecutarse él contenedor, se borrará y no queda ningún registro.
  • --volumes-from nginxtest: vamos a indicar que monte el volumen del contenedor nginxtest (id del contenedor) sobre la nueva imagen.
  • -v c:/code:/backup: creamos el volumen donde "c:/code" hace referencia a un directorio en la maquina host y "/backup" hace referencia al directorio del contenedor.
  • ubuntu: es la imagen para generar el contenedor temporal.
  • bach -c "cd /usr/share/nginx/html && tar cvf /backup/webNginx.tar ."

Restaurar volúmenes

Procedemos a crear un nuevo contenedor a partir de la imagen nginx y crearemos un nuevo volumen, por ultimo este contenedor le asociamos un puerto para que podamos ver la web de nginx desde el navegador.

docker run -d --name=nginxtest2 -v vol_nginx_2:/usr/share/nginx/html -p 80:80 nginx

Al ejecutar en un navegador http://localhost:80/ se cargara la pantalla de bienvenida de nginx.

Bienvenida de nginx

Nota: vamos a cambiar el diseño del archivo index.html que se descargo en el apartado anterior, para que al cargar el backup podamos observar los cambios.

Ahora vamos a hacer una prueba en donde cargaremos el archivo webNginx.tar en un contenedor temporal en el directorio backup.

docker run --rm -v c:/code/backup:/backup ubuntu ls backup
  • docker run --rm: al terminar de ejecutarse él contenedor, se borrará y no queda ningún registro.
  • -v c:/code/backup:/backup: creamos el volumen donde "c:/code" hace referencia a un directorio en la maquina host y "/backup" hace referencia al directorio del contenedor, con esto si en conde esta el archivo webNginx, se copiara al directorio backup.
  • ubuntu: es la imagen para generar el contenedor temporal.
  • ls backup: listamos el contenido de backup

Con el ejemplo anterior sabemos que el archivo webNginx.tar esta disponible en el contenedor, ahora procedemos a descomprimir y remplazar en el directorio de html e nginx dentro del volumen del contenedor nginxtest2, veamos el ejemplo:

docker run --rm --volumes-from nginxtest2 -v c:/code/backup:/backup ubuntu bash -c "cd /usr/share/nginx/html && tar xvf /backup/webNginx.tar --strip 1 && ls"
  • docker run --rm: al terminar de ejecutarse él contenedor, se borrará y no queda ningún registro.
  • --volumes-from nginxtest2: vamos a indicar que monte el volumen del contenedor nginxtest2 (id del contenedor) sobre la nueva imagen.
  • -v c:/code/backup:/backup: creamos el volumen donde "c:/code" hace referencia a un directorio en la maquina host y "/backup" hace referencia al directorio del contenedor, con esto si en conde esta el archivo webNginx, se copiara al directorio backup.
  • bash -c "cd /usr/share/nginx/html && tar xvf /backup/webNginx.tar --strip 1 && ls": nos ubicamos en el directorio html de nginx "cd /usr/share/nginx/html", descomprimimos en este directorio el backup con "tar xvf /backup/webNginx.tar", por ultimo listamos el contenido del directorio.

Respuesta de consola:

./50x.html
./index.html
50x.html
index.html
usr

Volvemos a abrir la url donde estamos visualizado nginx para ver los cambios reflejados en la pagina.

Backup restablecido en nginx

Comentario

Debe aceptar antes de enviar