1. Identificando el volumen que queremos respaldar.

sudo docker volume ls

el_volumen_de_mi_app
data
mongodb
otro_volumen

Se nos listaran los volumenes disponible, vemos el NAME del cual nos interesa respaldar.

2. Generamos el archivo backup.tar.gz

docker run --rm -v "el_volumen_de_mi_app:/data" -v "$(pwd):/backup-dir" ubuntu tar cvzf /backup-dir/backup.tar.gz `/data`

Este comando crea y ejecuta un contenedor temporal de Ubuntu con el objetivo de hacer una copia de seguridad del volumen el_volumen_de_mi_app.

2.1 Desglose del comando

  • --rm: Elimina el contenedor automáticamente después de que finalice su ejecución. (ubuntu)
  • -v "el_volumen_de_mi_app:/data": Monta el volumen el_volumen_de_mi_app en el contenedor (ubuntu) en la ruta /data (dentro de ubuntu).
  • -v "$(pwd):/backup-dir": Monta el directorio actual (el que se obtiene con $(pwd)) en el contenedor en la ruta /backup-dir.

Al montar el directorio actual al contendor/backup-dir (ubuntu) logramos que al momento de genrarse el archivo backup.tar.gz aparaezca en nuetro directorio host (nuestra pc fisica)

  • tar cvzf /backup-dir/backup.tar.gz /data: Comprime el contenido del volumen montado en /data y guarda el archivo resultante en el directorio de backup /backup-dir/backup.tar.gz.

3. Restaurar backup.

3.1 Crendo un volumen donde volcaremos los datos restaurados

sudo docker volume create mi_backup 

3.2 Volcamos los datos de backup.tar.gz en el nuevo volumen.

sudo docker run --rm -v "mi_backup:/data" -v "$(pwd):/backup-dir" ubuntu bash -c "rm -rf /data/{*,.*}; cd /data && tar xvzf /backup-dir/backup.tar.gz --strip 1"

3.3 Desglose del comando

  • sudo docker run --rm: Ejecuta un contenedor Docker temporalmente. La opción —rm asegura que el contenedor se elimine automáticamente después de que el comando termine.
  • -v "mi_backup:/data": Monta el volumen de Docker llamado mi_backup en el contenedor (ubuntu) en la ruta /data. Este es el destino donde se restaurará el contenido del backup (/data es el destino).
  • -v "$(pwd):/backup-dir": Monta el directorio actual de tu máquina host (indicado por $(pwd)) en el contenedor en la ruta /backup-dir. Este directorio ($pwd) debe contener el archivo backup.tar.gz que se va a restaurar.
  • ubuntu: Utiliza la imagen de Ubuntu como base para ejecutar el comando dentro del contenedor.
  • bash -c: Ejecuta el comando proporcionado dentro de una shell Bash en el contenedor.
  • rm -rf /data/{*,.*}: Elimina todos los archivos y directorios (incluidos los ocultos) en /data. Esto limpia el volumen antes de restaurar el backup, asegurando que no queden archivos antiguos que puedan interferir.
  • cd /data && tar xvzf /backup-dir/backup.tar.gz --strip 1:
    • cd /data: Cambia el directorio actual a /data, donde se ha montado el volumen.
    • tar xvzf /backup-dir/backup.tar.gz --strip 1: Extrae el contenido del archivo backup.tar.gz desde el directorio /backup-dir (que corresponde al directorio en tu máquina host) hacia /data. La opción --strip 1 elimina el primer nivel de directorios en el archivo comprimido, de modo que los archivos se extraen directamente en /data sin crear subdirectorios adicionales.

Una vez tengas el volumen mi_backup con los datos, es hora de usarlo.

Podes ir a tu docker-compose.yml y usalo de la siguiente manera:

version: "3.9"
services:
   frontend:
     container_name: miapp
     image: miapp:1.0.0
     ports:
       - "3000:3000"
     environment:
       - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/miappdb
     depends_on:
       - postgres
     command: >
       sh -c "npx prisma migrate deploy &&
              node server.js"
  
  postgres:
    image: postgres:16.3
    restart: always
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - "2345:5432"
    volumes:
      - mi_backup:/var/lib/postgresql/data

volumes:
  mi_backup:
    external: true

3.4 ¿Qué Significa external: true?

external: true: Indica que el volumen ya existe en el sistema y que Docker Compose no debe intentar crearlo. Docker Compose simplemente utilizará el volumen existente y lo montará en el contenedor.

3.5 Razón por la Cual Usaste external: true

Volumen Preexistente: Al usar external: true, estás diciendo que elbackup es un volumen que ya has creado fuera del contexto del archivo docker-compose.yml. Esto es útil si creaste el volumen manualmente o a través de un script, y quieres usar ese volumen sin que Docker Compose lo vuelva a crear.

Restauración y Persistencia: Si ya tenías un volumen con datos de backup que restauraste, debes asegurarte de que Docker Compose use ese volumen existente para montar los datos correctamente.