Deploy Node.js App Menggunakan Docker & Nginx

Requirements

  • Node.js app
  • Docker & docker-compose

Steps

  1. Aplikasi node.js yang digunakan ada pada repo berikut
  2. Buat docker image dari aplikasi node.js, kemudian buat container dari image aplikasi node.js (dapat menggunakan docker-compose atau langsung dengan Dockerfile)

isi Dockerfile:

FROM node:12.18.4-alpine3.11
  
WORKDIR /usr/app
  
COPY package.json ./
RUN npm install
  
COPY ./ ./
  
RUN apk add --no-cache bash
  
EXPOSE 3000
  
CMD ["node", "server.js"]

selanjutnya proses build image dan membuat container

build image dari Dockerfile dengan nama image my-nodejs:1
docker build . -t my-nodejs:1
membuat docker container
docker create --name simple-node -p 3000:3000 my-nodejs:1
menjalankan docker container
docker start simple-node

jika menggunakan docker-compose

# menjalankan docker-compose
docker-compose up -d
# jika file tidak bernama docker-compose.yml maka bisa menggunakan perintah -f
docker-compose -f nama-docker-compose.yml up -d
# untuk menghapus container
docker-compose down

scale aplikasi dapat dilakukan di docker-compose

docker-compose sclae nama-cotainers=2
  1. Webserver yang digunakan adalah nginx jadi kita melakukan reverse proxy melalui nginx lalu ke aplikasi node-js kita

default.conf nginx untuk reverse proxy ke aplikasi node.js

server{
    listen 80 default_server;

    location / {
        proxy_pass          http://web_app:3000; #pass to web_app:3000
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto http;
        proxy_set_header    Host    $http_host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";
    }

}

docker-compose.yml

version: "3.7"

services:
  web_app:
    image: my-nodejs:3 
    restart: unless-stopped

  nginx:
    image: nginx:1.19.2-alpine
    restart: unless-stopped
    container_name: nginx
    depends_on:
      - web_app
    ports:
      - 9000:80
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf