Docker: NodeJs and MongoDb

Docker: NodeJs and MongoDb

Dockerizing NodeJS Application

Hello there, This post is a continuation of my docker article. To check click the links. Docker in and out Dockerize NodeJs app contain To follow along, you must have docker and node installed.


Today, we will learn how we can deploy two services NodeJs app with MongoDb.

Find the source code here

Agenda

๐ŸŽฏ Node Project Setup ๐ŸŽฏ Docker setup ๐ŸŽฏ Folder structure ๐ŸŽฏ Code breakdown


Initiate the project

npm init -y


Install the dependencies

npm i express dotenv mongoose


package.json

Image description


Docker Setup

To pull node and mongo image, go to docker hub and get the official images. click Make sure your docker deamon is on. Click on the docker desktop to activate the deamon.

To check if your docker is installed on your machine, run docker --version in your terminal Image description


Pull node image

Image description


Pull the mongo image

Image description


Check the docker images

docker image ls


Folder structure

Here's our folder structure in its most basic architecture. Image description


Code breakdown

๐Ÿ‹ Database setup

Image description In this config folder, we imported the mongoose module, connected to our database and exported the configuration.

โš ๏ธ Note:

  1. The docker-node-mongo can be named anything
  2. Notice the mongo:27017/docker-node-mongo, this replaces the localhost we use in our development mode.

๐Ÿ‹ Model and Schema

Image description Here we import the mongoose library and create a new schema for the user.


๐Ÿ‹ Routes

Image description We write the business logic and export the express router and thereafter mount it in the main entry file app.js


๐Ÿ‹ .env

Image description


๐Ÿ‹ app.js
const express = require('express');
const dotenv = require('dotenv');
dotenv.config();
const connectDb = require('./config/db');

const app = express();

connectDb();
const port = process.env.NODE_LOCAL_PORT || 3020;

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.use('/', require('./routes/user'));

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

Now, let's test our app locally by running the following command: npm start Image description

Next, let's stop the server by running Ctrl + C.


Docker file

Image description

The first line is the base image that we want to use.

The WORKDIR command is used to set the working directory for the container.

We copy the package.json file to the current directory. We install our dependencies.

The COPY command copies the contents of the current directory to the Dockerfile's context.

The EXPOSE command is used to expose ports to the outside world.

The CMD directive is used to specify the command that will be run when the image is run.


โš ๏ธ We could actually go ahead to build this image using this Dockerfile by running the build command like docker build -t [name of container] and then run using docker run -p 8082:8082 [image name] ... but it will not connect to the mongodb service. In other to be able to run the two services we need a docker-compose.yml file


Docker compose file

Image description Lastly, we setup our docker-compose.yml for the app and mongo service. This file helps us to build and link our NodeJs app to the mongo image.

Testing

To test we run this command: docker-compose up -d

The -d flag means we are running the container in a detached mode. Image description


To check running containers

Image description

We see the two containers up and running.

Let's go over to our browser Image description


Testing the POST route.

Image description


Lets check our created user using the docker exec command. Check the running container Image description

Enter into the mongo container Image description

Image description


Conclusion

I hope this post was helpful. Check the above link for the source code if you get stuck while following along.


Reference

Traversy Media, Docker with Mongo

ย