관리 메뉴

피터의 개발이야기

[docker] Docker에서 node.js 서버 실행방법(docker run, dockerfile, docker-compose) 본문

DevOps/Docker

[docker] Docker에서 node.js 서버 실행방법(docker run, dockerfile, docker-compose)

기록하는 백앤드개발자 2024. 2. 22. 00:01
반응형

ㅁ 들어가며

ㅇ 테스트를 위해 샘플 API를 node.js로 띄워야 한다.

ㅇ 서버를 실행하는 방법을 3가지로 정리하였다.

  - docker run : docker run 명령어를 통해 생성

  - dockerfile : 기본 이미지에 install까지 마친 이미지를 생성하여 docker run을 수행

  - docker-compose:  베이스 이미지에서 install과 run 명령어를 정의하고 up down으로 리소스 관리 효율적

 

ㅇ 서버 소스를 다운받고 가장 기본적인 docker run을 이용하는 방법에 대해서 알아보자.

 

ㅁ 서버 소스 다운로드

# git 소스다운로드
$ git clone https://github.com/peterica/flutter_tutorial.git

# 소스 폴더로 이동
$ cd ./flutter_tutorial/calendar_scheduler_server

 

 

ㅁ docker run

# docker 컨테이너 실행
$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node:19-alpine
5baa3c65e42cab9b429b3269f9bf480a4bfac0b0f7803e80feeb1624984de57e  <== 컨테이너 아이디 출력됨

# 기동확인
 docker ps
CONTAINER ID   IMAGE                                COMMAND                   CREATED              STATUS              PORTS                    NAMES
5baa3c65e42c   node:19-alpine                       "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:3000->3000/tcp   node_test

# 컨테이너 접속
$ docker exec -it node_test sh

# work dir 이동
$ cd home/node/

# npm 설치
$ npm install

up to date, audited 739 packages in 5s

82 packages are looking for funding
  run `npm fund` for details

26 vulnerabilities (12 moderate, 8 high, 6 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
npm notice
npm notice New major version of npm available! 9.6.3 -> 10.4.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.4.0
npm notice Run npm install -g npm@10.4.0 to update!
npm notice

# npm 기동
$ npm run start:dev

> server@0.0.1 start:dev
> nest start --watch
[2:52:13 AM] Starting compilation in watch mode...

[2:52:19 AM] Found 0 errors. Watching for file changes.

[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [NestFactory] Starting Nest application...
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [InstanceLoader] AppModule dependencies initialized +27ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [InstanceLoader] ScheduleModule dependencies initialized +0ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RoutesResolver] AppController {/}: +205ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RouterExplorer] Mapped {/, GET} route +3ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RoutesResolver] ScheduleController {/schedule}: +0ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RouterExplorer] Mapped {/schedule, GET} route +1ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RouterExplorer] Mapped {/schedule, POST} route +1ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [RouterExplorer] Mapped {/schedule, DELETE} route +1ms
[Nest] 57  - 02/22/2024, 2:52:21 AM     LOG [NestApplication] Nest application successfully started +2ms

 

ㅇ 위의 과정은 표면적으로 기동하는 과정을 보기 위해서 개별적으로 실행한 것이다.

 

# docker 삭제
$ docker rm node_test
node_test

# docker 실행
$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node:19-alpine
1d83287d6d342fbdef8ef96589ebcefa08d702b9d9b4e15a1fd834f6a19d7d79

# docker 백그라운드 설치 및 노드 서버 기동
$ docker exec -it -d  node_test \
  sh -c "cd /home/node && npm install &&  npm run start:dev"
  
# docker 로그 확인
$ docker logs node_test
Welcome to Node.js v19.9.0.
Type ".help" for more information.

# 접속 테스트
$ curl localhost:3000
Hello World!%

 

ㅇ 소결

 docker run은 명령어를 정확히 알아야 하지만, 할 때마다 헷갈리고 트러뷸 슈팅이 필요하다. 그래서 재사용 시 명령어를 따로 기록해 둬야할 필요가 있다. 리소스를 제거 후 다시 사용할 때는 install 소요시간이 매번 필요하다.

  

  Dockerfile을 이용해 install된 상태에서 docker run 시 시작 커멘드까지 정의해 보자.

 

ㅁ Dockerfile 작성

# 베이스 이미지
FROM node:19-alpine

# 컨테이너 워딩 디렉토리
WORKDIR /home/node

# install을 위한 패키지 정보 복사
COPY package*.json ./

# 도커 서버가 실행할 커멘드 추가
RUN npm install --silent

# 실행 파일들 복사
COPY . .

# 컨테이너 구동 시 node 기동문
CMD [ "npm", "run", "start:dev" ]

# host 연동 port 지정
EXPOSE 3000

 

 

