Crear backups de contenedores Docker

Hola! En esta entrada vamos a ver cómo podemos realizar una copia de seguridad de nuestros contenedores Docker, para poder restaurarlos en cualquier momento si tenemos algún problema.

¿Qué es Docker?

Si has llegado a este post, muy probablemente sepas qué es Docker, pero, por si eres los rezagados, Docker es una tecnología que permite desplegar casi cualquier tipo de aplicación sobre contenedores Linux. Estos contenedores serían, a grandes rasgos, máquinas virtuales que corren en nuestra máquina host, pero que consumen muchos menos recursos que una máquina en VMWare o VirtualBox.

Podemos desplegar servidores web, de correo, aplicaciones como Transmission para descargar torrents en nuestro NAS… tenemos infinidad de posibilidades.

¿Por qué crear copias de seguridad?

Es bien sabido que las copias de seguridad es una de las tareas más importantes, si no la que más, para un administrador de sistemas o un desarrollador, en este caso, estoy trabajando con varios contenedores Docker corriendo sobre una Raspberry pi, y, como suelo trastearlos bastante, en alguna ocasión he estado a punto de romperlos y volver a empezar todo desde cero, por lo que la tarea de hacer copias de seguridad cada cierto tiempo se hace totalmente necesaria.

¿Cómo hacer el backup de un contenedor Docker?

Veamos los pasos a tener en cuenta para realizar nuestra copia de seguridad:

Ver los contenedores activos

Primero hemos de ver qué contenedores hay corriendo en nuestra máquina, para ello, vamos a la consola y ejecutamos:

docker ps

Probablemente debamos añadir sudo al inicio del comando:

lista contenedores docker
contenedores activos

Crear copia de seguridad de nuestro contenedor

Como vemos, tenemos 2 contenedores corriendo, uno con mysql y otro con wodpress, vamos a exportar el contenedor a un .tar con la siguiente instrucción:

docker export o backup.tar nombrecontenedor

exportar contenedor docker
export contenedor

Tardará un poco dependiendo de las prestaciones de nuestro equipo, una vez finalizado el proceso, podemos ver los dos archivos generados.

ls tars contenedores docker
ficheros tar creados

Crear copia de seguridad de los volúmenes

Además del contenedor en sí, habría que hacer una copia de seguridad de los datos del mismo, es decir, de los volúmenes, en mi caso, uno por cada imagen.

Estos volúmenes se guardan en la carpeta /var/lib/docker/volumes/[volumenX]/_data del sistema de ficheros de nuestra máquina host, por lo que una solución rápida sería crear otro .tar de esta carpeta.

Hay otras soluciones para hacer backups de volúmenes con tareas programadas, copias en AWS, etc, pero debido a la simplicidad de lo que necesito, vamos a usar el método rudimentario.

Lo ideal para esta tarea sería parar los contenedores mientras hacemos la copia, para evitar posibles inconsistencias.

tar -cvf backup.tar /var/lib/docker/volumes/[contenedorX]/_data

c –> crear nuevo fichero tar

v –> descripción del proceso

f –> nombre del archivo

generar tar volumenes docker
tar volumen docker

Ya tenemos creados los backups de los contenedores y de los volúmenes.

backup volumenes docker creados
tar volumenes creados

Restaurar un contenedor

En este caso no vamos a restaurarlo ya que no es necesario por ahora, solo si rompemos algo haciendo pruebas con el contenedor, pero la instrucción necesaria sería la siguiente:

docker import backup.tar nombre-nueva-imagen

Se nos generaría una nueva imagen a partir de la cual podríamos levantar la instancia de nuestro contenedor.

Restaurar un volumen

Este proceso sería justo el contrario al de comprimir el volumen, tendríamos que descomprimirlo en el directorio concreto del volumen de nuestro contenedor:

cp backup.tar /var/lib/docker/volumes/[contenedorX]/_data

tar -xvf backup.tar

Automatizando el proceso

Hasta aquí todo sencillo, pero… es un poco tedioso hacerlo «a mano» cada vez que queramos sacar una copia de seguridad, ¿no?. Veamos cómo automatizarlo.

Lo primero que haremos será crear un script .sh con las diferentes instrucciones que hemos ido ejecutando:

#!/bin/bash
docker export -o /home/pi/wordpress.tar docker_wordpress_1
docker export -o /home/pi/mysql.tar docker_db_1
tar -cvf /home/pi/bd_volumen.tar /var/lib/docker/volumes/docker_db/_data
tar -cvf /home/pi/wordpress_volumen.tar /var/lib/docker/volumes/docker_wordpress/_data

A continuación damos permiso de ejecución al script:

chmod +x scriptBackup.sh

Si ahora ejecutamos el script, se generarán todos los tar automáticamente:

sudo ./dockerBackup.sh

Por último, podemos añadir alguna instrucción que copie estos ficheros a alguna ubicación de red, que los suba a algún ftp… lo que sea, en mi caso este equipo está aislado de la red y no tengo ningún servidor ftp o similar, por lo que sacaremos los ficheros a través de un pendrive.

Programando la tarea

Para añadir una tarea al cron del usuario sudo (queremos hacerlo con permisos de root), y que se ejecute cuando necesitemos, ejecutaremos el siguiente comando:

sudo crontab -e

Para a continuación añadir la siguiente línea:

00 00 * * * /home/pi/backupDocker.sh

añadir cron backup docker
tareas backup programada

Podemos observar 5 parámetros antes del script:

00(m) -> Minuto del día

00(h) –> Hora del día

*(day of month) -> todos los días del mes

*(month) -> todos los meses

*(day of week) -> todos los días de la semana

Cabe decir que esta parametrización depende de lo que cada usuario necesite, copias diarias, semanales, mensuales… incluso podemos programar una diaria, una semanal y otra mensual.

Con esto damos por finalizado este tutorial, ya tendríamos un backup listo para recuperar nuestros contenedores Docker si algo va mal!

Saludos!