Hello there, This post is a continuation of my docker article. To check click the links. Docker in and out Dockerize NodeJs app 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
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
Pull node image
Pull the mongo image
Check the docker images
docker image ls
Folder structure
Here's our folder structure in its most basic architecture.
Code breakdown
๐ Database setup
In this config folder, we imported the mongoose module, connected to our database and exported the configuration.
โ ๏ธ Note:
- The
docker-node-mongo
can be named anything - Notice the
mongo
:27017/docker-node-mongo, this replaces thelocalhost
we use in our development mode.
๐ Model and Schema
Here we import the mongoose library and create a new schema for the user.
๐ Routes
We write the business logic and export the express router and thereafter mount it in the main entry file app.js
๐ .env
๐ 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
Next, let's stop the server by running Ctrl + C
.
Docker file
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 usingdocker 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 adocker-compose.yml
file
Docker compose file
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.
To check running containers
We see the two containers up and running.
Let's go over to our browser
Testing the POST route.
Lets check our created user using the docker exec
command.
Check the running container
Enter into the mongo container
Conclusion
I hope this post was helpful. Check the above link for the source code if you get stuck while following along.