DEV Community

Wachira
Wachira

Posted on • Edited on • Originally published at wwachira.hashnode.dev

9 1

How to create a Node App within a Docker container

Setup

Requirements

Before you go through this fun tutorial ensure:

  • You at least have an understanding of javascript and terminal commands.
  • You should know what Docker is and in theory how it works.
  • You have should node and npm installed on your computer. You can do this by typing this in your terminal.
$ node --version && node --version
Enter fullscreen mode Exit fullscreen mode
  • Also, since we talking containers well you need docker installed.
$ docker --version
Enter fullscreen mode Exit fullscreen mode

Create a new project

Create our project folder, where our codebase will be housed

$ mkdir docker_nodejs_app
Enter fullscreen mode Exit fullscreen mode

Let's change the directory to our app folder.

$ cd docker_nodejs_app
Enter fullscreen mode Exit fullscreen mode

Since this is a node project, we need a package.json file to track our project dependencies.

To create one pretty fast type this in your terminal.

$ npm init -y
Enter fullscreen mode Exit fullscreen mode

We will be using express as our default node web framework.

$ npm install express --save # Introduce the save flag to track it in the package.json file
Enter fullscreen mode Exit fullscreen mode
{
  "name": "docker_node_app",
  "version": "1.0.0",
  "description": "nodejs image demo",
  "author": "your name",
  "license": "MIT",
  "main": "app.js",
  "keywords": [],
  "scripts": {
      "start":"node app.js"
  },
  "dependencies": {
    "express": "^4.16.4"
  }
}
Enter fullscreen mode Exit fullscreen mode

Create and run our server

We will create a simple express server. Let's create the file that will hold our server code.

You can use the terminal to create the file

$ touch app.js # Creates the file from the terminal
Enter fullscreen mode Exit fullscreen mode

Or your locally installed code editor.

Let us write our server code.

"use strict"; // Ensures our code is compiled in strict mode

// Lets import our web framework
var express = require("express");

// Initialise our app
const app = express();

// Lets set our port
/**
 * The default port number is `3000`
 * Take note on that as we will come to that.
 */
app.set("port", 3000);

/**
 * To ensure works as it should we will create a
 * simple endpoint to return a json response
 */

// Define our json response
const data = {
  blog_name: "docker_nodejs_app",
  blog_author: "wachira (tesh254)",
  blog_author_twitter: "@wachira_dev"
};

// Define out GET request endpoint
app.get("/", (req, res) => {
  res.status(200).json(data);
});

// Initialize our server
app.listen(app.get("port"), () => {
  console.log(`Server listening on port ${app.get("port")}`);
});

Enter fullscreen mode Exit fullscreen mode

Let's run it, it's a simple server meaning its bug-free.

$ node app.js
Enter fullscreen mode Exit fullscreen mode

You should see the same text on your terminal.

Screenshot 2019-05-22 at 4.07.38 PM.png

Let's test our endpoint on our browser.

Screenshot 2019-05-22 at 5.27.21 PM.png

Finally what the blog is about.....DOCKER

For you to run your server within a container you a couple of things:

  • Dockerfile: defines what goes on in the environment inside your container.
  • docker-compose.yml: Not a must but comes in handy if you plan to add services like a database
  • Dependency file: Contains the packages needed to run your application successfully e.g. package.json file for node or requirements.txt for python.
  • .dockerignore: Not a must but it allows you to exclude files from the context like a .gitignore file allows you to exclude files from your git repository.

Let's create and write our Dockerfile

$ touch Dockerfile
Enter fullscreen mode Exit fullscreen mode

You can copy and paste the configurations to your Dockerfile.

# Define the image we will use and version
# latest just means we need the latest nodejs image available
FROM node:8

# Create an app directory to hold the application code
WORKDIR /usr/docker_nodejs_app/src/app

# Duplicate the dependency file to the container's project root directory.
COPY package*.json ./

# Install app dependencies
RUN npm install

# Bundle app source inside the docker image
COPY . .

# Expose our app port inside the app and 
EXPOSE 3000:3000

# Define commands that will run the app
CMD ["npm", "start"]

Enter fullscreen mode Exit fullscreen mode

Turn to your terminal and build your container.

$ docker build -t docker_nodejs_app .
Enter fullscreen mode Exit fullscreen mode

You should see something like this on your terminal when your build is done.

Screenshot 2019-05-22 at 5.30.55 PM.png

Let's run our app from docker

$ docker run -it docker_nodejs_app
Enter fullscreen mode Exit fullscreen mode

If you did everything in this tutorial right then you should see something similar to the screenshot below.

Screenshot 2019-05-22 at 5.42.09 PM.png

Test it out on a browser, the same results expected.

This tutorial will be a series, this being the first part. The parts will be as follow:

  • Introducing services to our app, spoiler alert, MongoDB.
  • Hosting our docker container on Heroku.
  • Push our repo to the Docker repository.
  • Other commands with Docker that make your experience worthwhile.

Extras

Sentry image

Make it make sense

Make sense of fixing your code with straight-forward application monitoring.

Start debugging →

Top comments (0)

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay