Copia de seguridad de Docker en Linux Mint en tu servidor local: Script automático y restauración

Publicada:

Estamos montando un servidor local en tu nuevo Mini PC con SO Linux Mint y Docker para crear contenedores individuales con todos tus programas. Una de las cosas más importantes que tienes que poner en marcha es un sistema de copia de seguridad de tu instalación de Docker (también de tu sistema Linux Mint y de tus datos personales).

En el caso de Docker, como estamos en un sistema Linux, lo tenemos sencillo para hacerlo por nuestra cuenta. No necesitamos ningún programa extra para tener nuestros datos a salvo en otro disco externo o en la nube.

¡Ojo! Vamos a hacer un backup de los datos de Docker, no de la instalación. La instalación, si tienes tus archivos de configuración yml es fácil de recrear. No hace falta hacer copia de las imágenes que se pueden descargar fácilmente, pero si has cambiado mucho la configuración de Docker, es posible que debas plantearte también hacer un backup (por ejemplo de /etc/docker/daemon.json).

Qué carpetas incluye este backup de Docker

Con este script que te propongo, vas a tener una copia de seguridad de:

  • /var/lib/docker/volumes: donde tienes todos los volúmenes persistentes de tus contenedores, donde Docker guarda los datos de tus aplicaciones: bases de datos (MySQL, PostgreSQL), uploads, configuraciones, etc. Es donde se encuentran también los datos de Portainer (GUI de Docker).
  • /home/tu_usuario_linux/docker: donde guardas tus archivos de configuración docker-compose.yml, archivos .env y otras carpetas de datos que has personalizado en tu archivo inicial de Docker Compose.

No hace falta complicarse más. Con esto estás cubierto. Solo tendrías que levantar de nuevo Docker en tu nuevo servidor, comenzar a instalar tus stacks y copiar estas carpetas a tu nueva instalación.

Script de copia de seguridad automático

He instalado un sistema operativo Linux con Docker en un Mini PC, en mi caso un mini PC Intel N150 con Docker, Jellyfin, Immich

Cosas a tener en cuenta antes de empezar:

  1. Presupongo que tiene una carpeta /home/tu_usuario_linux/docker que vas a usar para meter datos de tus instalaciones Docker (al crear los docker-compose.yml), además de la ruta oficial donde guardas los datos de los volúmenes: /var/lib/docker/volumes. En /home guardo los datos de mis contenedores, por ejemplo, la configuración y muchos de sus datos (si me dejan configurarlo).
  2. Tienes que tener una carpeta de destino creada para guardar los backups, por ejemplo, en un disco externo: /ruta/a/carpeta/dockerbackup. Tienes que cambiar la ruta a /home/tu_usuario_linux/docker y /ruta/a/carpeta/dockerbackup en el script.
  3. ¿Tus contendores tienen la política restart: always? Cuidado con esto, porque se van a poner en marcha de nuevo, aunque tú mismo lo pares, lo que puede provocar que las bases de datos no se guarden correctamente en el backup. Cámbialo a restart: unless-stopped.
Recuerda comprobar que tus contenedores tengan restart: unless-stopped para evitar problemas al hacer la copia de seguridad.

Lo único que tenemos que hacer para ponerlo en marcha es lo siguiente:

1.-Creamos el archivo

Vas a la terminal en Linux Mint y pones (cambia antes tu_usuario_linux por tu usuario real):

mkdir -p /home/tu_usuario_linux/scripts
sudo nano /home/tu_usuario_linux/scripts/backup-docker.sh
Script de backup de Docker en Linux Mint en un mini PC.

Voy a guardar el archivo en mi carpeta home de usuario en una carpeta llamada scripts y lo llamo backup-docker.sh. Al abrirse la pantalla de nano, introduce lo siguiente:

#!/bin/bash
# ============================================
# Backup completo de Docker (datos volúmenes + /home/tu_usuario_linux/docker)
# ============================================

# === ENTORNO PARA CRON ===
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# === CONFIGURACIÓN ===
BACKUP_DIR="/ruta/a/carpeta/dockerbackup"
DATE=$(date +%Y-%m-%d_%H-%M)
ARCHIVO="$BACKUP_DIR/backup-docker-$DATE.tar.gz"
LOGFILE="$BACKUP_DIR/backup.log"

