Cómo desplegar un contenedor Docker con el motor de base de datos NoSQL MongoDB con persistencia y acceso externo. El contenedor quedará iniciado y los datos que se inserten/modifiquen en MongoDB quedarán almacenados y persistentes. Se iniciará el contenedor con acceso externo a MongoDB a través de un puerto. Desplegamos el contenedor con Docker Compose, estableciendo todos los parámetros de acceso (incluida la autenticación con usuario y contraseña).
- ¿Qué es MongoDB?
- Requisitos para desplegar contenedor Docker con MongoDB.
- Desplegar contenedor Docker con MongoDB por comando.
- Desplegar contenedor Docker con MongoDB y Docker Compose.
- Acceso a MongoDB de Docker con MongoDB Compass.
¿Qué es MongoDB?
MongoDB es un sistema de base de datos No-SQL y no relacional, orientado a documentos. MongoDB almacena los datos en estructuras BSON (una especificación similar a JSON). Permite esquemas dinámicos, pudiendo crear las mismas estructuras de documentos con diferentes «campos».
En MongoDB no se guardan los datos en tablas, campos y registros, como en las bases de datos relacionales. MongoDB guarda estructuras de datos BSON, como hemos indicando anteriormente.
Hasta hace un tiempo, ni siquiera incluía opción de gestión de transacciones y, como hemos indicado, no admite sentencias SQL. En su lugar, MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo específico del documento. También se pueden usar funciones definidas por el usuario.
Requisitos para desplegar contenedor Docker con MongoDB
Únicamente necesitaremos un equipo con Docker Desktop, bien en Windows, como indicamos en este tutorial:
O bien en Linux, como indicamos en este otro tutorial:
Desplegar contenedor Docker con MongoDB por comando
Una forma rápida de desplegar un contenedor Docker con MongoDB, persistente y accesible externamente a través del puerto 27017, es mediante la ejecución del siguiente comando (sea en Linux o en Windows, el comando es el mismo):
1 |
docker run -d --name mongobd --restart unless-stopped -v ~/mongodb/datos:/datos/bd -p 27017:27017 mongo:latest |

Se pueden hacer varias personalizaciones, como por ejemplo establecer el tipo de volumen, si lo queremos en el propio contenedor o en el equipo anfitrión, el puerto de conexión externa, el tipo de arranque en caso de parada de Docker, incluso se podría establecer el método de autenticación, usuario y contraseña (en este caso no lo hemos hecho). Por ello, hay que tener en cuenta que el comando anterior desplegará y ejecutará una imagen Docker con MongoDB, sin autenticación. Es decir, la BD será inicialmente accesible desde cualquier equipo de la red sin usuario y contraseña. Esto sirve para un despliegue rápido pero, por seguridad, en entornos de producción, hay que establecer el mecanismo de autenticación apropiado.
Si ejecutamos el siguiente comando nos mostrará la imagen Docker de MongoDB desplegada:
1 |
docker ps |

Desplegar contenedor Docker con MongoDB y Docker Compose
Otra forma, más eficiente, de desplegar un contenedor Docker con MongoDB es usando Docker Compose. Estableceremos usuario y contraseña de acceso a la BD, puerto externo de conexión, volumen para persistencia, etc. en el fichero compose.yml. Para ello, copiaremos el siguiente contenido y lo pegaremos en un fichero que llamaremos «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_usuario ME_CONFIG_BASICAUTH: true ports: - "27017:27017" volumes: - volmongo:/datos/bd volumes: volmongo: external: false |
Guardaremos el contenido anterior en un fichero, en la misma carpeta donde vayamos a ejecutar el comando Docker de despliegue, en este caso en C:\Users\alonso\docker\mongodb.
Abriremos una ventana de MS-DOS en Windows o shell de comandos en Linux y accederemos a la carpeta donde hayamos guardado el fichero compose.yml. Ejecutaremos el siguiente comando para que Docker lea el fichero compose.yml y ejecute todas sus acciones:
1 |
docker-compose -f compose.yml up -d |

El proceso concluirá con la salida:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
C:\Users\alonso\docker\mongodb>docker-compose -f compose.yml up -d [+] Running 7/9 - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣦⣿] 174.9MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣶⣿] 179.2MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣶⣿] 183.4MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣶⣿] 187.7MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣶⣿] 187.7MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete - mongodb 8 layers [⣿⣿⣿⣿⣿⣿⣶⣿] 192MB/233.4MB Pulling ✔ 7646c8da3324 Pull complete [+] Running 7/910 Pull complete ✔ 7646c8da3324 Pull complete [+] Building 0.0s (0/0) [+] Running 2/2 ✔ Volume "mongodb_volmongo" Created ✔ Container mongodb Started |
Y habrá creado y desplegado, de forma automática, un contenedor llamado mongodb:

Una imagen llamada mongo :

Y un volumen llamado mongodb_volmongo.

Acceso a MongoDB de Docker con MongoDB Compass
Para comprobar que el servidor de MongoDB está disponible, descargaremos e instalaremos cualquier cliente MongoDB. El cliente oficial, gratuito y disponible en la web de MongoDB es MongoDB Compass. Al abrirlo podremos crear una nueva conexión, indicando la IP o nombre DNS del equipo con docker y MongoDB. En este caso ejecutaremos MongoDB Compass en el mismo equipo donde tenemos Docker, por lo que en la URI introduciremos:
mongodb://localhost:27017
En caso de no haber establecido método de autenticación, ni usuario y contraseña, pulsaremos en «Connect» para conectar a MongoDB, sin usuario ni contraseña:

En el caso de haber establecido usuario y contraseña, como hemos indicado aquí, en la conexión de MongoDB Compass deberemos pulsar en «Advanced Connections Options» e introducir usuario y contraseña:

Y ya tendremos acceso al servidor de base de datos noSQL MongoDB. Podremos, por ejemplo, crear una nueva base de datos:

Y podemos insertar algún documento en la base de datos MongoDB creada, para comprobar la persistencia en el contenedor Docker:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "_id": { "$oid": "6675e905930451525f535b66" }, "factura": [ { "codigo": "1", "cliente": "ProyectoA", "importe": 2500.55 }, { "codigo": "2", "cliente": "ProyectoA segundo cliente", "importe": 1400.9 } ] } |
Si reiniciamos Docker o bien reiniciamos el equipo completo anfitrión, al iniciar nuevamente Docker se debe iniciar el contenedor MongoDB y debe seguir manteniendo sus datos:

La base de datos y el documento seguirá apareciendo, dado que ha quedado almacenado en el volumen correspondiente:
