formulous

주니어 개발자의 개발 지식 공유 블로그입니다.

Docker

[Docker] Nestjs 프로젝트를 Docker Image로 배포 해봅시다.

formulous 2023. 1. 4. 13:02

안녕하세요.

 

이번 업무에서 회사 내의 프로젝트를 Docker 이미지화하라는 지시를 받게 되었는데요.

 

이번에도 역시 왜 이러한 업무를 진행하는 것인지, 방법은 무엇인지 먼저 알아보고 업무를 진행해야겠죠?

 

그래서 오늘은 프로젝트를 Docker 이미지화 하여 배포하는 방법에 대해서 알아보겠습니다.

 

 

먼저 이미지화 작업은 왜 하는걸까요?

 

Docker 이미지로 프로젝트를 배포했을 때는 많은 장점이 있는데요.

 

그중 가장 중요한 점은 바로 '생산성'입니다.

 

기존 배포된 프로젝트를 가져와서 실행할 때 여러 가지 환경 세팅에 막혀보신 적 있으신가요?

 

Docker로 이미지화된 프로젝트 안에는 그 프로젝트를 실행하기 위한 내부 환경이 모두 구성되어 있습니다.

 

그리고 Docker가 설치된 서버에 Docker로 빌드된 이미지만 Pull 받아 그 이미지로 하여금 컨테이너를 생성하게 되면 해당 컨테이너에선 프로젝트를 바로 사용할 수 있게 되는 거죠.

 

또한, github actions, asw pipeline 등을 사용하여 모든 배포 단계를 자동화시킬 수도 있습니다.

 

이를 통해 사용자는 프로젝트 사용에 있어서 환경 세팅이 불필요해지고, 개발자는 복잡한 배포 작업에서 벗어나 업무 만족도를 높일 수 있게 됩니다.

 

 

 

그럼 프로젝트를 Docker화 하는 방법을 알아볼까요?

 

먼저 Docker 이미지화를 진행하고 싶은 본인 프로젝트 root 경로에 "Dockerfile"을 생성합니다.

(첫 글자를 대문자로 해주셔야 합니다. vscode를 사용 중이 시라면 Docker 아이콘이 파일 앞에 생깁니다.)

 

해당 Dockerfile에 프로젝트 Image화를 진행하기 위한 스크립트를 작성해 줄 건데요.

 

Docker 파일 내용에는 본인 프로젝트를 도커 이미지화할 수 있는 스크립트가 포함되게 됩니다.

 

간단하게 스크립트를 작성해보고 그 스크립트에 대한 설명을 하자면 아래와 같습니다.

 

 

이렇게 Dockerfile 생성을 완료했다면, 프로젝트를 이미지화 할 때 본인이 원하지 않은 파일까지 이미지화되는 것을 방지하기 위해 ".dockerignore" 파일도 생성해 줍니다.

 

 

.dockerignore 파일의 사용법은 gitignore 파일을 작성할 때와 똑같은데요.

 

간단하게 보여드리자면 아래와 같습니다.

 

 

프로젝트를 구성하는데 필요하지 않은 git, Dockerfile, dist 파일을 dockerignore에 등록해 주었습니다.

 

node_modules 역시 Dockerfile에 RUN npm install 명령어를 입력하여 자동 설치하게 해 두었기 때문에 이미지에 포함시키지 않습니다.

 

이렇게 Dockerfile과 .dockerignore 파일을 구성한 이후 아래 명령어를 실행합니다.

 

docker build . -t [프로젝트 이름]

 

그럼 본인의 프로젝트가 이미지로 빌드되는 화면을 볼 수 있는데요.

 

docker images

 

위 명령어로 본인의 프로젝트가 이미지로 잘 생성되었는지 확인할 수 있습니다.

 

그 후 본인 프로젝트 이름의 이미지가 잘 생성되었다면 아래 명령어를 입력해 봅시다.

 

docker run -d --name [컨테이너 이름] [프로젝트 이미지 이름]

 

본인 프로젝트로 생성한 이미지를 통해 컨테이너가 만들어지고 실행이 되셨나요??

 

docker ps 명령어로 확인해보시기 바랍니다.

 

docker ps 명령어로 확인했을 때 본인 프로젝트 이미지로 컨테이너가 실행되고 있음이 확인되었다면 성공입니다!

 

여기까지 프로젝트를 docker 이미지로 배포하는 기본 방법을 알아보았습니다.

 

업무로 맡게 된 회사 프로젝트처럼 큰 프로젝트를 이미지화할 때는 좀 더 많은 제약사항이 있을 거예요.

 

그런 본인 프로젝트만의 제약사항들에 대해 해결해나가 보시길 바랍니다.

 

오늘 포스팅을 마치겠습니다.

 

감사합니다.