blog
Deploying MongoDB Using Docker
The main advantage of using MongoDB is that it’s easy to use. One can easily install MongoDB and start working on it in minutes. Docker makes this process even easier.
One cool thing about Docker is that, with very little effort and some configuration, we can spin up a container and start working on any technology. In this article, we will spin up a MongoDB container using Docker and learn how to attach the storage volume from a host system to a container.
Prerequisites for Deploying MongoDB on Docker
We will only need Docker installed in the system for this tutorial.
Creating a MongoDB Image
First create a folder and create a file with the name Dockerfile inside that folder:
$ mkdir mongo-with-docker
$ cd mongo-with-docker
$ vi Dockerfile
Paste this content in your Dockerfile:
FROM debian:jessie-slim
RUN apt-get update &&
apt-get install -y ca-certificates &&
rm -rf /var/lib/apt/lists/*
RUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys 0C49F3730359A14518585931BC711F9BA15703C6 &&
gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg
ARG MONGO_PACKAGE=mongodb-org
ARG MONGO_REPO=repo.mongodb.org
ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO}
ENV MONGO_MAJOR 3.4
ENV MONGO_VERSION 3.4.18
RUN echo "deb http://$MONGO_REPO/apt/debian jessie/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR main" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN echo "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list"
RUN apt-get update
RUN apt-get install -y ${MONGO_PACKAGE}=$MONGO_VERSION
VOLUME ["/data/db"]
WORKDIR /data
EXPOSE 27017
CMD ["mongod", "--smallfiles"]
Then run this command to build your own MongoDB Docker image:
docker build -t hello-mongo:latest .
Understanding the Docker File Content
The structure of each line in docker file is as follows:
INSTRUCTIONS arguments
- FROM: Base image from which we’ll start building the container
- RUN: This commands executes all instructions to install MongoDB in the base image.
- ARG: Stores some default values for the Docker build. These values are not available to the container. Can be overridden during the building process of the image using the –build-arg argument.
- ENV: These values are available during the build phase as well as after launching the container. Can be overridden by passing the -e argument to docker run command.
- VOLUME: Attaches the data/db volume to container.
- WORKDIR: Sets the work directory to execute any RUN or CMD commands.
- EXPOSE: Exposes the container’s port to host the system (outside world).
- CMD: Starts the mongod instance in the container.
Starting the MongoDB Container From the Image
You can start the MongoDB container by issuing the following command:
docker run --name my-mongo -d -v /tmp/mongodb:/data/db -p 27017:27017 hello-mongo
- –name: Name of the container.
- -d: Will start the container as a background (daemon) process. Don’t specify this argument to run the container as foreground process.
- -v: Attach the /tmp/mongodb volume of the host system to /data/db volume of the container.
- -p: Map the host port to the container port.
- Last argument is the name/id of the image.
To check whether the container is running or not, issue the following command:
docker ps
Output of this command should look like the following:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7e04bae0c53 hello-mongo "mongod --smallfiles" 7 seconds ago Up 6 seconds 0.0.0.0:27017->27017/tcp my-mongo
Accessing MongoDB From the Host
Once the container is up and running, we can access it the same way as accessing the remote MongoDB instance. You can use any utility like Compass or Robomongo to connect to this instance. For now, I’ll use mongo command to connect. Run the following command in your terminal:
mongo 27017
It will open mongo shell where you can execute any mongo commands. Now we’ll create one database and add some data in it.
use mydb
db.myColl.insert({“name”: “severalnines”})
quit()
Now to check whether our volume mapping is correct or not, we will restart the container and check whether it has our data or not.
Docker restart
Now again connect to mongo shell and run this command:
db.myColl.find().pretty()
You should see this result:
{ "_id" : ObjectId("5be7e05d20aab8d0622adf46"), "name" : "severalnines" }
This means our container is persisting the database data even after restarting it. This is possible because of volume mapping. The container will store all our data in /tmp/mongodb directory in the host system. So when you restart the container, all data inside the container will be erased and a new container will access the data from the host tmp/mongodb directory.
Accessing MongoDB Container Shell
$ docker exec -it /bin/bash
Accessing MongoDB Container Logs
$ docker logs
Connecting to the MongoDB Container From Another Container
You can connect to the MongoDB container from any other container using –link argument which follows the following structure.
--link :
Where Alias is an alias for link name. Run this command to link our Mongo container with express-mongo container.
docker run --link my-mongo:mongo -p 8081:8081 mongo-express
This command will pull the mongo-express image from dockerhub and start a new container. Mongo-express is an admin UI for MongoDB. Now go to http://localhost:8081 to access this interface.
Conclusion
In this article, we learned how to deploy a MongoDB image from scratch and how to create a MongoDB container using Docker. We also went through some important concepts like volume mapping and connecting to a MongoDB container from another container using links.
Docker eases the process of deploying multiple MongoDB instances. We can use the same MongoDB image to build any number of containers which can be used for creating Replica Sets. To make this process even smoother, we can write a YAML file (configuration file) and use docker-compose utility to deploy all the containers with the single command.