Mongodb docker
Por diversos motivos entre uno de los mas importantes para mi, es que el uso de docker permite una instalaron sencilla y sin los inconveniente muy característicos mongodb, que el tema de incompatibilidad de librerías entre diferentes presentaciones de linux e incluso dentro de la misma con las actualizaciones del sistema operativo esto se evidencia por ejemplo en la actualidad cuando se pretenden de instalar mongodb en EC2 - 2023 , no encuentra las librerías libcrypto.so.10 y libssl.so.10, el problema es porque esta versión de EC2 2023 no tiene esas librerías sino libcrypto.so.3.0.
Cuando se tiene tiempo puede uno a buscar la solución que casi nunca trivial pero cuando se esta en una dinámica de cambio de versiones y diferentes sistemas operativos mas o menos rápida, esa no es una opción.
Una alternativa muy buena es instalar mongo en un servidor tipo HUB (Mongo Atlas eso tora buena opción pero de paga, algunas empresas son reacias a esto mas que todo por la dependencia de un tercero) que permita conexiones desde todo tipo de aplicaciones, funciona bastante bien , pero eso aplica si todas las instancias que convocan la base datos son de la misma empresa , que no es este nuestro caso Así que hemos venido usando Docker porque presenta un sistema homogéneo y compacto e independiente de el sistema operativo, de la versión y del proveedor.
En algunos para no depender de un imagen de docker-hub se ha hecho una imagen mongo para docker propio desde una instalación fresca de un sistema operativo, tiene muchas bondades pero no es este el objeto de ester articulo. ver enlace para mayor información https://atareao.es/tutorial/docker/docker-hub-imagenes-docker/Instalar docker
$ sudo dnf install docker
# iniciar docker
$ sudo systemctl start docker
Descargar una imagen docker del repositorio docker. Para descargar la ultima actualización
$ sudo docker pull mongo
Descargar una imagen deseada por ejemplo 4.4.2
$ sudo docker pull mongo:4.4.2
Crear una carpeta para guardar los datos de forma persistente de lo contrario al detener docker los datos se pierden.
$ sudo mkdir -p /data/db
$ sudo chmod 777 /data/db
Ejecutar contenedor docker con la imagen mongo descargada con datos guardalados en /data/db y con nombre de contenedor mongodb.
Ejecutarlo lo lanzo en el puerto standard mongo 27017. Desviamos la salida a /dev/null y ejecutamos el docker en segundo plano con el ampersand (&) al final del comando o usar el parámetro -d
Este comando usa un volumen denominado data/db, que es un realidad una carpeta que el docker monta (mount) y que permite que datos almcenados en el sistema local pueden ser usados por el docker y viceversa, esto se usa a menudo para guardar los datos de la base datos para que sean persistentes y no se pierdan cuando el docker sea detenido .
También puede usar la opción -d para que docker se ejecute en segundo plano
$ sudo docker run --name mongodb -p 27017:27017 -v /data/db:/data/db mongo 1>/dev/null &
o usando la opción -d
$ sudo docker run -d --name mongodb -p 27017:27017 -v /data/db:/data/db mongo
-------------------------------------------------------------------------------------------------------------------
Nota con rockylinux 8.6 , mayo 2022, tuve inconveniente y hubo necesidades de usar la imagen 4.4.2 como máximo la que carga con docker pull mongo (last) no me funciono. Aunque inicia sin indicar ningún problema , se bloquea señalando que no esta corriendo. (not running)
$sudo docker pull mongo:4.4.2
$ sudo docker run -d --name mongodb -p 27017:27017 -v mongodbdata:/data/db mongo:4.4.2
Verificamos que efectivamente docker esta activo. el sistema que esta activo es docker no mongo.
#sudo docker ps
# salida es algo como lo siguiente:
93fc47adf665 mongo "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp mongodb
Con el comando docker sobre el volumen creado con la opción -v data/db:/data/db Podemos inspeccionar si el volumen fue creado y cual es punto de montaje.
$ sudo docker volume inspect mongodbdata
la salida será algo como lo siguiente:
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/data/db/_data",
"Name": "mongod",
"Options": null,
"Scope": "local"
No es recomendable lanzar mas de una instancia de los contenedores para evitar conflictos, es mejor remover el actual y volver a lanzarlo
# Notar que aquí mongodb no es la base de datos mongo, sino el nombre del contenedor (docker) que contiene la imagen de mongo.
Primero hay que detener el contenedor (docker) mongo para poder removerlo.
$ sudo docker stop mongod
$ sudo docker rm mongod
Ahora podemos ejecutar mongo que se encuentra en el contenedor (docker) Para eso primero debemos ingresar al bash del contenedor que esta activo. Dependiendo del propósito de su aplicación.
$ sudo docker exec -it mongodb bash
Debe mostrar un prompt como el siguiente:
# root@93fc47adf665:/#
Mostrando el ID del proceso que esta activo seguido de los caracteres :/#
Desde el interior del docker podemos ejecutar mongo desde su imagen cargada allí.
Dependiendo de la versión puede ser mongo para versiones inferiores a 5.0.0 o mongo.sh para supriores, buscar el comando correcto en su contenedor que se encuentra en el directorio /bin
root@93fc47adf665:/# mongosh
Notar que para usar los comandos que permiten restaurar y guardar datos en mongo, debe hacerse desde el interior del contendedor que es donde están los comando mongo que permiten hacer estas operaciones
Por ejemplo: Invocando el comando mongodump/mongorestore desde el shell del sistema operativo pero usando el comando de la imagen del docker. para restaurar datos desde la carpeta /tmp/mongodb.
Respaldar y Restaura la información de las bases de datos sobre mongo observar que el punto de montaje es data/db en ambos procesos tanto de inicio como de restore ,esto es hace así porque sobre /data/db inicia el docker la sesión y tiene los archivos de configuración, pero ademas es la carpeta que monta por defecto y a la que va atener acceso tanto desde el servidor local como desde el docker .
Hacer backup
sudo docker exec -i mongodb /usr/bin/mongodump --archive="/data/db/datos.db" --db=datos
1. Ejecuto el docker dejando la persistencia en /data/db
$ sudo docker run -d -it --name mongodb -p 27017:27017 -v /data/db:/data/db mongo
2. Restauro la información sobre la misma carpeta /data/db
Recordar almacenar el archivo que contiene su información mediante cp en este caso datos.db por ejemplo en /data/db que donde el comando restore la va a buscar para recuperar la información.
$ sudo docker exec -i mongodb /usr/bin/mongorestore --archive="/data/db/datos.db" --nsFrom='datos.*' --nsTo='datos.*'
3. Puedo copiarla a una carpeta convencional si lo deseo para por ejemplo hacer un backup. $ sudo cp /home/db/datos* /home/db_repository
Comentarios
Publicar un comentario