Viblo Code
+2

Node.js in Containers Using Docker

Chào các bạn, ở bài viết hôm nay mình sẽ hướng dẫn các bạn cách build một ứng dụng Node.js sử dụng Docker Container.

Đầu tiên mình sẽ hướng dẫn các bạn tạo một ứng dụng Node.js đơn giản, sau đó chúng ta sẽ build một Docker image cho ứng dụng này, cuối cùng là chạy image vừa build trên container.

Như các bạn đã biết (có thể một số bạn chưa biết) thì Docker cho phép chúng ta đóng gói các ứng dụng kèm với các dependencies vào một container. Hiểu đơn giản thì một container là một phiên bản basic của hệ điều hành Linux, còn image là phần mềm mà bạn có thể load vào container.

1. Tạo Node.js app

Đầu tiên, mình sẽ tạo một thư mục có tên là docker_demo , trong thư mục này mình tạo file package.json có nội dung như sau:

{
  "name": "docker_web_app_demo",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "your_name <[email protected]>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.13.3"
  }
}

Tiếp theo mình sẽ tạo file server.js và tạo một web app đơn giản sử dụng Express.js framework.

'use strict';

const express = require('express');
const PORT = 8080;
const HOST = '0.0.0.0';

const app = express();
app.get('/', function (req, res) {
  res.send('Node.js on Docker');
});

app.listen(PORT, HOST);
console.log('Running on http://' + HOST + ':' + PORT);

2. Tạo file Dockerfile

Tiếp theo chúng ta cần build một Docker image, mình sẽ tạo file Dockerfile

touch Dockerfile

Đầu tiên là định nghĩa image mà chúng ta build từ đâu, các bạn tham khảo trên này nhé

FROM node:boron

Tiếp đến, tạo một thư mục để chứa code bên trong image.

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

Bước tiếp theo ta cần cài đặt các dependencis sử dụng trong ứng dụng sử dụng package manager npm.

COPY package.json /usr/src/app/
RUN npm install

Để đưa source vào trong image ta dùng lệnh COPY

COPY . /usr/src/app

Chúng ta sẽ kết nối đến port 8080 vì thế mình sử dụng lệnh EXPOSE để mapping.

EXPOSE 8080

Cuối cùng là định nghĩa lệnh sẽ chạy runtime.

CMD [ "npm", "start" ]

Tới đây, file Dockerfile sẽ như thế này:

FROM node:boron

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
RUN npm install

COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

Tiếp đến chúng ta cần tạo file .dockerignore nằm cùng thư mục với file Dockerfile để ignore những thư mục không cần thiết như node_modules, npm-debug.log… không cho nó vào image Docker.

node_modules
npm-debug.log

3. Build image

Bây giờ chúng ta sẽ build image.

$ docker build -t <your username>/node-web-app-docker .

4. Run image

Các bạn vào thư mục chứa file Dockerfile và chạy lệnh sau để run image.

$ docker run -p 49160:8080 -d <your username>/node-web-app-docker

Kiểm tra xem image của ta đã được run thành công chưa:

$ docker ps

Chúng ta có thể vào trong container bằng cách sử dụng lệnh sau

$ docker exec -it <container id> /bin/bash

5. Test

Để test ứng dụng vừa build, bạn lấy port mà bạn đã map với Docker, ở trên thì Docker đã map port 8080 bên trong container với port 49160 trên máy của mình.

Bây giờ bạn có thể call ứng bằng curl ngon lành rồi 😃

$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 25 Jun 2017 03:53:22 GMT
Connection: keep-alive

Node.js on Docker

Hi vọng bài viết này sẽ giúp ích cho các bạn trong việc build một ứng dụng Node.js đơn giản sử dụng Docker. Chúc các bạn thành công.

Tham khảo

[1] https://www.airpair.com/node.js/posts/getting-started-with-docker-for-the-nodejs-dev [2] http://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html [3] https://nodejs.org/en/docs/guides/nodejs-docker-webapp/ [4] https://webapplog.com/node-docker/


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.