# 도커를 이용한 Node.js 어플(Docker with Node.js App)

### 예제 Node.js

{% embed url="<https://nodejs.org/fr/docs/guides/nodejs-docker-webapp>" %}

## Node.js 생성.

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FLzEuTZDMCTBAmAJche4d%2Fimage.png?alt=media\&token=acbb1116-7a8a-4ee5-85b1-0636c3f86090)

npm init : package.json 생성.

```
// package.json
{
  "name": "study_docker",
  "version": "1.0.0",
  "description": "---\r description: intro\r ---",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "express": "4.17.2"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/KimMingeon0625/STUDY_DOCKER.git"
  },
  "author": "Mingeon",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/KimMingeon0625/STUDY_DOCKER/issues"
  },
  "homepage": "https://github.com/KimMingeon0625/STUDY_DOCKER#readme"
}
```

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

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

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

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

## Dokcerfile 생성.

```
// Dockerfile
FROM node:10 // npm이내장된 base Image

RUN npm install

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

위코드로  Docker build 에러 발생.&#x20;

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FHDjmm014ixB8Mg6DphjY%2Fimage.png?alt=media\&token=d87648d5-5d84-4f78-af0f-aa63d7cafbbc)

COPY package.json ./ 을 추가하여 package파일을 복사한다.

```
// Dockerfile
FROM node:10

// npm install 전에 위치
COPY package.json ./

RUN npm install

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

docker build -t mingeon/nodejs ./

다시 또 Error 발생. server.js 가 위치하지 않는 Error

```
// Dockerfile
FROM node:10

// 모든 파일을 docker container ./ 로 Copy
COPY ./ ./

RUN npm install

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

Build 성공 But loaclhost:8080 접속 불가.

## container에 접근하기 위한 설정.

{% hint style="info" %}
local file을 복사한 것과 같이 network도 연결을 해주어야 한다.&#x20;

Port mapping이 필요.
{% endhint %}

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FXeXx4PkzpStutQORUzr8%2Fimage.png?alt=media\&token=fc467d05-ca68-4d1d-8e59-6659ced2bc57)

docker run -p 5000:8080 mingeon/nodejs 를 통해 실행.

![설정한 local port 5000을 통해 접속.](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FdCe3NLDjZAUT16hYVVmV%2Fimage.png?alt=media\&token=e60a3ad2-fd6b-43f2-be48-a6bdd6009ba0)

## Working Directory

{% hint style="info" %}
Woking Directory

이미지안에서 app 소스 코드를 가지고 있을 디렉토리.
{% endhint %}

WorkDir를 설정하지 않는 경우

1. 파일이름이 중복일 경우. (기존 파일이 덮어 씌워진다.)&#x20;
2. 난잡하다.

```
FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

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

재빌드 후 실행.

* docker build -t mingeon/nodejs ./
* docker run -it mingeon/nodejs sh

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2F6qU7jClhHiyzh6liXqqB%2Fimage.png?alt=media\&token=d7909e1e-3755-4716-ac17-ef53834bbcca)

WorkDir 설정을 하는 경우, container 접속시 WorkDir이 첫화면이다.

## 어플리케이션 소스 변경으로 재빌드하는 문제

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FjVaxUB2cQe7tmYStn2YS%2Fimage.png?alt=media\&token=26326612-3a2d-4eb1-8452-529813ba79a0)

## 재빌드 효율적으로 하는 법

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FhAD97a0XzOkGlbbeOVpH%2Fimage.png?alt=media\&token=4baa44b0-962a-44c6-8638-6741be4699bc)

{% hint style="info" %}
npm insatll을 실행 할때 cache를 사용하기 위한 전략.

종속성을 먼저 복사하여 package.json의 변화가 없는 경우,

도커 내부의 캐시를 통해 종속성 다운로드의 중복 피할 수 있다.
{% endhint %}

```
// Dockerfile
FROM node:10

WORKDIR /usr/src/app

COPY package.json ./

RUN npm install

COPY ./ ./

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

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2F6BZAvmq0WZ0Tr4WGqODT%2Fimage.png?alt=media\&token=0423f6a0-bb6c-401e-9df8-2cacbfd59345)

## Docker Volume

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FJxKCqIyyX9Om3L4dcCr6%2Fimage.png?alt=media\&token=c1f95973-bdb1-49c9-8ffc-53cdf56909a2)

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2Fxoio909jjEhp5WxdbI6v%2Fimage.png?alt=media\&token=5734ad34-1a58-4d4c-8360-e3eb40fc0d77)

{% hint style="info" %}
node\_modules = 종속성 다운로드 dir

vscode powerShell 환경 : $(pwd) ->${pwd}
{% endhint %}

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2Fqpe78fRpBfxQ4rjPizfl%2Fimage.png?alt=media\&token=f216cbba-0ee9-44e2-8f04-475b997a08aa)

![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FAfs92I5VYuLm5NbXKip3%2Fimage.png?alt=media\&token=4f17742f-f4b2-4ce3-9d59-880fb3ec6b25)![](https://1025637896-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fxjso2sUUzWlyxxfqqEWu%2Fuploads%2FXnfGaWHwTJ2k5mtZgJLZ%2Fimage.png?alt=media\&token=9af9c419-a545-4d42-bef5-b6744ee6195e)

re-build 없이 매핑된 파일의 변경으로 적용.

-> docker restart를 통해 재실행 해주어야 한다.
