Aunque Docker -y todos los contenedores- suelen ser algo más recientes en un entorno de TI de producción que la mayoría de las demás tecnologías, sigue siendo necesario hacer copias de seguridad de estos contenedores, sus aplicaciones y sus datos persistentes. Si un sistema de TI de producción produce datos persistentes, es probable que esos datos tengan algún valor. Incluso pueden ser de importancia crítica. Por lo tanto, es probable que sea necesario salvaguardar esos datos en caso de que ocurra algún tipo de desastre, por ejemplo, como resultado de una violación de datos o de un error humano.
Este tema cubre tanto la capacidad de Docker para crear copias de seguridad por sí mismo, como la capacidad de varias soluciones de terceros para crear copias de seguridad completas de Docker, como Bacula Enterprise.
Respaldo y restauración de contenedores Docker
Esto suele comenzar con la confirmación del contenedor en cuestión como imagen, utilizando el siguiente comando:
# docker commit -p [container-id] backup01
sha256:89682d4xxxxxx
Esta imagen puede guardarse como un archivo .tar con otro comando:
# docker save -o backup01.tar backup01
# ls -al | grep back
-rw——- 1 root root 178697728 Mar 31 23:35 backup01.tar
El archivo .tar también puede guardarse en el punto de montaje NFS. Una alternativa para ello es empujar la imagen en cuestión (backup01) directamente a su registro local. Para ello tendremos que etiquetar adecuadamente la imagen primero:
# docker tag backup01 localhost:5000/backup-image:v1
En este caso localhost es el nombre de la ubicación, y 5000 es el número de puerto. Ambos pueden cambiarse si es necesario. También es importante recordar que tanto el nombre de la etiqueta como el repositorio deben estar en minúsculas para que la etiqueta se aplique correctamente. El proceso se completa con la iniciación del comando push:
# docker push backup-image:v1
Como hemos hablado de dos métodos de copia de seguridad, también habrá dos métodos de restauración. Para restaurar la imagen de copia de seguridad desde un archivo .tar tendrá que iniciar el siguiente comando:
# docker load -i /tmp/backup01.tar
La línea de comandos debería mostrarle las líneas de estado posteriores si el comando se ha introducido correctamente:
ff91b8b5abb1: Loading layer [======================>] 2.56 kB/2.56 kB
Loaded image: backup01:latest
Se puede utilizar otro comando llamado docker run para crear un contenedor a partir de esta imagen.
Una imagen empujada puede ser extraída directamente con un comando relativamente simple:
# docker pull localhost:5000/backup-image:v1
Al igual que en el ejemplo anterior, tanto el nombre de localhost como el número de puerto son susceptibles de ser modificados si es necesario.
Respaldo y restauración de volúmenes Docker
Otro tipo de copias de seguridad de Docker es a través de los volúmenes, proveedores de almacenamiento persistente para los contenedores Docker. Estos volúmenes necesitan ser respaldados para la continuidad de los datos.
Normalmente, los volúmenes Docker son gestionados por el demonio Docker, sin embargo, no vamos a interactuar con eso en absoluto. La idea de una copia de seguridad del volumen es obtener una copia del volumen como un archivo comprimido en uno de los directorios locales. Esta copia es el respaldo que buscamos.
En este ejemplo nuestro contenedor en cuestión se llama dckr-site con el volumen llamado dckr-volume, está montado en /var/lib/dckr/content/ y almacena todos los datos allí.
El primer paso es detener el contenedor utilizando el siguiente comando:
$ docker stop dckr-site
La siguiente se centra tanto en el montaje del contenedor como en la copia de seguridad del contenido del volumen:
$ mkdir ~/backup
$ docker run –rm –volumes-from dckr-site -v ~/backup:/backup ubuntu bash -c “cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar .”
En este escenario:
- docker run comando se utiliza para crear un nuevo contenedor,
- –rm comando que indica al sistema que elimine el contenedor una vez completada la operación;
- –volumes-from dckr-site es montar los volúmenes del contenedor en nuestro nuevo contenedor temporal;
- bash -c «cd /var/lib/dckr/content && tar cvf /backup/dckr-site.tar» crea una copia de seguridad de todo el contenido del directorio /backup/
El proceso de recuperación de estas copias de seguridad no es tan complicado. Comienza con la creación de un nuevo volumen con el siguiente comando:
$ docker volume create dckr-volume-2
Entonces puede utilizar el siguiente comando para restaurar el volumen desde un contenedor temporal en un archivo .tar :
$ docker run –rm -v dckr-volume-2:/recover -v ~/backup:/backup ubuntu bash -c “cd /recover && tar xvf /backup/dckr-site.tar”
Por supuesto, tendrá que montar este nuevo volumen en el nuevo contenedor para que funcione correctamente:
$ docker run -d -v dckr-volume-2:/var/lib/dckr/content -p 80:2368 dckr:latest
Si el procedimiento se realiza correctamente, debería restaurarse el estado completo de la aplicación. Es importante mencionar que no se debe confiar en este método como fuente de copia de seguridad única, ya que los datos de la copia de seguridad siguen almacenados en el host y, por lo tanto, se perderían en caso de una pérdida de datos o un desastre que afecte también al host.
Copia de seguridad y restauración de Docker con Bacula Enterprise
Bacula Enterprise utiliza su capacidad modular para permitir la integración nativa de varios sistemas y servicios, incluido Docker. El módulo Docker de Bacula proporciona muchas funciones adicionales útiles junto a las principales de copia de seguridad y recuperación.
La copia de seguridad de Docker con Bacula Enterprise consta de tres sencillos pasos:
- El estado actual del contenedor se guarda en la nueva imagen
- Se ejecuta la utilidad Docker y se guardan los datos
- Se elimina la instantánea en cuestión para liberar el espacio
La copia de seguridad en cuestión puede realizarse en un contenedor en cada estado, y el software de Bacula muestra el estado del proceso de copia de seguridad en cada paso. Cada copia de seguridad de la imagen del contenedor supone un archivo .tar más guardado. Las copias de seguridad de imágenes se guardan en el directorio /@docker/image//.tar, y las de contenedores en el directorio /@docker/container//.tar.
El proceso de restauración de las copias de seguridad de Docker con Bacula Enterprise es un poco más complicado y se puede hacer de dos maneras diferentes:
- Restaurar en el directorio local que utiliza el parámetro de Bacula where=/some/path para indicar la ruta completa de la copia de seguridad que se va a restaurar como archivo o archivos;
- Y Restaurar al servicio Docker, lo que significa que los datos de la copia de seguridad se restaurarían con el comando where= como el nuevo contenedor, sin archivarlo en primer lugar.
La personalización del proceso de restauración también está disponible a través de varios parámetros diferentes, como container_create, container_run, y más.
En el momento de escribir este artículo, Bacula es una de las pocas (o la única) soluciones de copia de seguridad y recuperación de nivel empresarial capaz de realizar una copia de seguridad completa y exhaustiva de un entorno Docker. Sin embargo, la disponibilidad de otras soluciones especializadas en copias de seguridad de Docker, combinada con la propia solución incorporada de Docker, junto con el módulo Docker de Bacula, significa que hay una gama de opciones disponibles para los administradores de TI que buscan una manera de salvaguardar su implementación de Docker en producción.