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.
Índice de contenido
¿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:

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 nombre–contenedor

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

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

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

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:
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

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!