ㅁ Docker 이미지 빌드

# docker 이미지 빌드
$ docker build -t node_test .
[+] Building 38.9s (10/10) FINISHED                                                               docker:desktop-linux
 => [internal] load .dockerignore                                                                                 0.0s
 => => transferring context: 2B                                                                                   0.0s
 => [internal] load build definition from Dockerfile                                                              0.0s
 => => transferring dockerfile: 509B                                                                              0.0s
 => [internal] load metadata for docker.io/library/node:19-alpine                                                 0.0s
 => CACHED [1/5] FROM docker.io/library/node:19-alpine                                                            0.0s
 => [internal] load build context                                                                                 6.4s
 => => transferring context: 239.54MB                                                                             6.4s
 => [2/5] WORKDIR /home/node                                                                                      0.0s
 => [3/5] COPY package*.json ./                                                                                   0.6s
 => [4/5] RUN npm install --silent                                                                               23.1s
 => [5/5] COPY . .                                                                                                5.1s
 => exporting to image                                                                                            3.6s
 => => exporting layers                                                                                           3.6s
 => => writing image sha256:d5f4d2db21432701dfec5014febab9c070f14911b31c46dee14f79dc76abbcf9                      0.0s
 => => naming to docker.io/library/node_test                                                                      0.0s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/bcnc1xcro7yg3fjgyienpls47

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview

 

 

ㅁ Docker 실행

$ docker run -it -d -p 3000:3000 -v ./:/home/node --name=node_test node_test
a5a9522da206b801ed956ba857e96fedee3c450af0b6b020b27ab7b01b44c167

$ 접속 테스트
$ curl localhost:3000
Hello World!%

 

 

 ㅇ 소결

 이미지를 미리 만들어 install 시간을 줄일 수 있었다. 하지만 어찌 되었든 run 명령어가 필요하다.

 

 명령어를 쓸 필요 없이 docker-compose에 다 정의하여 단순하게 up down으로 리소스를 관리해 보자.

 

docker-compose 작성 

# docker-compose 확인
$ cat docker-compose.yml
version: "1.0"

services:
  dev:
    container_name: node_test
    image: node:19-alpine
    command:
      - /bin/sh
      - -c
      - |
        cd /home/node
        npm install --silent
        npm run start:dev
    ports:
      - "3000:3000"
    volumes:
      - ./:/home/node

 

 

ㅁ docker-compose up  실행

$ docker-compose up
[+] Running 1/0
 ✔ Container node_test  Created                                                                                                                                                                                                                                          0.0s
Attaching to node_test
node_test  |
node_test  | > server@0.0.1 start:dev
node_test  | > nest start --watch
node_test  |
node_test  |
[2:35:21 AM] Starting compilation in watch mode...
node_test  |
node_test  | [2:35:27 AM] Found 0 errors. Watching for file changes.
node_test  |
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [NestFactory] Starting Nest application...
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [InstanceLoader] AppModule dependencies initialized +30ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [InstanceLoader] ScheduleModule dependencies initialized +0ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RoutesResolver] AppController {/}: +214ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RouterExplorer] Mapped {/, GET} route +3ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RoutesResolver] ScheduleController {/schedule}: +0ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RouterExplorer] Mapped {/schedule, GET} route +2ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RouterExplorer] Mapped {/schedule, POST} route +1ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [RouterExplorer] Mapped {/schedule, DELETE} route +1ms
node_test  | [Nest] 41  - 02/22/2024, 2:35:29 AM     LOG [NestApplication] Nest application successfully started +3ms
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 1/1
 ✔ Container node_test  Stopped                                                                                                                                                                                                                                         10.1s
node_test exited with code 0
canceled

ㅇ docker-compose 실행 시

    - 로그 바로 확인 가능하다.

    - 프로세스를 종료하면 docker컨테이너도 종료한다.

 

ㅁ docker-compose up 백그라운드 실행 및 종료

# 백그라운드 실행
$ docker-compose up -d
[+] Running 2/2
 ✔ Network calendar_scheduler_server_default  Created                                                                                                                                                                                                                    0.0s
 ✔ Container node_test                        Started
 
 
# 서버기동 테스트
$ curl localhost:3000
Hello World!%


# 실행 종료
$ docker-compose down
[+] Running 2/2
 ✔ Container node_test                        Removed                                                                                                                                                                                                                   10.1s
 ✔ Network calendar_scheduler_server_default  Removed

 

ㅇ 종료 시 container도 함께 제거되어서 리소스 정리가 따로 필요하지 않다.

 

ㅁ 함께 보면 좋은 사이트

[flutter] 일정 관리 앱 - 서버와 연동하기 
   ㄴ 이 글을 쓰다가 지금의 글을 작성하게 됨. 

반응형
Comments