# Rutas a respaldar
RUTAS_BACKUP=(
    "/var/lib/docker/volumes"
    "/home/tu_usuario_linux/docker"
)

# === CREAR DIRECTORIO DE BACKUP SI NO EXISTE ===
mkdir -p "$BACKUP_DIR"

echo "============================================" | tee -a "$LOGFILE"
echo "[ $(date '+%Y-%m-%d %H:%M:%S') ] Iniciando backup completo de Docker..." | tee -a "$LOGFILE"

# === DETENER CONTENEDORES ===
echo "Deteniendo contenedores..." | tee -a "$LOGFILE"
docker ps -q | xargs -r docker stop >> "$LOGFILE" 2>&1

# === CREAR ARCHIVO TAR DE LAS RUTAS ===
echo "Creando archivo de backup: $ARCHIVO" | tee -a "$LOGFILE"
tar czvf "$ARCHIVO" "${RUTAS_BACKUP[@]}" >> "$LOGFILE" 2>&1

# === REINICIAR CONTENEDORES ===
echo "Reiniciando contenedores..." | tee -a "$LOGFILE"
docker ps -a -q | xargs -r docker start >> "$LOGFILE" 2>&1

# === LIMPIAR BACKUPS ANTIGUOS (mantiene los últimos 2) ===
echo "Eliminando backups antiguos (manteniendo los últimos 2)..." | tee -a "$LOGFILE"
ls -tp "$BACKUP_DIR"/backup-docker-*.tar.gz | grep -v '/$' | tail -n +3 | xargs -r rm -- >> "$LOGFILE" 2>&1

echo "[ $(date '+%Y-%m-%d %H:%M:%S') ] Backup completado correctamente." | tee -a "$LOGFILE"
echo "Archivo generado: $ARCHIVO" | tee -a "$LOGFILE"
echo "============================================" | tee -a "$LOGFILE"

Le das a guardar con CRTL + O y luego sales con CRTL + X.

Luego, tienes que darle permisos de ejecución:

sudo chmod +x /home/tu_usuario_linux/scripts/backup-docker.sh

Ahora solo tendrías que crear un cron para que se ejecute cada cierto tiempo. Yo he puesto una vez a la semana los miércoles por la noche a las 5.

  • ¡Ojo! Editamos el cron de root y no del usuario de tu sistema Linux para no tener problemas de permisos al intentar comprimir los archivos mediante tar en /var/lib/docker/volumes. root es el usuario administrador del sistema con todos los privilegios y Docker se ejecuta con privilegios del daemon (root). Por eso es necesario hacer esto.
    • Al hacer un tar de /var/lib/docker/volumes, los archivos se copian con sus permisos originales.
    • Restaurarlos con root asegura que Docker podrá acceder a ellos correctamente sin fallos por permisos.
sudo crontab -e
Crontab de root en Linux Mint para ejecutar el script de backup de Docker y sus volúmenes de datos.

Y pones lo siguiente:

0 5 * * 3 /home/tu_usuario_linux/scripts/backup-docker.sh

Le das a guardar con CRTL + O y luego sales con CRTL + X. Y ya lo tienes listo.

Cosas importantes a tener en cuenta:

  • Detenemos contenedores: Tenemos que parar los contenedores para hacer un backup limpio de Docker, sobre todo de sus bases de datos. Por eso paramos los contenedores, hacemos el backup y luego los ponemos en marcha de nuevo
  • ¿Usar mejor que el comando rsync? Bueno, en mi caso sí. Quiero un backup completo que se pueda restaurar de forma sencilla. En mi caso, el backup en estos momentos es de menos de 20 GB: tarda más de 20 minutos en realizarse, pero no es un tiempo exagerado. Puedes plantearte usar rsync si lo quieres hacer un backup incremental de los cambios semana a semana. En mi caso, estoy usando el comando rsync para hacer un backup semanal de las carpetas de datos de Immich, mi gestor de fotos, para no tener que subir varios TB cada semana al disco duro externo.
  • Log: en el log puedes consultar qué tal ha ido todo en el backup. Puedes meterlo en logrotate si ves que va a ocupar mucho espacio.
  • export PATH: se mete esa línea para que el cron no tenga problema en encontrar los comandos a ejecutar, es decir, docker y tar.
  • Cuántos backups a mantener: yo solo me quedo con 2, peor puedes aumentar la cantidad en función de tus necesidades. Cambia la línea tail -n +3 y sube el número.

