MongoDB is a document-based NoSQL database that is good for high volume data storage. Rather than using tables and rows like traditional relational databases, MongoDB makes use of Collections and Documents. The documents consist of key-value pairs which are the basic unit of data in MongoDB. In this tutorial, we’ll use Docker to launch a container running MongoDB. Once it is up and running in a container, we can connect to it in a shell and test out some of the common Mongo commands.
Start MongoDB In Docker
With Docker installed and running, spinning up a Mongo container is done using the command here.
vegibit@ThinkPad MINGW64 ~ $ docker run --name mongo -d mongo Unable to find image 'mongo:latest' locally latest: Pulling from library/mongo 171857c49d0f: Pulling fs layer 419640447d26: Pulling fs layer 61e52f862619: Pulling fs layer 892787ca4521: Pulling fs layer 06e2d54757a5: Pulling fs layer e2f7d90822f3: Pulling fs layer f518d3776320: Pulling fs layer feb8e9d469d8: Pulling fs layer 69705b632494: Pulling fs layer c7daea26376d: Pulling fs layer 13d1f9e1fc77: Pulling fs layer f87e65fe7ffd: Pulling fs layer feb8e9d469d8: Waiting e2f7d90822f3: Waiting c7daea26376d: Waiting 13d1f9e1fc77: Waiting 69705b632494: Waiting f518d3776320: Waiting 892787ca4521: Waiting f87e65fe7ffd: Waiting 06e2d54757a5: Waiting 419640447d26: Verifying Checksum 419640447d26: Download complete 61e52f862619: Verifying Checksum 61e52f862619: Download complete 892787ca4521: Verifying Checksum 892787ca4521: Download complete e2f7d90822f3: Verifying Checksum e2f7d90822f3: Download complete 06e2d54757a5: Verifying Checksum 06e2d54757a5: Download complete 171857c49d0f: Download complete f518d3776320: Verifying Checksum f518d3776320: Download complete 171857c49d0f: Pull complete 419640447d26: Pull complete 61e52f862619: Pull complete 892787ca4521: Pull complete 06e2d54757a5: Pull complete e2f7d90822f3: Pull complete f518d3776320: Pull complete 69705b632494: Verifying Checksum 69705b632494: Download complete feb8e9d469d8: Verifying Checksum feb8e9d469d8: Download complete feb8e9d469d8: Pull complete 69705b632494: Pull complete 13d1f9e1fc77: Verifying Checksum 13d1f9e1fc77: Download complete f87e65fe7ffd: Verifying Checksum f87e65fe7ffd: Download complete c7daea26376d: Verifying Checksum c7daea26376d: Download complete c7daea26376d: Pull complete 13d1f9e1fc77: Pull complete f87e65fe7ffd: Pull complete Digest: sha256:a4448eb5f6e6097353d0ab97eb50aeb0238bb4e60c37e401920d3c2c4fc73eb9 Status: Downloaded newer image for mongo:latest 08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99
What Happened When We Ran docker run –name mongo -d mongo
One we ran the command above, we saw quite a bit of output in the terminal. So what exactly is happening here? These steps give a brief summary.
- Docker looks for the mongo image locally
- Docker does not find the mongo image locally so it next checks hub.docker.com
- The image is found and downloads each layer
- A new container is created based on the mongo image
- The container runs and can be seen via cli or Docker Desktop
We can see our new Mongo container running with the docker container ls command.
vegibit@ThinkPad MINGW64 ~ $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 08190185820c mongo "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 27017/tcp mongo
With docker container top mongo we can see the process running. A container is just a process that is limited to what resources it can access. They are not VMs.
vegibit@ThinkPad MINGW64 ~ $ docker container top mongo PID USER TIME COMMAND 986 999 0:05 mongod --bind_ip_all
Using Docker Desktop is also a great way to be able to view and manage any containers on the system.
Docker Connect To Container cli
The docker exec
command runs a new command in a running container. We can use this to run the ps aux command inside the container to see the running processes.
vegibit@ThinkPad MINGW64 ~ $ docker exec mongo ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mongodb 1 1.1 2.1 1584916 136412 ? Ssl 15:20 1:00 mongod --bind_ip_all root 76 0.0 0.0 34404 2804 ? Rs 16:50 0:00 ps aux
Stopping The Mongo Container
vegibit@ThinkPad MINGW64 ~ $ docker stop mongo mongo vegibit@ThinkPad MINGW64 ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES vegibit@ThinkPad MINGW64 ~ $ docker top mongo Error response from daemon: Container 08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99 is not running vegibit@ThinkPad MINGW64 ~ $ docker exec mongo ps aux Error response from daemon: Container 08190185820c9b1d513375f9ff011e4042fae95487fd3bcbc3e9c18b5048dc99 is not running
Restart The Mongo Container
vegibit@ThinkPad MINGW64 ~ $ docker start mongo mongo vegibit@ThinkPad MINGW64 ~ $ docker container list CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 08190185820c mongo "docker-entrypoint.s…" 2 hours ago Up 19 seconds 27017/tcp mongo vegibit@ThinkPad MINGW64 ~ $ docker mongo top docker: 'mongo' is not a docker command. See 'docker --help' vegibit@ThinkPad MINGW64 ~ $ docker top mongo PID USER TIME COMMAND 1253 999 0:01 mongod --bind_ip_all
Connect To The Shell Of Mongo Container
Ok great. We have a MongoDB container running, but how can we interact with it? To do this we can use the docker exec command. There are a few parts to the command so let’s review what each part does.
- docker exec runs a new command in a running container
- -it -i = # stdin, -t = # interactive
- mongo the name of the container to run the command in
- /bin/sh the command to run, in this case launch the shell
docker exec -it mongo /bin/sh #
The hashtag you see is the new prompt inside the container. From there we can launch the mongo interactive shell:
# mongo MongoDB shell version v4.4.1 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("d882e577-b5a5-438d-8a35-4a2e0002bf50") } MongoDB server version: 4.4.1 --- The server generated these startup warnings when booting: 2020-09-30T17:50:54.021+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem 2020-09-30T17:50:54.720+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted 2020-09-30T17:50:54.720+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' --- --- Enable MongoDB's free cloud-based monitoring service, which will then receive and display metrics about your deployment (disk utilization, CPU, operation statistics, etc). The monitoring data will be available on a MongoDB website with a unique URL accessible to you and anyone you share the URL with. MongoDB may use this information to make product improvements and to suggest MongoDB products and deployment options to you. To enable free monitoring, run the following command: db.enableFreeMonitoring() To permanently disable this reminder, run the following command: db.disableFreeMonitoring() --- >
We can try some various Mongo commands in the container to see it working.
> show dbs admin 0.000GB config 0.000GB local 0.000GB > use myNewDataBase switched to db myNewDataBase > db myNewDataBase > db.dropDatabase() { "ok" : 1 } > db.createCollection("Container"); { "ok" : 1 } > show collections Container > db.Container.drop() true > show collections > db.createCollection("Computer") { "ok" : 1 } > db.Computer.insert( { _id: 1, item: "Macbook", qty: 1 } ) WriteResult({ "nInserted" : 1 }) > show collections Computer > db.Computer.count() 1 > db.Computer.find() { "_id" : 1, "item" : "Macbook", "qty" : 1 } >
Cleaning Up
Well that was fun. Let’s clean up our docker environment now by stopping the container, removing it, and listing all containers to make sure its gone.
$ docker container stop mongo mongo $ docker container rm mongo mongo $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Learn More
- Install Mongodb Enterprise With Docker (docs.mongodb.com)
- Getting Started Mongodb Docker Container Deployment (thepolyglotdeveloper.com)
- Database Blog Deploying Mongodb Using Docker (severalnines.com)
- The Basics Of The Docker Run Command (blog.codeship.com)
- Understanding Docker Without Losing Your Shit (blog.hipolabs.com)
- Docker Run Tutorial For Absolute Beginners (medium.com)
- Docker Mongodb Tutorial With Docker And Mongoexpress (datasciencelearner.com)
- Setup_Mongodb_Server_Docker (linuxhint.com)
- Run Mongodb With Docker (dev.to)
- Mongodb On Windows In Minutes With Docker (blog.jeremylikness.com)
Summary
The takeaway is that once we have Docker set up and running, it is fairly easy to launch any type of container you like. In this case, we used MongoDB. It could just as easily have been MySQL, Oracle, Java, Postgres, Redis, Ubuntu, or whatever we like. Another thing to remember is that a container is just a process, it is not a virtual machine. Containers are much more lightweight than a full virtual machine and are easy to spin up, test out, and destroy very quickly.