개발

Nest JS 프로젝트 배포 자동화 하기 (2) - docker 설치

whiporithm 2023. 10. 30. 07:57

 

 


 

(1) 편 - https://whiporithm.tistory.com/103

(3) 편 - https://whiporithm.tistory.com/107

도커 설치

다음은 ec2에 도커를  설치해보겠다. 나는 아래 공식 사이트를 참고하여 설치했다. (예전에는 이런 툴 설치는 블로그를 자주 검색했는데, 공식 문서가 짱이더라.) 젠킨스처럼 os마다 설치 방식을 안내해주는데, 우분투로 확인해보자.

 

https://docs.docker.com/desktop/install/ubuntu/

 

Install Docker Desktop on Ubuntu

Learn how to install, launch and upgrade Docker Desktop on Ubuntu. This quick guide will cover prerequisites, installation methods, and more.

docs.docker.com

 

 

들어가서 확인해보니 도커를 설치하기전에 수행할 동작들을 안내해주고 있었다. 하라는 대로 하자. (중간에 기존 도커가 있음을 생각해서 없애는 명령어도 있는데, 설치되지 않았다면 없다고 에러가 뜰 것이다. 그냥 넘어가주자.)

 

 

이제 도커를 설치해주면 되는데 3가지의 방법이 있다. (나는 처음에 저게 순서인줄 알았다..)

무엇을 선택해도 상관없으나 나는 1번 방법을 선택했다. (왜냐면 순선줄 알고 1번 부터 했으니)

 

 

설치는 크게 어려운 점 없이, 안내된 대로 스크립트를 따라가면 된다. 마지막에 docker run 명령어의 결과가 정상적으로 동작되면 설치가 완료된 것이다.

 

설치 확인 용도로 만들어진 이미지인듯 하다.

 

도커 파일 작성

프로젝트 이미지를 만들기 위한 도커 파일을 작성해보자. 참고로 나는 아래 링크를 참고했다.

 

https://www.tomray.dev/nestjs-docker-production

 

Ultimate Guide: NestJS Dockerfile For Production [2022]

Learn how to write a Dockerfile that creates a production optimized image using the NodeJS Alpine image and multistage builds.

www.tomray.dev

 

우선 프로젝트 파일 루트에 DockerFile과 .dockerignore 을 만든다.

 

 

# Dockerfile

# Base Image
FROM node:18

# Create app directory
WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

CMD [ "node", "dist/main.js" ]

 

Dockerfile
.dockerignore
node_modules
npm-debug.log
dist

 

 

그리고 위와 같이 작성해준다. 간단히 설명하면 node 환경을 구성하고, 패키지를 복사하고, 빌드시키고 실행시키는 과정이다. 위 링크에 조금 더 상세하게 설명되어 있으니 참고해보자. (.dockerignore 파일은 필요없는 파일이 이미지에 복사되지 않도록 설정해주는 파일이다.)

 

위 도커파일이 잘 동작하는지 한 번 확인해보자. 우선 ec2에 자신의 레포지토리를 클론해온다음, 도커 파일을 실행시켜 보자.  (ec2에 clone이 안될수도 있는데, 개인키가 없어서 일 것이다. 링크 를 참고하여 키를 등록하자. )

 

sudo docker build -t <project-name> .

 

project name 부분에 도커 image의 이름을 작성해주면 된다. 그리고 마지막에 온점(.) 은 path를 나타내는 옵션이니 docker file이 있는 위치에서 위 명령어를 실행시켜주면 된다. 

 

 

난 node-ci-cd 라는 이름으로 이미지를 만들었고, 위와 같이 실행된다.

 

그리고 생성된 이미지는 sudo docker images 로 확인할 수 있다.

 

 

초기에 가져온 hello-world가 보이고, 내가 만든 node-ci-cd가 보인다.

 

이제 이놈을 컨테이너로 실행시켜 보자.

 

sudo docker run -d -p80:3000 <project-name>

 

-d는 백그라운드로 실행하란 말이며, 80번 포트로 열어줘서 컨테이너의 3000번 포트로 포워딩 해준다는 뜻이다. 그리고 project-name에는 만든 도커 이미지의 이름을 작성해주면 된다. (로컬로 접속해보려면 80번 포트 인바운드를 처리해주어야 하니 이를 잊지말자.)

 

내 실행화면에서 --name "cicd-test" 는 실행중인 컨테이너에 별칭을 붙여주기 위해 사용된 옵션으로 중요한건 아니다.

 

그리고 "서버주소:80" 으로 들어가보고 정상적으로 동작하는지 확인할 수 있다. 나는 진입 페이지에 "Hello World!" 를 반환하도록 설정했고, 위와 같이 정상적인 결과를 얻을 수 있었다.

 

 

참고 자료

 

https://velog.io/@wksh229/Jenkins-Node.jsPM2-GitHub%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9E%90%EB%8F%99%EB%B0%B0%ED%8F%AC-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B03

 

Jenkins + Node.js(PM2) + GitHub를 이용한 자동배포 구축하기(3)

지금까진 그냥 깃허브에 푸시하면 젠킨스가 자동으로 작동하도록 하는 과정을 구성했다 이제 실제로 깃허브에서 코드를 pull하고 자동으로 변경된 소스코드로 서버가 작동하도록 만들어 보자

velog.io