2020.코딩일지

[Docker]Node.js웹 앱의 도커라이징Dockerizing(컨테이너화) 본문

WebServer&DB&CTI

[Docker]Node.js웹 앱의 도커라이징Dockerizing(컨테이너화)

개발하는라푼젤 2022. 8. 20. 10:57
728x90

Node.js웹 앱의 도커라이징Dockerizing

 

package.json 파일생성(서버이름, start명령어, express ver.)하고 `npm install` -> package-lock.json생성됨

더보기

package.json 

{
  "name": "docker_web_app",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "First Last <first.last@example.com>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.16.1"
  }
}

 

server.js 파일생성(Express프레임워크사용)

더보기
"use strict";

const express = require("express");

// 상수
const PORT = 8080;
const HOST = "0.0.0.0";

// 앱
const app = express();
app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen({ host: "0.0.0.0", port: 8080 }); //여기수정함
console.log(`Running on http://${HOST}:${PORT}`);

 

Dockerfile생성 `touch dockerfile` -> 선호하는 텍스트에디터열어서 수정ㅋ

 (node16버전으로이미지만들꺼고, 앱디렉토리만들어서 앱코드넣을꺼야, package.json참고해~, docker데몬에 맵핑)

더보기

Dockerfile

# 어떤 이미지를 사용해서 빌드할 것인가? docker Hub에 node최신16버전사용할거예용
FROM node:16

# 앱 디렉터리 생성(이미지안에 앱코드를 넣기위해)
WORKDIR /usr/src/app

# 앱 의존성 설치
# 가능한 경우(npm@5+) package.json과 package-lock.json을 모두 복사하기 위해
# 와일드카드를 사용
COPY package*.json ./

RUN npm install
# 프로덕션을 위한 코드를 빌드하는 경우
# RUN npm ci --only=production
#npm ci커맨드는 프로덕션 환경을 위한 더 빠르고,신뢰할 수 있고, 재현 가능한 빌드를 제공한다.

# 앱 소스 추가 (작업디렉터리 전체를 복사하는게아닌, package.json파일만 복사)<-캐시된 docker레이어의 장점활용하기위함
COPY . .

#8080포트에 바인딩되어있는걸 EXPOSE지시어로 docker데몬에 맵핑
EXPOSE 8080
CMD [ "node", "server.js" ]
#런타임 정의는 CMD로.

 

.dockerignore파일생성 (dockerfile과 같은 위치에)

 (docker이미지에 로컬모듈과 디버깅로그를 복사하는것을 막아서 이미지 내에서 설치한 모듈을 덮어쓰지 않게 하는 작업)

더보기

.dockerignore

node_modules
npm-debug.log

 

🏗이미지빌드

dockerfile이 있는 디렉터리위치로가서 `docker build . -t <your username>/node-web-app`

(-t 옵션으로 태그를 추가해서 `docker images`에서 쉽게 찾을수있게하려고)

 

🕌이미지실행

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

(-p 옵션은 공개 포트를 컨테이너 내의 비공개 포트로 리다이렉트 해줌)

(-d 옵션은 백그라운드에서 컨테이너가 돌아가도록 한다.)

 

`docker ps` 컨테이너 아이디 확인

`docker logs <container id>` 앱로그출력 -> Running on 0.0.0.0:8080서버돌고있는내용확인가능

`docker exec -it <container id> /bin/bash` 해당컨테이너안에 들어가기(exec명령어사용)

`curl -i localhost:49160` 또는 크롬켜서 확인가능

 

Comments