Cómo hacer copia de seguridad (mongodump) de un servidor de base de datos MongoDB en contenedor Docker, guardando la copia en el equipo host anfitrión. Cómo restaurar (mongorestore) una copia en el equipo host anfitrión en un contenedor MongoDB en Docker.
- Requisitos para hacer backup y restore de base de datos MongoDB en Docker.
- Realizar copia de seguridad a host anfitrión de servidor MongoDB en Docker.
- Restaurar backup de MongoDB en servidor MongoDB en Docker.
Requisitos para hacer backup y restore de base de datos MongoDB en Docker
Para el backup usaremos un contenedor Docker con MongoDB desplegado. En el siguiente tutorial indicamos cómo desplegar un contenedor e imagen Docker con MongoDB:
En el caso anterior usamos un contenedor generado con el siguiente fichero compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
services: mongodb: container_name: mongodb image: mongo restart: unless-stopped environment: MONGO_INITDB_DATABASE: admin MONGO_INITDB_ROOT_USERNAME: usadmin MONGO_INITDB_ROOT_PASSWORD: contraseña ME_CONFIG_BASICAUTH: true ports: - "27017:27017" volumes: - volmongo:/datos/bd volumes: volmongo: external: false |
Para la recuperación de ejemplo en otro servidor MongoDB, desplegaremos un segundo contenedor Docker, con el siguiente fichero compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
services: mongodb_r: container_name: mongodb_r image: mongo restart: unless-stopped environment: MONGO_INITDB_DATABASE: admin MONGO_INITDB_ROOT_USERNAME: usadmin2 MONGO_INITDB_ROOT_PASSWORD: contraseña ME_CONFIG_BASICAUTH: true ports: - "27018:27017" volumes: - volmongo_r:/datos_r/bd volumes: volmongo_r: external: false |
En el caso de la segunda imagen, la llamamos mongodb_r y le cambiamos el puerto de conexión externo (27018), el usuario de acceso, y el nombre del volumen, para realizar las pruebas de recuperación.
Realizaremos un backup del contenedor mongodb. El fichero de backup generado lo recuperaremos en el contenedor mongodb_r.
Para realizar el backup necesitaremos conocer el nombre de ambos contenedores: mongodb y mongodb_r. Podemos obtenerlo con el comando:
1 |
docker ps -a |
Realizar copia de seguridad a host anfitrión de servidor MongoDB en Docker
Para realizar la copia de seguridad de un contenedor Docker con MongoDB (con nombre mongodb) y guardar el fichero de copia en el equipo host anfitrión (externo al contenedor), ejecutaremos el siguiente comando:
1 |
docker exec mongodb sh -c "/usr/bin/mongodump --uri='mongodb://usadmin:contraseña@localhost:27017' --archive --gzip --authenticationDatabase=admin" > backup_mongodb.gz |
Devolviendo:
1 2 3 4 5 6 |
2024-06-23T08:45:17.656+0000 writing admin.system.users to archive on stdout 2024-06-23T08:45:17.660+0000 done dumping admin.system.users (1 document) 2024-06-23T08:45:17.661+0000 writing admin.system.version to archive on stdout 2024-06-23T08:45:17.667+0000 done dumping admin.system.version (2 documents) 2024-06-23T08:45:17.667+0000 writing bdproyectoa.bdproyectoa to archive on stdout 2024-06-23T08:45:17.673+0000 done dumping bdproyectoa.bdproyectoa (12 documents) |
El comando anterior ejecutará, a su vez, el comando «mongodump» dentro del contenedor indicado. El fichero comprimido con el backup de todas las bases de datos de MongoDB se guardará en el equipo local, en el host anfitrión, en la carpeta donde hayamos ejecutado el comando, con el nombre «backup_mongodb.gz».
El fichero de backup quedará en la carpeta donde hayamos ejecutado el comando:
Podríamos crear una tarea programada para que hiciera backup cada cierto tiempo, ejecutando un .bat con el comando anterior.
Restaurar backup de MongoDB en servidor MongoDB en Docker
El servidor MongoDB de destino de la restauración (contenedor mongodb_r) únicamente tendrá las bases de datos del sistema: admin, config y local):
Para hacer el proceso inverso al anterior, la recuperación de un backup previamente hecho en el servidor MongoDB del contenedor mongodb_r, ejecutaremos el siguiente comando (recuperará todas las bases de datos contenidas en el fichero comprimido):
1 |
docker exec -i mongodb_r /usr/bin/mongorestore --uri "mongodb://usadmin2:contraseña@localhost:27017" --authenticationDatabase=admin --gzip --archive < backup_mongodb.gz |
Devolviendo:
1 2 3 4 5 6 7 |
2024-06-23T08:48:10.806+0000 preparing collections to restore from 2024-06-23T08:48:10.813+0000 reading metadata for bdproyectoa.bdproyectoa from archive on stdin 2024-06-23T08:48:10.865+0000 restoring bdproyectoa.bdproyectoa from archive on stdin 2024-06-23T08:48:10.876+0000 finished restoring bdproyectoa.bdproyectoa (12 documents, 0 failures) 2024-06-23T08:48:10.876+0000 restoring users from archive on stdin 2024-06-23T08:48:10.938+0000 no indexes to restore for collection bdproyectoa.bdproyectoa 2024-06-23T08:48:10.938+0000 12 document(s) restored successfully. 0 document(s) failed to restore. |
El comando anterior restaurará todas las bases de datos que haya en el fichero de backup backup-mongodb-gz. Si quisiéramos recuperar una única base de datos, o incluso una colección de una base de datos, añadiremos el parámetro nsinclude, por ejemplo, para recuperar la base de datos bdproyectoa y la colección bdproyectoa de la base de datos anterior, usaremos:
1 |
docker exec -i mongodb_r /usr/bin/mongorestore --uri "mongodb://usadmin2:contraseña@localhost:27017" --authenticationDatabase=admin --nsInclude=bdproyectoa.bdproyectoa --gzip --archive < backup_mongodb.gz |
Si volvemos a acceder a MongoDB del contendor mongodb_r, nos aparecerá la base de datos recuperada bdproyectoa y sus colecciones y documentos: