docker 도커를 이용하여 이미지(IMAGE) 생성하기 : NestJS 사용

 안녕하세요. 알렉스 입니다. 이번에는 도커를 이용하여 이미지를 생성하도록 하겠습니다. 도커에서 이미지는 일종의 설계도면이라고 보시면 됩니다. 실질적으로 컨테이너를 만들기 위해서는 이미지가 필요합니다. 따라서 이미지를 어떻게 만드냐에 따라 컨테이너의 성능도 달라질수 있습니다.


사진1) 도커파일 생성(Dockerfile)

일단 도커파일을 생성합니다. 이 도커파일(Dockerfile)은 이미지를 어떤 절차로 실행할지를 알려주는 문서라고 보면 됩니다.


# Base 이미지를 사용합니다. (여기서는 node 16버전을 사용합니다)
FROM node:16
# /Dockerfile
# 작업 폴더를 설정합니다. 도커내의 폴더를 지정합니다.
WORKDIR /app/nestjs

# 해당 package.json 파일을 도커의 /app/nestjs폴더로 옮깁니다.
COPY package.json /app/nestjs
# 해당 package-lock.json 파일을 도커의 /app/nestjs폴더로 옮깁니다.
COPY package-lock.json /app/nestjs

# 'npm install'을 터미널로 실행합니다.
RUN npm install

# 복사하지 않은 모든 것을 도커의 /app/nestjs으로 옮깁니다.
COPY . /app/nestjs

# 'npm run build'을 터미널로 실행합니다.
RUN npm run build

# 도커 내부에 3000포트를 노출 시킵니다.
EXPOSE 3000

# 컨테이너 실행시 'node dist/main'을 터미널로 실행합니다.
CMD [ "node","dist/main" ]


위 코드는 제가 작성한 도커 파일 입니다. 이 상태로 바로 이미지를 생성할수 있습니다. 하지만 각 단계가 어떻게 진행되는지 알아야 하기 때문에 한줄씩 설명 드리도록 하겠습니다 (주석 참고 가능)


- FROM

'FROM'은 docker hub에서 받는 이미지 입니다. 물론 처음부터 이미지를 다 만들수도 있지만 nestjs은 node기반으로 만들어져 있기 때문에 node를 기본 이미지로 받는 것입니다. 물론 다른 언어를 기본 이미지로 사용할수 있습니다.


- WORKDIR

 위 다이렉터리는 오직 도커만이 접근이 가능한 경로 입니다. 직접 접근할수는 없고 도커가 컨테이너를 생성할때 사용하는 디렉토리 입니다.


- COPY

 'COPY'는 Local에 있는 파일이나 폴더를 'WORKDIR'으로 복사하는 작업입니다. 이때 해당 폴더나 파일이 변경되지 않으면 기존 캐시를 이용하여 이미지를 생성합니다.


- RUN

 해당 터미런에서 실행하듯이 도커에서도 동일하게 실행됩니다.


- EXPOSE

 해당 도커에서 Local이 접근 가능한 포트입니다.


- CMD

 이미지는 일종에 도면이기 때문에 실질적으로 앱을 동작하지 않습니다. 하지만 이미지를 이용해서 컨테이너를 만들면 앱은 실행을 해야 합니다. 컨테이너가 생성될때 실행해야 하는 커맨드를 입력하는 곳이 'CMD'입니다.


이제 이미지를 생성해야 합니다. 현재 경로에 있는 Dockerfile을 이요앟여 이미지를 만들겠습니다. 아래 커멘드를 터미널에 입력하여 이미지를 생성합니다.

$ docker build .


사진2) 이미지 생성 완료

사진2를 보면 'Successfully built 913b3b63e3c1'이 있는것을 확인할수 있습니다. 이는 이미지가 성공적으로 생성된 것을 알수 있습니다.


그럼 실제 docker에 있는 이미지 리스트를 출력해서 원하는 이미지가 생성됬는지 확인해 보겠습니다.

$ docker image ls


사진3) 이미지 리스트

사진 3번에서 가장 위쪽에 제가 만든 이미지가 있습니다. 그런데 다른 이미지에는 'REPOSITORY'와 'TAG'가 있어서 구부하기가 쉽습니다. 그래서 방금 생성한 이미지를 지우고 REPOSITORY'와 'TAG'가있는 이미지를 다시 생성하도록 하겠습니다.


$ docker rmi [IMAGE NAME OR ID]


위 사진3에서 지워야 하는 이미지는 ID로 '913b3b63e3c1'입니다. 


사진4) 이미지 삭제

사진4에서 이미지를 삭제후 해당 리스트가 사라진 것을 알수 있습니다. 


위 사진3에서 지워야 하는 이미지는 ID로 '913b3b63e3c1'입니다. 


$ docker build -t [NAME]:[TAG (optional)] .


이미지를 생성할때 NAME은 REPOSITORY를 작성합니다. TAG또한 이미지의 TAG를 말하는데 이는 필수값이 아닙니다. 보통 이미지의 버전을 작성하는데 사용합니다.(예로 들어 1.0.1)


사진5) Name, Tag를 이용하여 이미지 생성

이미지를 생성했는데 REPOSITORY는 'firstimage'이고 TAG는 '1.0.0'으로 만들었습니다. 


사진6) 도커 이미지 리스트

이미지 리스트를 확인할때 방금 생성한 이미지가 존재하는 것을 알수 있습니다.


위 gitHub레파지토리는 아래 링크로 연결된 git repository와 동일합니다.

GitHub: docker_nestjs


다음글 : docker 도커를 이용하여 컨테이너(CONTAINER) 생성하기 : NestJS 사용




댓글

이 블로그의 인기 게시물

DAQ로 전압 측정하기-2

Nest JS URL에 있는 쿼리(Query) 읽기

appendChild를 이용하여
  • 늘리기_JavaScript_2번