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 volumenel_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 llamadomi_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 archivobackup.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.