모험가

도커를 이용한 간단한 Node.js 어플 만들기 본문

도커

도커를 이용한 간단한 Node.js 어플 만들기

라리음 2022. 5. 28. 18:58

이 글은 따라하며 배우는 도커와 CI환경을 보며 정리한 글입니다.

 

강의순으로 정리되어 있어서 한번에 만들어지는게 아닌 TroubleShooting 과정이 포함!

한번에 만들고 싶으면 쭉 내용을 훑은 뒤 한번에 적용하면 됨.

 

 

 

 

package.json 만들기

 

 

 

 

터미널을 이용해 만듬

만드는 과정

 

생성 확인

 

 

 

 

 

 

dependencies 추가

빨간 부분

 

 

 

 

 

server.js 파일 생성

 

내용

 

 

 

 

Dokcerfile 생성

설명 : apline에는 npm이 없어서 설치가 불가능

         그래서 node이미지에 npm이 있어서 쓰는 것

         그리고 CMD에서 node, server는 node 명령어를 먼저 써야하므로 넣는 것.

 

 

하지만 에러 : package.json이 없다.

 

 

 

 

 

 

 

Package.json이 없다고 나오는 이유

 

 

 

- 도커파일을 Build를 할 때 Node 베이스 이미지로 임시컨테이너를 생성함

- 임시 컨테이너로 이미지를 만듬. 하지만 그 임시 컨테이너에는 package.json이 Node 이미지 파일 스냅샷에 포함되어 있지 않음.

- 그래서 package.json은 컨테이너 밖에 있는 상황이 됨.

 

 

 

 

 

 

 

So!!  COPY를 이용해서 컨테이너 안으로 넣어줘야 함

 

 

COPY <복사할 파일 경로> <컨테이너내에서 파일이 복사될 경로)

 

ex) COPY package.json ./

 

Dockerfile에 추가

 

 

빌드 생성

무시해도 되는 에러임 생성됨

 

 

빌드 실행

server.js를 못찾음

-> 똑같이 COPY를 이용!!

 

 

 

 

 

대신 ./ ./ 를 이용해서 현재 파일내에 있는 디렉터리를 모두 포함 시킴!

 

 

 

 

 

 

 

 

 

 

 

앞으로 컨테이너를 실행하기 위해 사용 할 명령어

<포트 매핑으로 브라우저의 포트와 컨테이너 안의 포트를 매핑하는 것>

 

 

ex) 브라우저의 포트 : 49160의 경우

 

docker run -p 49160:8080 <이미지 이름>

 

 

 

컨테이너 포트와 로컬 호스트의 포트를 매핑해서 컨테이너의 8080에 들어가는 개념으로 이해!

 

하지만 나는 server is running 이지만 localhost에 접속은 실패.. 2시간동안 찾아봤지만 해결 못해서 넘어가기루..

 

 

 

 

 

 

 

Dockerfile로 돌아와서

 

 

 

 

WORKDIR

- 이미지안에서 어플리케이션 소스 코드를 가지고 있을 디렉토리를 생성하는 것

  그리고 이 디렉토리가 어플리케이션에 working directory가 됨.

 

 

 

 

 

이때 왜 따로 working 디렉토리가 있어야 하나??

 

because  Node이미지의 Root 디렉토리에는 파일들이 있음 그러면

 

 

 

WORKDIR 없이 COPY하게 될 경우

 

1. 원래 파일시스템과 이름이 같아버리면 원래 있었던 파일을 덮어 씀.

그러면 원래 있던 파일이 있어야하는데 없어짐.

 

2. 모든 파일이 한 디렉토리에 들어가 버리니 너무 정리 정돈이 안됨.

 

 

 

==> So 모든 어플리케이션을 위한 소스들은 WORK 디렉토리를 따로 만들어서 보관한다.

 

 

 

 

WORKDIR 생성

 

다시 빌드 !

Working directory 따로 생성됨.

 

 

 

 

docker run -it <이미지 이름> sh

로 쉘 환경에 접근하여 잘 만들어졌는지 확인

 

 

들어가면

 

 

이런식으로 /usr/src/app에 Dockerfile 등 앱에 필요한 파일들이 workdirectory로 있는 것을 확인 가능

cd / 로 원래있던 파일 시스템도 확인이 가능함

 

 

 

 

 

 

 

 

--- 여태까지 소스 파일을 변경할 때 처음부터 빌드해서 도커 이미지를 만듬 -> 컨테이너 생성

생각 해보면 build부터 다시 시작하는 것은 매우 비효율적임!

(소스뿐만 아니라 종속성 파일들도 다시 다운 받기에 너무 지연됨.)

 

 

 

 

그러면 어떻게 효율적으로 소스 변경시 효율적으로 재빌드 하느냐?

 

 

 

 

변경 전

 

 

변경 후

 

 

COPY package.json ./ 을 추가 해줌. (순서도 중요!)

 

이렇게 하면 package.json이 바뀐게 아니므로 npm install이 가동이 안됨.

-> 종속성 파일들은 그대로 두고 copy ./ ./ 으로 소스파일만 변경시켜줌.

 

이러면 package.json   step은 캐시를 이용해서 스킵이 됨!!!

 

 

 

*필자는 npm install오류가 떴는데 해결이 안됨.. 

매번 실습마다 왜 이리 험난한지 모르겠음..

 

 

 

 

 

Docker Volume

 

- COPY 처럼 로컬에서 컨테이너로 복사하는 것이 아닌

  도커 컨테이너에서 로컬에 있는 것들을 Mapping(참조)를 해서 가져오는것!!  (방향이 반대임)

 

 

 

 

Volume 사용해서 어플리케이션 실행하는 법

 

=> docker run -p 5000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app <이미지 아이디>

 

 

 

 

설명

 

-v /usr/src/app/node_modules 

- 호스트 디렉토리에 node_module은 없기에 컨테이너에 맵핑을 하지 말라고 하는 것

 

 

-v %cd%:/usr/src/app

- pwd 경로에 있는 디렉토리 혹은 파일을 /usr/src/app 경로에서 참조