반응형

 

#2, Node.js 앱 만들기

 

 

node.js만들려면

package.json

server.js(index.js도 가능)

두개 파일 이 있어야합니다.

pacakage.json는 프로젝트의 정보와 프로젝트에서 사용 중인 패키지의 의존성을 관리하는 곳. 어떠한 버전이 사용됐는 지 알 수 있음.

 

server.js는 노드.js가 시작될 때 어떤 파일을 먼저 읽을지. 즉 이 파일을 먼저 읽는다.

 

$ npm init

위의 명령어를 사용하면 pacakage.json을 만들 수 있다.

 

> nodejs-docker-app 폴더 만들기

paca..와 serev..를 만들어야합니다.

명령어를 사용해서 더 편하게 만들 수 있다. npm init을 치면 package.js가 만들어진다.

 

 

 

자바스크립트를 편하게 사용하는게 jquery 듯이.

node.js를 편하게 사용할 수 있게하는게 express이다.

 

// package.js 수정
...
"scripts": {
	"strat": "node server.js"
},
"depedencies": {
	"express":"4.17.1"
},
...

위를 추가해주면 시작할 때 server.js를 실행할 수 있다.

 

const express = require('express'); // Express 모듈 불러오기, require 명령어 이용

// Constants
const PORT = 8080;		// Express 서버를 위한 포트 설정
// const HOST = '0.0.0.0'; // Host 설정, 하지만 지금을 필요없다.

// App
const app = express();	// 새로운 Express 앱 생성
// "/"이 경로로 요청이 오면 Hello World를 결과값으로 전달
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT, HOST);
console.log(`Running on ${PORT}`);

 

 

위처럼 server.js를 수정해주면 express 앱을 위의 환경설정 토대로 실행할 수 있습니다. 즉 설정된 포트에서 listen이 실행이 된다.

이렇게해서 기본적인 node.js앱이 완성이 되었다. 다음 시간엔 어떻게 이 앱을 도커환경에서 실행할 수 있을지 보겠다.

 

 

 

#3 Dockerfile 작성하기

Nodejs앱을 도커 환경에서 실행하려면 먼저 이미지를 생서하고 그 이미지를 이용해서 컨테이너를 실행한 후 그 컨테이너 안에서 Nodejs앱을 실행해야 합니다. 그래서 그 이미지를 생성하려면 Dockerfile을 먼저 작성해야 합니다. 그래서 우선 Docker file을 작성해 봅시다.

 

 

 

 

우선 위의 파일에 Dockerfile을 추가하겠습니다. 

 

먼저 뼈대부터 작성하는게 좋습니다 바로 FROM, RUN, CMD입니다.

FROM은 node:10  (node 10버전을 사용할 겁니다)

RUN은 npm install

CMD는 "node", "server.js"

 

FROM node:10

# Create app directory
WORKDIR /usr/src

 

그 후 아래 명령어 입력.

$ docker build ./

 

 

저번에는 alpine 베이스 이미지로 사용했는데 왜 node:10 이미지로 사용했을까

 

npm install을 해야 pakage.js에 있는 dependencies에 있는 걸 본다음에 다운로드 받은 뒤 설치를 시켜준다. NPM 노드 모듈들이 모여있는게 npm Registry다. npm install하면 NPM Registry에서 가져와서 다운로드 후 설치한다.

 

"node" "server"를 사용하는 이유

 노드 웹서버를 작동시키려면 node + 엔트리 파일 이름을 입력해야합니다.

 

이걸 서버에서 보내서 작성하도록 해보겠습니다.

 

 

#4 Package.json 파일이 없다고 나오는 이유

pakage.json이 컨테이너 안에 있지 않고 컨테이너 바깥에 있습니다. 왜냐면 Node 베이스 이미지에 있는 파일 스냅샷이 임시 컨테이너의 하드 디스크로 들어오는 데 Node 베이스 이미지의 파일 스냅샷 안에는 package.json && 다른파일들이 들어 있지 않습니다. 그렇기 때문에 이 컨테이너 안에서 npm install을 했어도 package.js를 찾지를 못한다. 그래서 에러가 나온다.

 

 즉 에러가 발생하는 이유는 npm install 후에 앱에 필요한 종속성을 다운받아 주는데 이 때 이렇게 다운 받을때 먼저 pacakage.json을 보고 그곳에 명시된 종속성들을 다운받아서 설치해줍니다. 하지만 package.json 컨테이너 안에 없기에 찾을 수 없다는 에러가 발생하게 됩니다. (윈도우에서는 되는데 뭐지?)

 이러한 이유 때문에 COPY를 이용해서 package.json을 컨테이너 안으로 복사해주어야합니다.

 

// package.json 로컬에 있는 이 파일을

// 도커 컨테이너의 현재 지정된 장소에 복사해줍니다.

COPY package.json ./

server.js또한 COPY 해줍니다.

 

따라서 다음과 같이 수정합니다.

FROM node:10

// COPY package.json ./ 
COPY ./ ./

RUN npm install

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

 

[아무이름]

$ docker build -t [아무이름] ./

 

$ docker run [아무이름]

 

 

아래가 최종이다.

Running on 8080 이 뜰 것이다.

FROM node:10

COPY ./ ./

RUN npm install
RUN npm install express

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

 

const express = require('express'); // Express 모듈 불러오기, require 명령어 이용

// Constants
const PORT = 8080;		// Express 서버를 위한 포트 설정
//const HOST = '0.0.0.0'; // Host 설정

// App
const app = express();	// 새로운 Express 앱 생성
// "/"이 경로로 요청이 오면 Hello World를 결과값으로 전달
app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(PORT);
console.log(`Running on ${PORT}`);

그럼 Runing on 8080이 뜰 것이다.

 

 

 

하지만 접근이 안된다? 왜지 

 

 

#8 어플리케이션 소스 변경으로 재빌드 시 효율적으로 하는 법

 

 완성본을 보면 npm install을 한 후 전체코드를 다시 복사해줍니다. 

 

 사실 소스코드 부분만 변경했는 데 종속성 부분만 계속 다운받고 있다. 이런 부분도 굉장히 불필요한 부분이다. 이거를 바꾸어 주어야 한다. -> 오른쪽 처럼 하면 된다.

 

 따라서 이 문제를 해결하기 위해서 package .json을 copy 한 다음 이 부분만 npm install 해줍니다. 그럼 만약 소스만 변경하면  npm install을 안한다.

 

 왼쪽 처럼하면 "아 종속성이 변경됐구나"로 판단하고 다시 다운받게 되는데 오른쪽 처럼하면 package.json이 변경이 안됐기 때문에 npm install을 다시 안합니다. (오른쪽 처럼 하면 소스를 변경했음에도 (Using Cache 로그가 뜸) Caching을 이용해서 빠르게 가능)

 

여기까지 최종소스

// server.js 파일
const express = require('express');

const PORT = 8080;

// APP
const app = express();
app.get('/', (req,res) => {
	res.send("반가워요")
});

app.listen(PORT);
console.log("Server is running")

 

 

// package.json
{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "strat": "node server.js"
  },
  "depedencies": {
    "express":"4.17.1"
  },
  "author": "",
  "license": "ISC"
}

 

// Dockerfile
FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install
RUN npm install express

COPY ./ ./

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

 

사용한 명령어

$ docker build -t kss7858/nodejs-test ./
$ docker run kss7858/nodejs-test-latest /bin/sh
반응형

'Docker' 카테고리의 다른 글

도커  (0) 2021.04.05