Fecha publicación: Apr 23, 2021

Docker + MongoDB desarrollo

Cuando nos ponemos a trabajar con un backend, una de las primeras tareas que nos planteamos es tener la base de datos en local para poder hacer todo tipo de pruebas rápidas sin fastidiar a los compañeros.

Hasta hace unos años lo más normal era instalarte en tu máquina el motor de base de datos de turno, por ejemplo MongoDB, ¿Qué problemas nos podemos encontrar siguiendo esta aproximación?

  • Puede que vayamos a instalar una versíon de un motor y nos de problemas en nuestra máquina.
  • Es un rollo cuando salimos del proyecto y vamos dejando "motores" zombies que ya no usamos.
  • Otras veces no tenemos exactamente la misma versión que producción y eso puede traer problemas.
  • También es muy normal, que hayas hecho tantas pruebas que quieras partir de una versión limpia, o asegurarte que no hay nada que hayas tocado diferente a producción, tanto en settings del motor como con el contenido o estructura de tu base de datos.
  • El peor de los casos es cuando estamos entre dos proyectos y uno no usa la última versión del motor y el otro sí ¿Qué hacemos vamos desinstalando una e instalando la otra dependiendo del proyecto en el que estemos trabajando?

Manos a la obra

  • Si no lo tienes ya instalado, te puedes instalar Docker Desktop en esta URL, debes tener en cuenta:

    • En Linux suele instalar directo.
    • En MacOS no suele dar problemas.
    • Si tienes licencia Windows profesional seguramente te vaya bien.
    • Si tienes Windows Home te harán faltar dar unos pasos adicionales, tales como instalarte Windows Subsystem Linux .
  • Vamos ahora al terminal (el shell de linux o mac ó el cmd de Windows) y vamos a indicarle en un comando:

    • Que se baje la imagen de mongo (en concreto la versión 4.4.3).
    • Que vamos a exponer el puerto 27017 del contenedor docker y lo mapee al puerto 27017 de tu máquina física (este es el puerto en el que por defecto suele correr MongoDB).
    • Y Que a ese contenedor lo llame my-mongo-db y lo ejecute.
docker run --name my-mongo-db -p 27017:27017 -d mongo:4.4.3
  • Si queremos comprobar que el contenedor se ha creado y está ejecutandose podemos lanzar el siguiente comando:
docker ps
  • Ya que tenemos el contenedor listo vamos entrar en él en modo interactivo, es decir abrir una shell de bash sobre la que podremos tirar comandos dentro del mismo contenedor:
docker exec -it my-mongo-db sh

Con el flag it estamos diciendo que lo ejecutamos en modo interactivo, es decir aparece un nuevo prompt en el terminal desde que el podemos ejecutar comandos estando dentro del contenedor (sale como simbolo de línea de comandos una almohadilla).

En nuestro caso vamos a lanzar mongo

# mongo

Y vamos a hacer la siguiente prueba:

  • Crearemos una base de datos y
  • Añadiremos una colección y elemento.
  • Lo listaremos.

Una vez que hayamos terminado, nos saldremos de mongo y de la consola interactive que hemos abierto.

Vamos a por los comandos, miramos las bases de datos que hay creadas por defecto

show dbs

Vamos a cambiarnos a la base de datos my-db como esta no existe nos la crea:

use my-db

Mostramos la lista de colecciones que tiene esa nueva base de datos

show collections

Esta vacía, vamos a hacer un insert en una colección que llamaremos clients

db.clients.insert({ name: "Client 1" })

Ahora, si podemos ver la colección clientes en la base de datos, hacemos un show collections:

show collections

Y podemos ver que hemos insertado esa fila (añadimos la llamada pretty para que formatee el json resultante por consola):

db.clients.find().pretty()

para finalizar salimos de la consola de comandos de mongo

exit

Y salimos del interfaz interactivo del contenedor

exit

De esta manera podríamos tener varios contenedores de Docker con versiones diferentes de MongoDb instaladas.

También podemos conectarnos desde nuestra máquina local al Mongo que tenemos corriendo en el contenedor, si arrancamos por ejemplo compass, funciona incluso con la conexión por defecto, esto va tan directo, porque hemos mapeado el puerto por defecto que utiliza mongoDB en nuestro contenedor al puerto por defecto de nuestra máquina, así Mongo Compass lo toma como la base de datos en local que está instalada en nuestra máquina.

Cuando ya no nos haga falta un contenedor en concreto lo único que tenemos que hacer es eliminarlo con el siguiente comando:

docker container rm my-mongo-db -f

En este comando le hemos dicho que elimine el contenedor my-mongo-db que hemos creado, y el parametro -f es para forzar su eliminación (así si hay una instancia corriendo la pararía primero).

¿Te gusta el mundo Devops?

En Lemoncode impartimos un Bootcamp Devops Online, en él encontrarás todos los recursos necesarios: clases de los mejores profesionales del sector, tutorías en cuanto las necesites y ejercicios para desarrollar lo aprendido en los distintos módulos. Si quieres saber más puedes pinchar aquí para más información sobre este Bootcamp Devops.