Consejo: Además de hacer este backup a tu disco duro externo… ¿Te has planteado subir la copia de seguridad a un servicio en la nube (como Backblaze, Filen, Koofr) para conseguir un backup 3-2-1? Tener al menos tres copias de los datos, conservar las copias en dos soportes diferentes y tener una copia del respaldo fuera de tu lugar físico habitual. Puedes hacerlo facilmente en Linux con herramientas como Rclone.

Cómo restaurar la copia de seguridad

Es sencillo, y deberías probar tu backup cada cierto tiempo para ver si está todo correcto.

Solo tienes que ir a la carpeta donde guardaste tu backup y extraer el archivo con (cambia /tu/ruta/carpeta/dockerbackup/ y tu-fecha en el nombre de archivo):

sudo tar -xzvf /tu/ruta/carpeta/dockerbackup/backup-docker-tu-fecha.tar.gz -C /

Verás las dos carpetas originales:

var/lib/docker/volumes/
home/tu_usuario_linux/docker/

Ahora, tienes que detener Docker con:

sudo systemctl stop docker

Copias las carpetas a sus rutas originales sobreescribiendo el contenido:


sudo cp -r /tu/ruta/carpeta/dockerbackup/var/lib/docker/volumes/* /var/lib/docker/volumes/
sudo cp -r /tu/ruta/carpeta/dockerbackup/home/ivan/docker/* /home/tu_usuario_linux/docker/
  • Comprueba que todos los permisos de archivos sean correctos al pasar los archivos a tu nuevo servidor:
    • En /var/lib/docker/volumes tienes que tener root:root
    • En /home/tu_usuario_linux/docker/ tienes que tener tu_usuario_linux:tu_usuario_linux

Iniciamos Docker:

sudo systemctl start docker

Ahora solo te queda bajar de nuevo las imágenes de cada contenedor y ponerlos en marcha con este comando (debes ejecutarlo dentro de la carpeta de cada proyecto en /home/tu_usuario_linux/docker/):

sudo docker compose pull
sudo docker compose up -d

O puedes recuperar primero Portainer con el Backup y luego ir a la interfaz gráfica de este programa para descargar las imágenes y ponerlo todo en marcha. Depende de cómo hayas instalado inicialmente tus contenedores.

Como dato final. Comprueba los contenedores con el comando:

sudo docker ps -a

Y si algo no funciona, revisa los logs con:

sudo docker logs nombre_del_contenedor

Conclusión

De esta manera puedes hacer un buen backup de los datos de Docker y de tus proyectos, que es lo que realmente importa. Al principio puede parecer laborioso, pero solo tienes que configurar una vez y te olvidas.

Si ves que el activo que guardas va a aumentar con el tiempo, pásate a los backups incrementales o hazlo solo backup de los contenedores más críticos.

Recuerda comprobar la integridad de tus backups cada cierto tiempo y de seguir la regla 3-2-1.

Y no se te olvide configurar el reinicio automático de contenedores Docker.


Descubre más desde Gouforit.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la física, la lectura y los viajes, experto en tecnología e informática y fan de los relojes Casio, de los Mac y de los auriculares Sennheiser. Desde el año 2007 me he dedicado a escribir y a crear páginas web donde comparto mis conocimientos y reviews de productos. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si quieres estar al tanto de los mejores productos tecnológicos del año, no te puedes perder nuestras comparativas, opiniones y análisis de dispositivos tecnológicos. ¡No te los pierdas! Gouforit es soportado por sus lectores. El equipo de editores solo selecciona las mejores opciones mediante reviews independientes. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a Gouforit. Este sitio solo proporciona reseñas; no vendemos productos directamente. Saber más.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.