What is Docker?

Docker is a set of tools that helps to achieve OS level virtualization. Using docker, we can run multiple instances of the same application by making use of containers. Each containers has its own set of dependencies and base image and the required files defined using a definition file called dockerfile.

Simply, think of it as ships that transfer containers to different regions through sea. Take the sea as your server or your system OS, the ships as the cluster of containers, each of the ships have a number of containers that it is transferring and is protected from floating freely in the sea using the ship. Each of the containers will have a number of contents which could be similar in behavior. Similarly, in the software world as well, each of the containers have its own environment and purpose which is separated virtually from the OS and at the same time the OS act as the baseline for running the Sevices and providing a base platform with resources as we define.

Why not Virtual Machine?

The main drawback of Virtual Machine is that it could get heave and could eat a lot resources. It is installing a different OS inside and OS for which we have to allocate set of large memory and other resources. The install OS inside another OS and use it as base of running all the services while containers use the host OS as base service provider and runs in it which result in reduced resource usage and light weight process.

Let’s Start

A dockerfile defines what are the dependencies, base image and other configurations used to build a container. So the main concept in simple is to define the dependencies, what ports need to be opened to public, how to run the process/application when the container starts up. Below is the DOckerfiel definition that I use for a simple NodeJS express application

FROM node:10.22.1-alpine


WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY ./src ./src

RUN npm run build

EXPOSE 3001

CMD [ "node", "server.js" ]

Explanation

FROM node:10.22.1-alpine

This line defines what base image to be used. You can find various base images in https://hub.docker.com/. Try to use the lightest image to reduce the size and overhead of your container.

WORKDIR /usr/src/app

Setting the working directory for which the commands we’re running to be executed

COPY package*.json ./

Copy package.json and package-lock.json to the working directory.

RUN npm install

Installing dependencies from package.json for the application

COPY ./src ./src

Copying your source code into your container

RUN npm run build

Building the NodeJS application in container

EXPOSE 3001

This tells the container that port 3002 has to be open to public since my application uses port 3002 to deliver the content/API

CMD [ "node", "server.js" ]

CMD is to run a command-line instruction. Here it tells the container to run node server.js once all the setup is complete.