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:

        "CreatedAt": "2023-03-29T19:55:30Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/data/db/_data",
        "Name": "mongod",
        "Options": null,
        "Scope": "local"

Para listar los volúmenes activos

$ sudo docker volume ls

Muestra algo como el siguiente:

DRIVER    VOLUME NAME
local     ec8efeea067003ad4610708f40e90a2dd9cc97c99a9a1c6eb68b4dea8ced6304
local     mongodbdata

Si dese cancelar un volumen primero debe detenerlo el docker y removerlo y luego eliminrlo

$ sudo docker stop mongodb
$ sudo docker rm mongodb
$ sudo docker volume rm  ec8efeea067003ad4610708f40e90a2dd9cc97c99a9a1c6eb68b4dea8ced6304

si desea liberar los volumnes que no están asociados a ningún contenedor puede usar, donde el parametro -f hace que el proceso no sea iterativo
  
$ sudo docker volume prune -f

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

Restaurar la información

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

Entradas populares